Техника снятия дампа с защищенных приложений

         

Простые случаи дампинга


Представим себе, что распаковщик уже отработал, мы стоим в оригинальной точке входа (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, мы даже и не подозреваем какая там может гнездиться тварь, тем более, что далеко не все протекторы поддерживают корректурную деинсталляцию...


Содержание раздела