Что это такое
ASProtect - это программа, написанная Алексеем Солодовниковым, предназначенная
для защиты, шифрования и сжатия ПО. Последняя версия, доступная для
незарегистрированных пользователей - 1.2. Скачать ее можно отсюда:
http://www.aspack.com/files/asprotect12.zip
она лежит тут без изменений аж с 2001 года... Однако на сайте wasm.ru мне удалось отыскать более свежую версию -
1.23 rc1. Качать отсюда: http://www.wasm.ru/tools/12/asprotect.zip.
Особенности и принцип работы.
1) Стирание названий всех секций и установка их атрибутов в C0000040 (как у
секции данных), присутствовавших в защищаемом файле, однако порядок их следования
сохраняется. Добавляются две дополнительные секции кода ASProtect'a. Одна секция
распаковывает другую, которая в свою очередь распаковывает остальную программу.
2) Проверка целостности кода (CheckSum Protection)
3) Сграбливание байтов с OEP
4) Взаимодействие самой программы и непосредственно защиты осуществляется через
API-функции. ASProtect изменяет таблицу импорта так, что вызов API-функций
происходит через код защиты. Для примера, рассмотрим вызов
GetDlgItemTextA. Было:
CALL 0040651C ; В секцию импорта т.е. call GetDlgItemTextA
А после изменения ASPrtoect'ом импорта:
По адресу 0040651C:
jmp [41C2A0] ; В 41C2A0 лежит значение 008C21E0 т.е. происходит jmp 8C21E0, в код ASProtect'а
По адресу 008C21E0:
push ebp |
mov ebp, esp | Это кусок самой GetDlgItemTextA
push dword ptr [ebp+0C] |
push dword ptr [ebp+08] |
push 77D52758 ; GetDlgItemTextA+09
ret ; Ее Вызов
Короче, нам придется восстанавливать таблицу импорта
5) Защита от дизассемблеров
Например, такой код:
50F001: 60 PUSHAD
50F002: E803000000 CALL 0050F00A
50F007: DB E9h,EBh,04h
50F00A: D5 POP EBP
50F00B: 45 INC EBP
50F00C: 55 PUSH EBP
50F00D: C3 RET
Синтаксический дизассемблер типа W32DASM или SOURCER дизассемблирует так:
50F001: 60 PUSHAD
50F002: E803000000 CALL 0050F00A
50F007: E9EB04D545 JMP 45ADF4F7
50F00C: 55 PUSH EBP
50F00D: C3 RET
Однако интерактивный дизассемблер IDA PRO с этой задачей справился.
6) Использование антиотладочных приемов:
a) IsDebuggerPresent() - WinApi, отслеживающая присутствие отладчика (с SoftIce не справляется)
b) Отслеживание RegMon, FileMon,...
c) Использование счетчика тактов RDTSC (опкод 0F31h)
d) Создание и перехват SEH с целью сбрасывания брейкпоинтов и отслеживания отладчиков
e) CreateFile() - пытается открыть драйвер отладчика
да и много там еще чего.....
Распаковка
До версии 1.2 ASProtect можно было автоматически распаковывать замечательной
утилитой Caspr, однако автор прекратил ее совершенствование и вот результат -
приходится распаковывать вручную. Ручная распаковка сводится к:
1) Исследование
2) Нахождение OEP & Зацикливание
3) Снятие дампа
4) Восстановление IAT
5) Дополнительно
Рассмотри это подробнее на примере Paint'а (mspaint.exe
[334 Кб]) из Windows XP, который мы запакуем ASProtect'ом 1.23 rc1 в файл msp.exe с
Anti-debugger, Checksum, Resources protection и максимальным сжатием. Получаем
231 Кб.
1) Исследование
Для начала, узнаем тип и версию запаковщика, для этого можно использовать
PEiD ( PE iDentifier 8.0). Точно определяет ASProtect до 1.2. У меня он показал: ASProtect 1.2x [New Strain] -> Alexey Solodovnikov.
Теперь определим адрес, с какого выполняется программа. Для этого в любом
редакторе PE-файлов посмотрим EP и IB и сложим их:
Base=IB+EP. У нас Base=1000000h+1000h=1001000h.
2) Нахождение OEP
Запускаем msp.exe. В SoftIce'е:
addr msp ; Адресное пространство msp
bpm 1001000 x ; Прерываемся в начале кода
Теперь перезапускаем msp и попадаем в SoftIce:
01001000: push 1056001
01001005: call 100100B
0100100A: ret
0100100B: ret
Жмем F12:
01056001: pushad
bpm esp-4 и два раза F5 (первый срабатывает после pushad) и попадаем на вход в OEP:
0088501E: popad ; Этот адрес у меня все время был разный
0088501F: jmp eax ; Здесь eax=OEP=10313F4h
Здесь же прогу и зациклим, т.е. вместо jmp eax делаем jmp eip (опкод
EBFE) (Чтобы изменить инструкцию: e eip)
У начинающего распаковщика может возникнуть вопрос: а зачем зацикливать программу?
Почему нельзя снять дамп с работающего приложения?
Дело в том, что программа при запуске много чего инициализирует в секции данных
и кода. А когда дамп пытается сделать это еще раз, у него естественно ничего не
получается, а чаще всего выходит "Ошибка при инициализации приложения (0xc000007b)"
Все это хорошо, однако, мне встречались программы, запакованные более крутыми
версиями ASProtect, где это уже не прокатывало. В таких случаях приходится идти
пешком по F8/F10, проходя все циклы и SEH'ы :). Но часто находятся точки
(типа bpx MapViewOfFile), от которых это можно сделать быстрее.
3) Снятие дампа
Для этого можно использовать утилиты типа LordPE (рекомендую), ProcDumo32,
PEEditor 1.7 by yoda&M.o.D. ... Много их, выбирайте на свой вкус.
Из списка процессов выбираем наш и делаем ему dump (full) в файл dumped.exe
4) Восстановление IAT
Здесь на любителя - кому ImpREC (Import RECovery), кому ReVirgin (восстановление
девственности по-нашемму 🙂 Я предпочитаю первый.
Выбераем процесс, в OEP пишем наш OEP без IB т.е. 313F4 и жмем IAT
AutoSearch, затем Get Imports и теперь AutoTrace. Не определилась только одна функция по
адресу 87133C. Ну что ж запускаем опять msp с остановом на EP, теперь
bpm 87133C x, F5 сразу попадаем в SoftIce. Ниже видим call
GetModuleHandleA, вручную устанавливаем эту функцию и делаем Fix Dump на наш дамп.
Все! Программу можно запускать и загружать в отладчик!
Вам, наверное, будет интересно, почему распакованная программа занимает почти на
100kb больше, чем исходная. Это очевидно, ведь в распакованной программе на три
секции больше чем в исходной! (Две от ASProtect'a и испорченная таблица импорта).
В принципе, их можно убрать (для этого даже есть специальный софт), но это
на любителя и на отладочных свойствах это не скажется.
Словарь:
IB (Image Base) - Адрес, по которому загружена программа (часто 400000h)
EP (Entry Point) - Точка входа в программу (Для запакованных ASProtect EP=1000h)
OEP (Original Entry Point) - Точка входа до запаковки
IAT (Import Address Table) - Таблица Импорта Адресов т.е. массив указателей на функции
SEH (Structured Exception Handling) - Структурированная обработка исключительных ситуаций