Набор статей и руководств по дизассемблеру IDA


3. Восстановление IDA.WLL и модулей в их "почти" первоначальное состояние. - часть 2



001B:10001005 C1E002             SHL     EAX,02


001B:10001008 A3E4A10710         MOV     [1007A1E4],EAX


001B:1000100D 8B442408           MOV     EAX,[ESP+08]


001B:10001011 A356A20710         MOV     [1007A256],EAX


001B:10001016 FF148546A20710     CALL    [EAX*4+1007A246]


001B:1000101D 833D56A2071001     CMP     DWORD PTR [1007A256],01


001B:10001024 0F8580000000       JNZ     100010AA


001B:1000102A 803DECA1071000     CMP     BYTE PTR [1007A1EC],00


001B:10001031 7424               JZ      10001057


001B:10001033 E88A850700         CALL    KERNEL32!GetVersion


001B:10001038 BAEDA10710         MOV     EDX,1007A1ED


001B:1000103D 2500000080         AND     EAX,80000000


001B:10001042 7405               JZ      10001049


001B:10001044 BA0DA20710         MOV     EDX,1007A20D


001B:10001049 52                 PUSH    EDX

Именно этот фрагмент является фактической точкой входа в IDA.WLL, она одинакова для всех модулей, и всегда отстоит на 1000h от базового адреса.

Нам нужно целиком сбросить эту DLL из памяти на диск; сначала я попытался сделать это с помощью ProcDump'а, однако этот способ терпит неудачу, когда IDA снова загружает в память сброшенную DLL.  Почему?

Все очень просто.  Для загрузки IDA.WLL в свой адресный контекст ProcDump использует загрузочную библиотеку (огромная ошибка при сбросе защищенных DLL), затем вызывает секцию инициализации по адресу 10001000, распределяет память и сбрасывает образ памяти на диск.  Но при распределении памяти секция инициализации устанавливает некоторые флаги, которые при сбросе сохраняются.  Если IDA затем загрузит эту сброшенную DLL, то флаги уже окажутся установленными, что и выявляется системой защиты.  Основные флаги располагаются в секции данных и тестируются процедурой инициализации DLL.

Следовательно, нам необходимо сбросить DLL до начала работы процедуры инициализации.  Для этого нам понадобится IceDump.

Установим контрольную точку по адресу 1b:10001000, загрузим IDA, и дождемся ее второго срабатывания (первый раз она сработает по команде ret во время дешифровки), когда Вы вновь придете к тому же самому адресу, но в этот момент DLL окажется загруженной, память распределенной, однако флаги еще не будут установлены.

ProcDump сообщит о IDA.WLL следующее:
базовый  адрес образа - 10000000
длина - ac000

Теперь воспользуемся IceDump и выполним команду 'd 10000000 ac000 "Ваша директория, что-нибудь типа \??\temp\ida.dmp"'

Вы получите файл IDA.TMP, содержащий все расшифрованные секции, но с заголовком, который еще требуется восстановить.  Сделаем это с помощью автоматической процедуры ProcDump'а.  Также с помощью ProcDump'а измените адрес точки входа на 10001000, и все заработает.

Не забудьте исправить IDA.WLL таким образом, чтобы 'CALL 10013298' никогда не возвращал 0 в EAX.  Постарайтесь найти нужные смещения сами!  А вот что я сам сделал в IDA.WLL.

0008:10013298 83C4E8             ADD     ESP,-18




Начало  Назад  Вперед