Что такое раздел отладки в IDA Pro?

Я пытаюсь проанализировать файл dll с моими плохими навыками сборки, поэтому простите меня, если я не смог добиться чего-то очень тривиального. Моя проблема в том, что при отладке приложения я нахожу код, который ищу, только в сеансе отладки, после остановки отладчика адрес исчезает. DLL не выглядит запутанной, так как большая часть кода читабельна. Взгляните на скриншот. Код, который я ищу, находится по адресу 07D1EBBF в разделе debug376. Кстати, где я взял этот раздел debug376?

Итак, мой вопрос: как я могу найти эту функцию без отладки? Спасибо

ОБНОВИТЬ

Хорошо, как я уже сказал, как только я останавливаю отладчик, код исчезает. Я даже не могу найти его через последовательность байтов (но могу в режиме отладки). Когда я запускаю отладчик, код не дизассемблируется сразу, я должен поставить аппаратную точку останова в этом месте, и только когда точка останова сработает, IDA покажет дизассемблированный код. взгляните на этот скриншот. Вы видите интересующую меня строку кода , который не виден, если программа не запущена в режиме отладки. Я не уверен, но я думаю, что это что-то вроде распаковки кода во время выполнения, который не виден во время разработки.

В любом случае, любая помощь будет оценена по достоинству. Я хочу знать, почему этот код скрыт до достижения точки останова (он отображается как «db 8Bh» и т. д.) и как найти этот адрес без отладки, если это возможно. Кстати, это может быть код из другого модуля (dll)?

Спасибо

ОБНОВЛЕНИЕ 2

Я узнал, что debug376 — это сегмент, созданный во время выполнения. Итак, простой вопрос: как я могу узнать, откуда взялся этот сегмент :)


person Davita    schedule 05.06.2012    source источник


Ответы (2)


Итак, вы видите код в окне отладчика, когда ваша программа запущена, и, кажется, вы не можете найти те же самые коды операций в необработанном шестнадцатеричном дампе, когда он больше не работает?

Что может вам помочь, так это создание снимка памяти. Приостановите выполнение программы рядом с интересующими вас инструкциями, чтобы убедиться, что они есть, затем выберите «Сделать снимок памяти» в меню «Отладчик». Затем IDA попросит вас скопировать только данные, найденные в сегментах, которые определены как «старшие сегменты» (те, которые загрузчик PE создает из предопределенной таблицы) или «все сегменты», которые в настоящее время принадлежат отлаживаемой программе (< em>включая такие, которые могли быть созданы процедурой распаковки, расшифровщиком и т. д.). Выберите «Все сегменты», и вы должны хорошо видеть содержимое памяти, включая ваши сегменты отладки (сегмент, созданный или распознанный во время отладки) в IDA, когда приложение не отлаживается.

Вы можете просмотреть список сегментов в любое время, нажав Shift+F7 или щелкнув "Сегменты" в разделе Просмотр > Открыть подпредставления. .

Имейте в виду, что программа, которую вы пытаетесь проанализировать, может решить создать сегмент в другом месте при следующей загрузке, чтобы вам было труднее понять, что происходит.

ОБНОВИТЬ, чтобы соответствовать вашему второму вопросу

Когда программа распаковывает откуда-то данные, ей приходится куда-то их копировать. Windows — это виртуальная машина, которая в настоящее время очень неприятна вам, когда вы пытаетесь выполнить или написать код в местах, которые вам не разрешены. Так что любая программа, пока мы под окнами, так или иначе

  1. Зарегистрируйте группу новой памяти или перезапишите память, которой она уже владеет. Обычно это делается путем вызова чего-то вроде malloc или около того [Ваш код выглядит так, как будто это мог быть язык с очень интенсивным использованием указателей... возможно, VB или что-то объектно-ориентированное] в основном это сводится к вызову VirtualAlloc< /strong> или VirtualAllocEx из ядра Windows kernel32.dll, см. http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx для более подробной информации о соглашение о вызовах.
  2. Возможно, настройте для этого обработку исключений Windows и пометьте диапазон памяти как исполняемый, если это еще не было при вызове VirtualAlloc. Это можно сделать, вызвав VirtualProtect, опять же из kernel32.dll. См. http://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/aa366786(v=vs.85).aspx для получения дополнительной информации об этом.

Итак, теперь вы должны пройти через программу, начиная с ее точки входа по умолчанию (OEP) и искать вызовы одной из этих функций, возможно, с защитой памяти, установленной на PAGE_EXECUTE или потомок. После этого, возможно, будет какой-то цикл, расшифровывающий содержимое памяти, копируя его в новое место. Вы можете просто перешагнуть через него, в зависимости от того, что вас интересует в программе, просто поместив курсор после цикла (обычно толстая синяя линия в IDA) и щелкнув «Выполнить до курсора» в меню, которое появляется при щелчке правой кнопкой мыши ассемблерный код.

Если это не удается, просто попробуйте установить аппаратную точку останова на VirtualAlloc ядра kernel32.dll и посмотрите, не получите ли вы чего-нибудь интересного при переходе к оператору return, чтобы вы оказались там, где цепочка выполнения приведет вас после вызова Alloc или Protect.

person e01f    schedule 13.06.2012

Вам нужно найти относительный виртуальный адрес этого кода, это позволит вам найти его снова независимо от адреса загрузки (довольно удобно почти во всех системах, использующих ASLR в наши дни). RVA обычно рассчитывается как virtual address - base load address = RVA, однако вам также может потребоваться учитывать базу раздела.

Альтернативой является использование инструмента перебазирования IDA для каждый раз перебазирования dll на один и тот же адрес.

person Necrolis    schedule 05.06.2012
comment
Но я не могу найти последовательность байтов после прекращения отладки, этот код просто исчезает, исчезает :| - person Davita; 05.06.2012
comment
@Davita: вот почему вам нужно отметить его адрес и базу модуля, в котором он находится, когда вы начинаете отладку. - person Necrolis; 05.06.2012
comment
Извините, я действительно новичок здесь. Не могли бы вы дать мне пошаговую инструкцию, если вы не возражаете? :( Еще раз большое спасибо за помощь - person Davita; 05.06.2012
comment
@Davita: к сожалению, я использую IDA только для статического анализа потока, так как я предпочитаю использовать ollydbg для отладки (плюс у меня нет приложений x64 для отладки), есть книга по использованию IDA для отладки, которая может помочь. - person Necrolis; 05.06.2012