Итак, вы видите код в окне отладчика, когда ваша программа запущена, и, кажется, вы не можете найти те же самые коды операций в необработанном шестнадцатеричном дампе, когда он больше не работает?
Что может вам помочь, так это создание снимка памяти. Приостановите выполнение программы рядом с интересующими вас инструкциями, чтобы убедиться, что они есть, затем выберите «Сделать снимок памяти» в меню «Отладчик». Затем IDA попросит вас скопировать только данные, найденные в сегментах, которые определены как «старшие сегменты» (те, которые загрузчик PE создает из предопределенной таблицы) или «все сегменты», которые в настоящее время принадлежат отлаживаемой программе (< em>включая такие, которые могли быть созданы процедурой распаковки, расшифровщиком и т. д.). Выберите «Все сегменты», и вы должны хорошо видеть содержимое памяти, включая ваши сегменты отладки (сегмент, созданный или распознанный во время отладки) в IDA, когда приложение не отлаживается.
Вы можете просмотреть список сегментов в любое время, нажав Shift+F7 или щелкнув "Сегменты" в разделе Просмотр > Открыть подпредставления. .
Имейте в виду, что программа, которую вы пытаетесь проанализировать, может решить создать сегмент в другом месте при следующей загрузке, чтобы вам было труднее понять, что происходит.
ОБНОВИТЬ, чтобы соответствовать вашему второму вопросу
Когда программа распаковывает откуда-то данные, ей приходится куда-то их копировать. Windows — это виртуальная машина, которая в настоящее время очень неприятна вам, когда вы пытаетесь выполнить или написать код в местах, которые вам не разрешены. Так что любая программа, пока мы под окнами, так или иначе
- Зарегистрируйте группу новой памяти или перезапишите память, которой она уже владеет. Обычно это делается путем вызова чего-то вроде malloc или около того [Ваш код выглядит так, как будто это мог быть язык с очень интенсивным использованием указателей... возможно, VB или что-то объектно-ориентированное] в основном это сводится к вызову VirtualAlloc< /strong> или VirtualAllocEx из ядра Windows kernel32.dll, см. http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx для более подробной информации о соглашение о вызовах.
- Возможно, настройте для этого обработку исключений 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