Итак, вы видите код в окне отладчика, как только ваша программа запущена, и, как вам кажется, не найти верных же кодов операций в необработанном шестнадцатеричном дампе после того, как он больше не работает?
Что может помочь вам принять Снимок памяти. Приостановите выполнение программы рядом с инструкциями, которые вас интересуют, чтобы убедиться, что они есть, затем выберите «Снять снимок памяти» из меню «Отладчик». Затем IDA попросит вас скопировать только данные, найденные в сегментах, которые определены как «сегменты loder» (те, которые PE-загрузчик создает из предопределенной таблицы) или «все сегменты», которые, как представляется, в настоящее время принадлежат к отлаженной программе (в том числе, которые могли быть созданы с помощью процедуры распаковки, дешифратора, что бы то ни было). Пойдите для «Все сегменты», и вы должны хорошо видеть содержимое памяти, включая сегменты отладки (сегмент , созданный или распознанный при отладке) в IDA, когда не отлаживается приложение.
Вы можете просмотреть список в любые сегментах времени, нажав Shift + F7 или нажав кнопку "Сегментов" от View>Open подвидов.
Имейте в виду, что программа, которую вы пытаетесь проанализировать, может решить создать сегмент в другом месте при следующей загрузке, чтобы затруднить вам понимание того, что происходит.
UPDATE, чтобы соответствовать вашему второму вопросу
Когда программа распаковки данных где-то, что придется копировать вещи куда-нибудь. Windows - это виртуальная машина, которая в настоящее время становится противной вам при попытке выполнить или написать код в тех местах, где вам не разрешено. Так что любая программа, если мы под окнами, будет как-то
- Зарегистрировать группу новой памяти или перезаписать память, которой она уже владеет. Обычно это делается путем вызова чего-то вроде malloc или так. [Ваш код выглядит так, как если бы он мог быть языком, зависящим от языка, зависящим от языка ... VB, возможно, или что-то объектно-ориентированное], он в основном сводится к вызову VirtualAlloc или VirtualAllocEx из файла kernel32.dll от Windows, см. 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 для получения дополнительной информации.
Так что теперь, вы должны сделать шаг корыту программки, начиная с его по умолчанию Entrypoint (ОЭП) и искать вызовы Тхо одной из этих функций, возможно, с защитой памяти, установленной в PAGE_EXECUTE или потомком. После этого, возможно, придет какой-то цикл, который расшифровывает содержимое памяти, копируя их в новое место. Возможно, вам захочется просто перешагнуть через него, в зависимости от того, какой интерес вы проявляете к программе, просто поместив курсор после цикла (толстая синяя линия в IDA обычно) и нажав «Run to Cursor» в меню, которое появляется при щелчке правой кнопкой мыши код ассемблера.
Если это не удается, просто попробуйте помещать аппаратную точку останова на VirtualAlloc ядра3232.dll и посмотреть, получаете ли вы что-нибудь интересное при входе в оператор return, чтобы вы оказались там, где цепочка выполнения приведет вас после вызова Alloc или Protect.
Но я не могу найти последовательность байтов после прекращения отладки, этот код просто исчезает, исчезает: | – Davita
@ Davita: вот почему вам нужно отметить свой адрес и базу модуля, когда вы начинаете отладку. – Necrolis
Прости, я действительно стартер здесь. Не могли бы вы предоставить мне пошаговую инструкцию, если вы не возражаете? :(Еще раз спасибо за вашу помощь – Davita