Автор: Сергей Чубченко. Дата публикации: 06.09.2004
[Введение]
В данной статье я расскажу основные приемы, используемые для распаковки DLL библиотек. Несмотря на большое сходство EXE и DLL, многих начинающих исследователей кода распаковка DLL просто отпугивает, а многим из них кажется, что это вообще невозможно. Как ни странно все делается почти также просто, как и распаковка EXE файлов, правда есть определенные тонкости. Распаковку DLL библиотек мы рассмотрим на примере плагина GenOEP.dll из поставки PEiD’а, так как он наверняка найдется у многих.
[Нам понадобятся]
1. Olly Debugger
2. Lord PE
3. ImpREC
4. PEiD
5. Мозги
[Немного исследования]
Откроем наш плагин в Olly. Нам сразу будет предложено использовать программу loaddll.exe из поставки olly. Чтож, неплохая идея, поэтому отвечаем "Да". Просмотрев то, что находится начиная с точки входа
нетрудно догадаться, что программа запакована UPX’ом, поэтому ищем следующие команды ниже:
как ни странно все стандартно:
Ставим бряк на 10004A08 адрес, дважды щелкнув по строчке байт и запускаем DLL. Да, да, именно запускаем, так как она будет запущена с помощью специальной утилиты Olly, которая как бы эмулирует вызов этой библиотеки из EXE. Брякнулись? Запускаем Lord PE, выбираем в списке процессов loaddll.exe и видим в списке ниже гору библиотек. Найдем среди этого списка нужный нам плагин (genoep.dll), далее щелкаем правой кнопкой и выбираем пункт "Dump full". Теперь мы имеем нормальный дамп Dll’ки, правда пока не работоспособный.
[Восстановление импорта]
Надеюсь, что вы еще не закрыли Olly, так как брякнутый на OEP процесс нам еще понадобится, для получения из него импорта. запускаем ImpREC и выбираем в списке процессов "loaddll.exe". Теперь посмотрите чуть правее. Как вы думаете, для чего нужна кнопка "Pick dll"? Как ни странно именно для выбора DLL. Щелкнем по ней и выберем в полученном списке наш плагин (скорее всего он будет первым в списке) и щелкнем по кнопке "OK".
Теперь осталось только вбить найденный нами OEP (а это как вы помните адрес, по которому jmp’ается прога после восстановления регистров (POPAD)) в строку "OEP". Не забудем вычесть из него значение Image Base (для данной DLL библиотеки оно равно 10000000. Щелкаем по кнопке "IAT AutoSearch". Далее как обычно - жмем "Get Imports" и получаем список функций. Они восстановились нормально, так как мы имеем дело с простым упаковщиком.
Щелкаем по кнопке "Fix Dump", выбираем сдампенную в предыдущем шаге DLL и получаем полноценный рабочий дамп, который можно проверить запустив PEiD и найдя этот плагин в списке плагинов.
[Заключение]
Вот мы с Вами и научились распаковывать DLL. Как видите это не намного сложнее распаковки EXE файлов, но немного поинтереснее. Думаю Вы без труда найдете практическое применение полученным знаниям. Это поможет локализаторам программ на русский язык, которые обычно не русифицируют плагины, так как редакторы ресурсов не могут отобразить запакованные ресурсы программ. Ну и конечно это пригодится для исследования вредоносного кода антивирусным аналитикам, особенно когда код разнесен по нескольким DLL, которые еще к тому же упакованы.
Учимся распаковке DLL библиотек
[Введение]
В данной статье я расскажу основные приемы, используемые для распаковки DLL библиотек. Несмотря на большое сходство EXE и DLL, многих начинающих исследователей кода распаковка DLL просто отпугивает, а многим из них кажется, что это вообще невозможно. Как ни странно все делается почти также просто, как и распаковка EXE файлов, правда есть определенные тонкости. Распаковку DLL библиотек мы рассмотрим на примере плагина GenOEP.dll из поставки PEiD’а, так как он наверняка найдется у многих.
[Нам понадобятся]
1. Olly Debugger
2. Lord PE
3. ImpREC
4. PEiD
5. Мозги
[Немного исследования]
Откроем наш плагин в Olly. Нам сразу будет предложено использовать программу loaddll.exe из поставки olly. Чтож, неплохая идея, поэтому отвечаем "Да". Просмотрев то, что находится начиная с точки входа
10004880 > $ 807C24 08 01 CMP BYTE PTR SS:[ESP+8],1
10004885 . 0F85 7D010000 JNZ GenOEP.10004A08
1000488B . 60 PUSHAD
1000488C . BE 00400010 MOV ESI,GenOEP.10004000
10004891 . 8DBE 00D0FFFF LEA EDI,DWORD PTR DS:[ESI-3000]
10004897 . 57 PUSH EDI
10004898 . 83CD FF OR EBP,FFFFFFFF
1000489B . EB 0D JMP SHORT GenOEP.100048AA
1000489D 90 NOP
1000489E 90 NOP
1000489F 90 NOP
100048A0 > 8A06 MOV AL,BYTE PTR DS:[ESI]
нетрудно догадаться, что программа запакована UPX’ом, поэтому ищем следующие команды ниже:
POPAD
JMP OEP
как ни странно все стандартно:
100049E3 . 74 22 JE SHORT GenOEP.10004A07
100049E5 . 3C EF CMP AL,0EF
100049E7 . 77 11 JA SHORT GenOEP.100049FA
100049E9 > 01C3 ADD EBX,EAX
100049EB . 8B03 MOV EAX,DWORD PTR DS:[EBX]
100049ED . 86C4 XCHG AH,AL
100049EF . C1C0 10 ROL EAX,10
100049F2 . 86C4 XCHG AH,AL
100049F4 . 01F0 ADD EAX,ESI
100049F6 . 8903 MOV DWORD PTR DS:[EBX],EAX
100049F8 .^EB E2 JMP SHORT GenOEP.100049DC
100049FA > 24 0F AND AL,0F
100049FC . C1E0 10 SHL EAX,10
100049FF . 66:8B07 MOV AX,WORD PTR DS:[EDI]
10004A02 . 83C7 02 ADD EDI,2
10004A05 .^EB E2 JMP SHORT GenOEP.100049E9
10004A07 > 61 POPAD
10004A08 >-E9 4ED1FFFF JMP GenOEP.10001B5B ; прыжок на OEP
Ставим бряк на 10004A08 адрес, дважды щелкнув по строчке байт и запускаем DLL. Да, да, именно запускаем, так как она будет запущена с помощью специальной утилиты Olly, которая как бы эмулирует вызов этой библиотеки из EXE. Брякнулись? Запускаем Lord PE, выбираем в списке процессов loaddll.exe и видим в списке ниже гору библиотек. Найдем среди этого списка нужный нам плагин (genoep.dll), далее щелкаем правой кнопкой и выбираем пункт "Dump full". Теперь мы имеем нормальный дамп Dll’ки, правда пока не работоспособный.
[Восстановление импорта]
Надеюсь, что вы еще не закрыли Olly, так как брякнутый на OEP процесс нам еще понадобится, для получения из него импорта. запускаем ImpREC и выбираем в списке процессов "loaddll.exe". Теперь посмотрите чуть правее. Как вы думаете, для чего нужна кнопка "Pick dll"? Как ни странно именно для выбора DLL. Щелкнем по ней и выберем в полученном списке наш плагин (скорее всего он будет первым в списке) и щелкнем по кнопке "OK".
Теперь осталось только вбить найденный нами OEP (а это как вы помните адрес, по которому jmp’ается прога после восстановления регистров (POPAD)) в строку "OEP". Не забудем вычесть из него значение Image Base (для данной DLL библиотеки оно равно 10000000. Щелкаем по кнопке "IAT AutoSearch". Далее как обычно - жмем "Get Imports" и получаем список функций. Они восстановились нормально, так как мы имеем дело с простым упаковщиком.
Щелкаем по кнопке "Fix Dump", выбираем сдампенную в предыдущем шаге DLL и получаем полноценный рабочий дамп, который можно проверить запустив PEiD и найдя этот плагин в списке плагинов.
[Заключение]
Вот мы с Вами и научились распаковывать DLL. Как видите это не намного сложнее распаковки EXE файлов, но немного поинтереснее. Думаю Вы без труда найдете практическое применение полученным знаниям. Это поможет локализаторам программ на русский язык, которые обычно не русифицируют плагины, так как редакторы ресурсов не могут отобразить запакованные ресурсы программ. Ну и конечно это пригодится для исследования вредоносного кода антивирусным аналитикам, особенно когда код разнесен по нескольким DLL, которые еще к тому же упакованы.
Комментарии |
отсутствуют |
Добавление комментария |