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

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


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

Исследование CRACKL@B CrackMe #2

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

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: [RU].Ban0K! <ru.ban0k@mail.ru>

Как вступление..

Второй КракМи Bad_guy ... сделан, скорее всего, для уровня ниже среднего (Хотя у меня не было времени искать серийники и ограничился на этот раз просто патчем...). Данной статьёй также можно воспользоваться при исследовании других крипторов.

Инструментарий

 Olly Debuger v1.09d
 HIEW или иной редактор
 Инструменты как всегда у меня сайте IN.FATAL.RU
 

Начнём...

Просмотрев в STUD_PE упаковщик/компилятор ... я понял, что это самодельный криптер, этот вывод я сделал вследствие того, что все секции были под одну названы NFO... на сколько я знаю упаковщик NFO такой ерунды не делает, и по их количеству я понял, что это дело написано на Delphi... но после этого приаттачина ещё одна секция с SFX кодом...

Нахождение ячеек для патчинга

Открыв КракМе в OllyDBG я натолкнулся на пару сообщений об ошибке поиска EntriPOINT... а также сразу попал на нечто SFX'ное...:
 0040C0C3   D20F             ROR BYTE PTR DS:[EDI],CL
 0040C0C5   300F             XOR BYTE PTR DS:[EDI],CL
 0040C0C7   47               INC EDI
 0040C0C8  ^E2 F9            LOOPD SHORT !clab2.0040C0C3
 
Вероятно, это была расшифровка... что ж это ещё может быть? Такой не больно сильный алгоритм приводит в неожиданным последствиям.... т.к. к EDI не прибавляется 4 (Как это делают новички... но об этом в другой статье), а только 1... то если мы будем патчить на прямую... то тут выйдет небольшая ошибка... несколько последующих байт сменят "ориентацию"... т.е. просто патч одной ячейки здесь уже отпадает... Но и мы не хилые.. мы сделаем немного по-другому... по умнее!
Чтобы выйти из этого нелепого положения, жмите Shi[F]t-F9.... и едем далее.
Теперь у нас есть полностью загруженный КракМе под отладчиком... Теперь нам надо перейти из нашей SFX секции в секцию CODE... дельфи делает её само сабой самой первой... т.ч. это будет первая секция NFO =) ... Далее для того чтобы заработали наши точки останова на API, нам надо сначала анализировать содержание секции... CTRL-A ... теперь введём самый "любой" серийник ... и ... увидим, что заголовок окна изменился на "[-= UNREGISTERED =-]". Увидев это я не слишком обиделся... следовательно, нам желательно поставить брэйкпойнт на SetWindowTextA. CTRL-N и выбираем API... далее ставим на все "reference"... и опять пытаемся подбором найти серийник. Вводим и ... о боже... бряк :) :
 0040407D 68 2C414000    PUSH !clab2.0040412C                     ; /Text = "[-= UNREGISTERED =-]"
 00404082 A1 F8644000    MOV EAX,DWORD PTR DS:[4064F8]            ; |
 00404087 50             PUSH EAX                                 ; |hWnd => 001901C8
 00404088 E8 B7FBFFFF    CALL         ; \SetWindowTextA
 
Ну что не ясно? Мы опять не угадали :( .... ну да ладно шутить... смотрим процедуру с "по выше" до "по ниже":
 00404057 F7F1           DIV ECX
 00404059 8915 54654000  MOV DWORD PTR DS:[406554],EDX
 0040405F 813D 54654000 >CMP DWORD PTR DS:[406554],D46E1384
 00404069 75 12          JNZ SHORT clab2.0040407D
 0040406B 68 1C414000    PUSH clab2.0040411C                      ; /Text = "! REGISTERED !"
 00404070 A1 F8644000    MOV EAX,DWORD PTR DS:[4064F8]            ; |
 00404075 50             PUSH EAX                                 ; |hWnd => 0021025E
 00404076 E8 C9FBFFFF    CALL         ; \SetWindowTextA
 0040407B EB 10          JMP SHORT clab2.0040408D
 0040407D 68 2C414000    PUSH clab2.0040412C                      ; /Text = "[-= UNREGISTERED =-]"
 00404082 A1 F8644000    MOV EAX,DWORD PTR DS:[4064F8]            ; |
 00404087 50             PUSH EAX                                 ; |hWnd => 0021025E
 00404088 E8 B7FBFFFF    CALL         ; \SetWindowTextA
 0040408D 90             NOP
 0040408E 90             NOP
 0040408F 90             NOP
 00404090 90             NOP
 00404091 90             NOP
 00404092 EB 5B          JMP SHORT clab2.004040EF
 
С начало видимо вычисленный хэш сравнивается с правильным... и на этом всё... прога идёт либо на установку "! REGISTERED !"... либо на "[-= UNREGISTERED =-]". Отсюда следует, что нам надо бы заменить:
 00404069  |. 75 12          JNZ SHORT clab2.0040407D
 
на:
 00404069  |. 74 12          JZ SHORT clab2.0040407D
 
И всё... мы нашли ячейку для патча... (Если бы его можно было бы сделать просто так...)

Перепаковка на лету

Для начала я расскажу, в чём проблема: После того как мы самым простым способом попробуем вставить незашифрованный блок в зашифрованную прогу и потом возьмём его после расшифровки и вставим его опять в зашифрованный.... то выяснится, что расшифруется правильно только 4 байта... и к тому же дальше испортится некоторый код... следовательно, как бы мы не старались нам придется таким способом перешифровать весь код программы... :( Моя идея: Мы перешифровываем только 5 байт, этого достаточно, для того чтобы сделать CALL на другое место... а этом месте мы расставляем всё обратно на свои места... и возвращаемся на место где был CALL... Место свободно найти мы сможем... и очень легко. Так как Bad_guy допустил ошибку, о которой я говорил в своей статье о создании ShareWare программ... НАДО ШИФРОВАТЬ ПУСТОЕ МЕСТО!!! Я выбрал место по адресу 4043CE... (Плохо я выбирал... да и просто так... надо брать выше, т.к. мне этого места оказалось маловато...). А процедура, которая там должна стоять:
 0040438C   A3 67404000      MOV DWORD PTR DS:[404067],EAX
 00404391   B8 681C4140      MOV EAX,40411C68
 00404396   A3 6B404000      MOV DWORD PTR DS:[40406B],EAX
 0040439B   B8 00A1F864      MOV EAX,64F8A100
 004043A0   A3 6F404000      MOV DWORD PTR DS:[40406F],EAX
 004043A5   B8 400050E8      MOV EAX,E8500040
 004043AA   A3 73404000      MOV DWORD PTR DS:[404073],EAX
 004043AF   58               POP EAX
 ;// ... безопасность :) ...
 004043B0   8F05 C4434000    POP DWORD PTR DS:[4043BC]                ; !clab2.00404064
 ;// ... убираем из стэка адрес возврата...
 004043B6  ^E9 9BFCFFFF      JMP !clab2.0040405F
 ;// ... идём на пропатченный оригинал...
 
 004043CF   90               NOP
 ;// Здесь "EntryPOINT", почему NOP? ... да так... чтот там у меня раньше другое было...
 ;// а перешифровывать CALL не охота...
 004043CF   50               PUSH EAX
 ;// Пушим регистр, который будем использовать... безопасность :)
 004043D0   B8 813D5465      MOV EAX,65543D81
 ;// То чем патчим в EAX
 004043D5   A3 5F404000      MOV DWORD PTR DS:[40405F],EAX
 ;// Теперь сам патчинг...
 004043DA   B8 40008412      MOV EAX,12840040
 004043DF   A3 63404000      MOV DWORD PTR DS:[404063],EAX
 004043E4   B8 6ED47412      MOV EAX,1274D46E
 004043E9  ^E9 9EFFFFFF      JMP !clab2.0040438C
 ;// Потому что было мало места...
 
Хоть процедура и кривая немного... но работает всегда... Это вставить легко и как это сделать .... ну в HIEW... ( :) ) Самое, наверное, трудное это корректно вставить CALL... я решил вставить его на место CMP... как делал я: Берём 4 байта из кода, который надо запаковать это :
 E8 6A 03 00
 
Вставляем на место ( у меня это место CMP: 40405F)
Запускаем в OllyDBG... после нажатия SHIFT-F9 идём в 40405F... записываем 4 байта...
Вставляем их в файл ... и добавляем последний код CALL'а... это 00...
Опять запускаем OllDBG... и берём последний байт... ( у меня это 4B )
Опять в HIEW вставляем его и всё.... всё идёт и пашет...
Вопросы на форум, если есть.... хотя вроде как в 100 раз легче, чем с первым КракМи...

[RU].Ban0K!

Комментарий Bad_guy'я от 1 сентября 2003 года: На этот раз Рубанок немного увлекся и занялся крэкми, который написан для пусть и не новичков, но для тех, кто мало знает про распаковку программ и хочет потренироваться. Подобрать же серийный номер к этому крэкми - дело достаточно сложное, но выполнимое - такой взлом был осуществлен.
Рубанок говорит, что: "Bad_guy допустил ошибку, ... НАДО ШИФРОВАТЬ ПУСТОЕ МЕСТО!!!". Ну, начнем с того, что в этом крэкми зашифрована только секция кода и ресурсов, к тому же один из взломов данного крэкми, который был проведен крэкером по имени -= ALEX =- показал, что если запаковать даже абсолютно все секции, то в заголовках все равно останется место, чтобы вставить туда свой код inline патча. Единственным спасением в этом случае может стать только грамотно написанная проверка CRC или процедура восстановления заголовков.



Обсуждение статьи: Исследование CRACKL@B CrackMe #2 >>>


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



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


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