2012-06-05 3 views
2

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

Так что мой вопрос: как я могу найти эту функцию, пока не отлаживается? Благодаря

UPDATE

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

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

Благодаря

UPDATE 2

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

ответ

6

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

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

Вы можете просмотреть список в любые сегментах времени, нажав Shift + F7 или нажав кнопку "Сегментов" от View>Open подвидов.

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

UPDATE, чтобы соответствовать вашему второму вопросу

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

  1. Зарегистрировать группу новой памяти или перезаписать память, которой она уже владеет. Обычно это делается путем вызова чего-то вроде malloc или так. [Ваш код выглядит так, как если бы он мог быть языком, зависящим от языка, зависящим от языка ... VB, возможно, или что-то объектно-ориентированное], он в основном сводится к вызову VirtualAlloc или VirtualAllocEx из файла kernel32.dll от Windows, см. 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 для получения дополнительной информации.

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

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

1

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

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

+0

Но я не могу найти последовательность байтов после прекращения отладки, этот код просто исчезает, исчезает: | – Davita

+0

@ Davita: вот почему вам нужно отметить свой адрес и базу модуля, когда вы начинаете отладку. – Necrolis

+0

Прости, я действительно стартер здесь. Не могли бы вы предоставить мне пошаговую инструкцию, если вы не возражаете? :(Еще раз спасибо за вашу помощь – Davita

 Смежные вопросы

  • Нет связанных вопросов^_^