Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Распаковка BVS Solitaire Collection 4.0

Обсудить статью на форуме

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: DoC <docdot@mail.ru>

Инструменты

Sof ICE 4.05 + Loader
ICEDump(заменит ручку с бумагой),SuperBPM
HIEW 6.11, LordPE, ImpRec v1.6
PE Identifier 0.91

Начало

Прежде всего осмотримся.Запустим программу PEiD (PE Identifier) и укажем путь
к нашей программе. PEID выдает нам, что это протектор "ASProtect 1.22-1.23
Beta 21 -> Alexey Solodovnikov".
Распаковать Striper-ом не удалось, вылезают Exception-ы. Будем работать ручками.

Поиск OEP

Загрузим ICEDump (SoftICE должен быть уже загружен), запускаем SuperBPM,
ставим галку на eraze. Используем SymbolLoader, в котором откроем нашу
программу, жмем иконку с шестеренками и мы в SICE, на Enter Point.
Ставим bpm esp-4. Жмем пару раз F5, и прерываемся в таком месте :

-------------------------------------------------------------------------------
EAX=0436E4E2 EBX=00000016 ECX=1E0571EF EDX=3E382A32 ESI=A9615213
EDI=FFFFFED0 EBP=6B88E2CE ESP=0062FE38 EIP=00B959CB o d I s z a p c
CS=017F DS=0187 SS=0187 ES=0187 FS=1B07 GS=0000
-------------------------------------------------------------------------------
0030:00000000 9E 0F C9 D8 65 04 70 00-16 00 FB 09 65 04 70 00 ....e.p.....e.p.
0030:00000010 65 04 70 00 54 FF 00 F0-08 80 00 F0 FF E7 00 F0 e.p.T...........
0030:00000020 00 00 00 D0 D2 08 D7 0A-6F EF 00 F0 6F EF 00 F0 ........o...o...
0030:00000030 6F EF 00 F0 6F EF 00 F0-9A 00 FB 09 65 04 70 00 o...o.......e.p.
0030:00000040 07 00 70 D0 4D F8 00 F0-41 F8 00 F0 E7 24 63 FD ..p.M...A....$c.
0030:00000050 39 E7 00 F0 40 02 B9 06-2D 04 70 00 28 0A B9 07 9...@...-.p.(...
0030:00000060 A4 E7 00 F0 2F 00 BC 0A-6E FE 00 F0 04 06 B9 07 ..../...n.......
0030:00000070 1D 00 00 D0 A4 F0 00 F0-22 05 00 00 12 22 56 04 ........"...."V.
0030:00000080 A8 0F C9 00 45 04 DE 0F-F7 2F B2 FC B7 22 86 FD ....E..../..."..
0030:00000090 03 00 D5 10 BC 0F C9 00-87 24 69 FD D0 0F C9 00 .........$i.....
0030:000000A0 6C 10 C9 00 66 04 70 00-B4 05 B9 07 6C 10 C9 00 l...f.p.....l...
0030:000000B0 6C 10 C9 00 6C 10 C9 00-00 00 C1 0A F6 03 DE 0F l...l...........
0030:000000C0 EA E4 0F C9 00 E7 00 F0-6C 10 C9 00 01 00 C7 10 ........l.......
0030:000000D0 6C 10 C9 00 6C 10 C9 00-6C 10 C9 00 6C 10 C9 00 l...l...l...l...
0030:000000E0 6C 10 C9 00 6C 10 C9 00-6C 10 C9 00 6C 10 C9 00 l...l...l...l...
-------------------------------------------------------------------------------
017F:00B959C6 E800000000 CALL 00B959CB <-мы тут
017F:00B959CB 5D POP EBP
017F:00B959CC 81EDBD6F4900 SUB EBP,00496FBD
017F:00B959D2 8D8DD16F4900 LEA ECX,[EBP+00496FD1]
017F:00B959D8 03CB ADD ECX,EBX
017F:00B959DA 894101 MOV [ECX+01],EAX
017F:00B959DD EB00 JMP 00B959DF
017F:00B959DF 55 PUSH EBP << ничего не напоминает?
017F:00B959E0 8BEC MOV EBP,ESP << стандартное начало
017F:00B959E2 83C4E8 ADD ESP,-18 << Delphi-программ
017F:00B959E5 33C0 XOR EAX,EAX
017F:00B959E7 8945F0 MOV [EBP-10],EAX ss 0062FE28=0062FE3C
017F:00B959EA 8945EC MOV [EBP-14],EAX ss 0062FF24=0062FF78
017F:00B959ED 8945E8 MOV [EBP-18],EAX ss 0062FF20=81845234
017F:00B959F0 B854E03604 MOV EAX,0436E054
017F:00B959F5 6890909090 PUSH 90909090
017F:00B959FA C3 RET
017F:00B959FB 90 NOP
017F:00B95A0C 90 NOP _ _
------------------------------------------------------------------------------

Если потрейсить F8 до RET, мы выйдем на адрес 017F:0436E4E2 - CALL 04195ACC
первый call нашй программы. EAX=0436E054.

EAX=0436E054 EBX=00000016 ECX=00B959D9 EDX=3E382A32 ESI=A96151F7
EDI=FFFFFED0 EBP=0062FE38 ESP=0062FE20 EIP=0436E4E2 o d I s Z a P c
CS=017F DS=0187 SS=0187 ES=0187 FS=39EF GS=0000
-------------------------------------------------------------------------------
0030:000000A0 6C 10 C9 00 66 04 70 00-B4 05 B9 07 6C 10 C9 00 l...f.p.....l...
0030:000000B0 6C 10 C9 00 6C 10 C9 00-00 00 C1 0A F6 03 DE 0F l...l..........
0030:000000C0 EA E4 0F C9 00 E7 00 F0-6C 10 C9 00 01 00 C7 10 ........l......
0030:000000D0 6C 10 C9 00 6C 10 C9 00-6C 10 C9 00 6C 10 C9 00 l...l...l...l..
0030:000000E0 6C 10 C9 00 6C 10 C9 00-6C 10 C9 00 6C 10 C9 00 l...l...l...l..
0030:000000F0 6C 10 C9 00 6C 10 C9 00-6C 10 C9 00 6C 10 C9 00 l...l...l...l..
0030:00000100 59 EC 00 F0 D5 EF 00 F0-65 F0 00 F0 0C 10 56 04 Y.......e.....V
0030:00000110 FF E7 00 F0 FF E7 00 F0-FF E7 00 F0 FF E7 00 F0 ...............

-------------------------------------------------------------------------------
<< : здесь были stolen bytes, которые забрал
<< : АСПР. Нам надо их восстановить и вычислить
<< : истинный OEP.
017F:0436E4E2 CALL 04195ACC << Call InitExe <- мы тут
017F:0436E4E7 XOR EAX,EAX
017F:0436E4E9 PUSH EBP
017F:0436E4EA PUSH 0436E65D
017F:0436E4EF PUSH DWORD PTR FS:[EAX]
017F:0436E4F2 MOV FS:[EAX],ESP
017F:0436E4F5 CALL 0436DFDC
017F:0436E4FA MOV EAX,[043771B4]
017F:0436E4FF MOV EAX,[EAX]
017F:0436E501 CALL 041BAD04
017F:0436E506 MOV EAX,[043771B4]
017F:0436E50B MOV EAX,[EAX]
017F:0436E50D MOV EDX,0436E674
017F:0436E512 CALL 041BA93C
017F:0436E517 LEA EDX,[EBP-10]
017F:0436E51A MOV EAX,[043771B4]
017F:0436E51F MOV EAX,[EAX]
017F:0436E521 CALL 041BB244
017F:0436E526 MOV EAX,[EBP-10]
017F:0436E529 LEA EDX,[EBP-14]
017F:0436E52C CALL 04197C30
017F:0436E531 MOV EAX,[EBP-14]
017F:0436E534 LEA ECX,[EBP-10]
017F:0436E537 MOV EDX,0436E698
017F:0436E53C CALL 04197B0C
017F:0436E541 MOV EAX,[EBP-10]
017F:0436E544 PUSH EAX
017F:0436E545 LEA EDX,[EBP-18]
017F:0436E548 MOV EAX,[043771B4]
017F:0436E54D MOV EAX,[EAX]

Итак - еще раз дойдем до адреса 017F:00B959DF 55 PUSH EBP, переходим в режим
ввода ассемблерных команд(а), зацикливаем программу, снимаем все брекпойнты,
выходим по F5, открываем LordPE,выбираем наш процесс, -> dump full, сохраняем
дамп. Убиваем процесс (burn process), открываем сдампленный файл в HIEW
(ругнется,что нет импорта-ничего,все будет ;), идем на адрес 0436E4E2 и видим
выше нашего адреса 22 байта с нулями (16HEX).

0436E4CA: 36 ss:
0436E4CB: 0400 add al,000 ;" "
0436E4CD: 0000 add [eax],al
0436E4CF: 0000 add [eax],al
0436E4D1: 0000 add [eax],al
0436E4D3: 0000 add [eax],al
0436E4D5: 0000 add [eax],al
0436E4D7: 0000 add [eax],al
0436E4D9: 0000 add [eax],al
0436E4DB: 0000 add [eax],al
0436E4DD: 0000 add [eax],al
0436E4DF: 0000 add [eax],al
0436E4E1: 00E8 add al,ch
0436E4E3: E575 in eax,075
0436E4E5: E2FF loop .00436E4E6

Это и есть место для наших stolen bytes. Рассчитаем OEP, он должен быть:
(0436E4E2 - 16h байтов) == 0436E4CC)) Отсчитываем до адреса 0436e4cc 22 байта
и вбиваем их по очереди сверху вниз
55 8B EC 83 C4 E8 33 C0 89 45 F0 EC 89 45 E8 B8 54 E0 36 04 до адреса
0436E4E2 далее- F9-Update All, выходим из HIEW.
Теперь у нас есть восстановленный файл, но пока без импорта.

Восстановление импорта

Для этого понадобится Import REconstructor (у меня Import REConstructor v1.6F(C)
2001-2003 uCF (gfx by Dennison).Written in Visual C++ 6.0 with MFC by MackT.,
Запустим запакованную программу, запускаем ImpRec,в окне "Attach to an Active
Process" выбираем наш процесс, ждем, пока грузятся модули импорта, меняем
значение OEP на наш вычисленный:(0436E4CC-04190000=1DE4CC), жмем Iat AutoSearch,
- RVA определилось как 1E9248. Size 10h. Маловато будет. Меняем Size на 1000,
жмем Get Import, определилсь одна ветка, открываем, смотрим, значение первого
переходника rva:001e9248 ptr:00b98430 Запомним это значение на будущее.
Восстанавливаем неопределившиеся ветки правым кликом мыша -> Trace Level1(Disasm),
некоторые - через Plugin Tracers -> ASProtect 1.22 То, что не определилось -
переходники между разными функциями-убираем(Cut Thunks).В последней ветке ручками
определяется только одна функция - MulDiv. Остальное - мусор, который выделяем
(Show Invalid), жмем Delete Thunks. Вроде усесь.
Жмем FixDump, выходим из ImpREc-a. Запускаем наш Dumped_exe, получаем - Мессагу:

Программа выполнила недопустимую операцию и будет закрыта. И ниже -
- Программа DUMPED_ вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 0084:00b90528.

Даа, блин. Разбираемся - адрес 00b90528 стоит несколько раньше тех адресов,
которые были первыми в нашей таблице импорта (00b98430). Значит не совсем верно
определено начало таблицы, так что по новой запускаем запакованную программу,
запускаем ImpRec,меняем значение RVA на 001E9000, проверяем чтобы наши значения
были такими:
OEP 001DE4CC
RVA 001E9000
SIZE 1000
Жмем Get Import, получаем, чистим начало до первого рабочего адреса, там где
адреса не восстановились юзаем Trace Level1 (Disasm) и
Plugin Tracers -> ASProtect 1.22. Мусор обрубаем. Жмем Fix Dump - ;)
Ну теперь все. Запускаем файл dumped_.exe Ии-иии . . . .
Я уже слышу ваш отборный мат. Да, я знаю, что программа не запускается.
Не надо тарахтеть. Дело в том, что есть -

Некоторые особенности

В самом начале, перед распаковкой я пробовал запускать оригинальный
переименованный файл(безрезультатно). Так-же невозможен запуск программы из
другой директории. Файл не запустится и при работающей программе. Делаем
выводы.Что может не дать запуститься проге повторно? Да конечно он - мьютекс!
Лирическое отступление:
Мьютекс - это объект синхронизации, который находится в сигнальном состоянии
только тогда, когда не принадлежит ни одному из процессов.Как только хотя бы
один процесс запрашивает владение мьютексом, он переходит в несигнальное сос-
тояние и остается таким до тех пор, пока не будет освобожден владельцем.
Такое поведение позволяет использовать мьютексы для синхронизации совместного
доступа нескольких процессов к разделяемому ресурсу. Для создания мьютекса
используется функция:
function CreateMutex(lpMutexAttributes:
PSecurityAttributes; // Адрес структуры
bInitialOwner: BOOL; // Задает, будет ли процесс владеть
// мьютексом сразу после создания
lpName: PChar // Имя мьютекса
): THandle; stdcall;
Функция возвращает идентификатор созданного объекта либо 0. Если мьютекс с
заданным именем уже был создан, возвращается его идентификатор.
Проще говоря - Мьютекс- это некий объект, владеть которым может лишь один
поток одновременно. И нужен он в данном случае, чтобы не дать запуститься
приложению еще раз(в другом потоке), а если путь к файлу используется в
генерации мьютекса то и из другой директории или под другим именем.
Итак : Запускаем программу - она не запускается. Ну, что-ж, не зря мы видели
в списке импорта функцию CreateMutexA (rva:001e939c ptr:00b98984) ;)
Лечится это просто - переименовываем наш Dumped_.exe в оригинальный Cards.exe.
Запускаем - Все работает !
Да, если при дизассемблировании файла в WinDasm-e ,будет вылетать такое окошко-
This PE File is not in Standart Windows Format.
All Data Refrences will be terminated.
надо просто поправить значение первой секции в PE-Editore на E0000020.


Обсуждение статьи: Распаковка BVS Solitaire Collection 4.0 >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS