Что это такое

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) — Структурированная обработка исключительных ситуаций

Оставить мнение

Check Also

А ты знал? 10 фактов о Python

Python — язык программирования с достаточно низким порогом вхождения, поэтому его часто вы…