Простые случаи дампинга
Представим себе, что распаковщик уже отработал, мы стоим в оригинальной точке входа (OEP) и готовы сохранить образ файла (file image) на диск, то есть сбросить дамп. Отладчик soft-ice не предоставляет такой возможности, поэтому приходится действовать обходным путем.. Но для начала необходимо выяснить от "сих" и до "сих" сохранять. При условии, что защита не предпринимает никаких враждебных действий, нужная информация может быть добыта командами "MOD"
и "MAP32" (см.рис. 1 и листинг 1).
Рисунок 1 определение региона памяти для снятия дампа
:MOD test_dump # определяем базовый адрес загрузки модуля в память
hMod Base PEHeader Module Name File Name
00400000 004000D0 test_dum \TEMP\test_dump.exe
:MAP32 test_dump # смотрим на карту модуля в памяти
Owner Obj Name Obj# Address Size Type
test_dump .text 0001 001B:00401000 00003B46 CODE RO
test_dump .rdata 0002 0023:00405000 0000080E IDATA RO
test_dump .data 0003 0023:00406000 00001DE8 IDATA RW
Листинг 1 определение дислокации модуля в памяти, здесь "test_dump" — имя процесса, с которого мы собираемся снять дамп (soft-ice отображает его в правом нижнем углу)
Базовый адрес загрузки (hMod base) располагается по адресу 400000h. Последняя секция (".data") начинается с адреса 406000h и продолжается вплоть до адреса (406000h+1DE8h) == 407DE8h. Таким образом, нам необходимо сохранить 7DE8h байт памяти, начиная с 400000h. Но в soft-ice такой команды нет! Зато есть "история команд". Даем команду "DB 400000 L 7DE8", выходим из отладчика, запускаем "symbol loader" и говорим "file à save soft-ice history as" (при этом размер самой истории должен быть предварительно увеличен хотя бы до 30 МБайт: edit à soft-ice initialization setting à history buffer size).
В результате образуется текстовый файл (см. листинг 2), который необходимо преобразовать в exe, для чего потребуется написать специальную утилиту или поискать уже готовую.
:db 400000 L 7DE8
010:00400000 4D 5A 90 00 03 00 00 00-04 00 00 00 FF FF 00 00 MZР.............
010:00400010 B8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00 ........@.......
010:00400040 0E 1F BA 0E 00 B4 09 CD-21 B8 01 4C CD 21 54 68 ........!..L.!Th
010:00400050 69 73 20 70 72 6F 67 72-61 6D 20 63 61 6E 6E 6F is program canno
010:00400060 74 20 62 65 20 72 75 6E-20 69 6E 20 44 4F 53 20 t be run in DOS
010:00400070 6D 6F 64 65 2E 0D 0D 0A-24 00 00 00 00 00 00 00 mode....$.......
Листинг 2 дамп памяти, снятый через history
Как вариант, можно воспользоваться бесплатным плагином IceExt (http://stenri.pisem.net/), значительно расширяющим функциональные возможности soft-ice. Если IceExt откажется запускаться, увеличьте размер кучи и стека до 8000h байт, отредактировав следующую ветвь реестра HKLM\SYSTEM\CurrentControlSet\Services\NTice.
Команда "!DUMP"
(см. рис. 2 и листинг 3) позволяет сохранять блоки памяти на диск в двоичном виде, что очень удобно:
Рисунок 2 снятие дампа в soft-ice с помощью плагина IceExt
:!DUMP
Dump memory to disk
!dump FileName Addr Len
Ex:
!dump c:\dump.dat 400000 1000
!dump \??\c:\dump.dat 400000 1000
!dump \??\c:\dump.dat edx+ebx ecx
:!DUMP C:\dumped 400000 7DE8
DUMP: \??\C:\dumped 400000 7de8
Листинг 3 дамп памяти, снятый командой !DUMP плагина IceExt
Другой плагин — icedump (programmerstools.org/system/files?file=icedump6.026.zip) тоже умеет дампить память и, так же как и IceExt, он распространяется на бесплатной основе вместе с исходными текстами.
Полученный дамп можно загрузить в дизассемблер типа IDA Pro, но от его запуска лучше воздержаться (особенно на соседних компьютерах), поскольку для корректной работы необходимо восстановить таблицу импорта и ресурсы, но это настольно обширный вопрос, что здесь мы не будем его касаться, тем более, что существуют готовые утилиты: Import Reconstructor (http://www.wasm.ru/baixado.php?mode=tool&id=64) восстановит импорт, а Resource Rebuilder (http://www.wasm.ru/baixado.php?mode=tool&id=156) — ресурсы.
Для отладчика OllyDbg существует плагин OllyDump (http://dd.x-eye.net/file/ollydump300110.zip), со встроенным реконструктором таблицы импорта (см. рис. 3).
Рисунок 3 снятие дампа в OllyDbg с помощью плагина OllyDump
Наконец, можно воспользоваться и автономным дампером. Самым первым (и самым неумелым) был ProcDump, затем появился Lord PE, учитывающий горький опыт своего предшественника и способный сохранять дамп даже в тех случаях, когда PE-заголовок умышленно искажен защитной, а доступ к некоторым страницам памяти отсутствует (атрибут PAGE_NOACCESS). Венцом эволюции стал PE-TOOLS (см. рис. 4), с которым мы и будем работать. Базовый комплект поставки можно найти практически на любом хакерском сервере, например, на WASM'е (http://www.wasm.ru/baixado.php?mode=tool&id=124) или на CrackLab'е (http://www.cracklab.ru/download.php?action=get&n=MTU1), а свежие обновления лежат на "родном" сайта проекта http://neox.iatp.by, кстати говоря, уже несколько раз поменявшим свой адрес (по непонятым причинам, базовый пакет на нем отсутствует).
Рисунок 4 внешний вид утилиты PE-TOOLS
Если мы работаем с отладчиком прикладного уровня (типа OllyDbg) и стоим в OEP, то снять дамп с программы очень просто. Достаточно переключится на PE-TOOLS, выбрать нужный процесс в списке и сказать "dump full", однако, с отладчиками уровня ядра (soft-ice, Microsoft Kernel Debugger) этот номер не проходит и тут приходится хитрить. Запоминаем (в голове или на бумажке) первые два байта от начала OEP и записываем сюда EBFEh, что соответствует машинной инструкции JMP short $-2, зацикливающей процесс. Теперь можно смело выходить из отладчика, идти в PE-TOOLS, снимать дамп и восстанавливать оригинальные байты в любом hex-редакторе.
Обыкновенные упаковщики (типа UPX) не сопротивляются снятую дампа, поскольку борьба с хакерами в их задачу не входит. Иное дело — протекторы. Фактически, это те же самые упаковщики, но снабженные целым арсеналам противохакерских механизмов.Защитные методики можно разделить на активные и пассивные. К пассивным относится все те, что работают только на стадии распаковки и не вмешиваются ни в саму программу, ни в операционную систему. Активные — перехватывают API-функции внутри адресного пространства защищаемого процесса или даже устанавливают специальный драйвер, модифицирующий ядро операционной системы таким образом, что прямое снятие дампа становится невозможным. Очевидным побочным эффектом активных защит ставится их неуживчивость с новыми версиями Windows, зачастую приводящая к краху операционной системы. Печальнее всего то, что, запуская setup.exe, мы даже и не подозреваем какая там может гнездиться тварь, тем более, что далеко не все протекторы поддерживают корректурную деинсталляцию...