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

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


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

Inline patch на примере SuperAssistent Pro 2.1

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

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

Автор: TITBIT <titbit@hakeris.net>

 Жертва : SuperAssistent Pro 2.1
 Язык проги : Borland Delphi v3.0 
 Цель : взлом 
 Инструменты :
 WinDasm32 v8.xx-9.xx, 
 PEid v0.8-0.9 
 PE Tools v1.5 Xmas Edition 
 SoftIce v3.xx-4.xx, 
 AspackDie 1.4 
 Regshot 1.61e5 Final 
 EmEditor v3.38 (для написания этой статьи) 
 и сладосный напиток - пиво
 

ВСТУПЛЕНИЕ

В этот статье я хочу показать как просто создать Inline patch. Статьи по Inline Patch есть, но написаны они по моему сложновата для новичков. Я же попытался все разжевать, написать доступным для всех языком. Для примера взял прогу SuperAssistent Pro. Вот что пишет сам программер о ней: "Программа позволяет быстро воспользоваться внутренними функциями Windows, а также имеет около 30 своих уникальных функции. Теперь Вам не надо приобретать и устанавливать десятки программ, достаточно одной - SuperAssistent PRO.....". Красиво сказано!!! Программа является условно-бесплатной. Автор за свое детище просит 600 рубликов [половина моей стипендии !!!] Без регистрации автор позволяет запускать ее только 30 раз а затем, если запустить например 31 раз прога нас обломает, т.е. не запуститься. Кстати прога при своем запуске перезагружает Мастдайский Explorer (только Win9x), при этом закрывая все активные приложения!!! [Автор Крут :) :) :) ] Наша задача "вылечить" прогу от привычки перезагружать проводник при запуске и затем зарегить ее.
Let's go......

ИСCЛЕДОВАНИЕ

Как всегда, проверим PEID'ом запакована ли наша прога. Он показал ASPack 2.12 -> Alexey Solodovnikov. AspackDie поможет нам распаковать. Теперь распакованный файл помещаем в WInDasm32. Далее в WinDasm'е ищем, нажав CTRL+F, вот такую API функцию :: ExitWindowsEx :: . Именно эта функция отвечает за выход из MustDie, т.е. перезагрузку Explorer'а. Эта функция в листинге встречается несколько раз. Привожу нужное нам место:
 * Refeernced by a (U)nconditional or (C)onditional Jump at Address:
 |:004F7B66 (C)
 |
 :004F7B6F    33F6                 xor esi, esi
 
 * Refeernced by a (U)nconditional or (C)onditional Jump at Address:
 |:004F7B6D (U)
 |
 :004F7B71    8B45FC               mov eax, dword ptr [ebp-04]     <- здесь прервем прогу ->
 :004F7B74    0FB64034             movzx eax, byte ptr [eax+34]
 :004F7B78    83F805               cmp eax, 00000005
 :004F7B7B    0F87A3000000         ja 004F7C24   <- Интересный прыжок, пока не активен ->
 :004F7B81    FF2485887B4F00       jmp dword ptr [4*eax+004F7B88]
 
 :004F7B88    A07B4F00             DWORD 004F7BA0
 :004F7B8C    B67B4F00             DWORD 004F7BB6
 :004F7B90    CC7B4F00             DWORD 004F7BCC
 :004F7B94    E27B4F00             DWORD 004F7BE2
 :004F7B98    F87B4F00             DWORD 004F7BF8
 :004F7B9C    0F7C4F00             DWORD 004F7B0F
 
 :004F7BA0    6A00                 push 00000000
 :004F7BA2    83CE08               or esi, 00000008
 :004F7BA5    56                   push esi
 
 * Reference To: user32.ExitWindowsEx, Ord:0000h
 
 :004F7BA6    E80107F1FF           Call 004082AC  <- функция переэагрузки Explorer'а ->
 :004F7BAB    83F801               cmp eax, 00000001
 :004F7BAE    1BC0                 sbb eax, eax
 :004F7BB0    40                   inc eax
 :004F7BB1    8845FB               mov byte ptr [ebp-05], al
 :004F7BB4    EB6E                 jmp 004F7C24
 :004F7BB6    6A00                 push 00000000
 :004F7BB8    83CE01               or esi, 00000001
 :004F7BBB    56                   push esi .:: ВЗЛОМ ::.
 
Теперь с помощью Symbol Loader запускаем Ассистента, очутившись в Айсе ставим прерывание по адресу 004F7B71 (bpx 004F7B71), затем выходим из Айса (F5). И далее вновь оказываемся в Айсе, топаем с F10 до перехода 004F7B7B и меняем условный прыжок на безусловный, т.е. ja на jmp (a ->EnteR->jmp 004F7C24->EnteR). Запоминаем место и измененные байты, и выходим из Айса. После этого в HieW изменяем нужные нам байты. Ну вот теперь прога не перезапускает Explorer. Теперь займемся регистрацией. В листинге WinDasm'а я не чего путного не нашел, что помогло бы найти место проверки зарегенности (: И поэтому решил пойти другой дорогой, юзая RegShot нашел место в реестре куда Ассистент записывает запуски.

Из ScreenShot'а видно что Строковый параметр :: Contents :: был UPPOU, стал TTPTS. Теперь если при каждом запуске Ассистента менять значение :: Contents :: на UPPOU, мы остановим счет запусков. В моем случае это 27. Но Это очень уж муторно не так ли, читающий? Поэтому попытаемся в WinDasm'е найти место считывания данных из Реестра. Для этого в поле поиска String Date Reference введем CLSID. Кстати эта строчка в листинге встречается несколько раз. Вот то, что нужно:
 :006FC6B2           58                      pop eax
 :006FC6B3           E8548BD0FF              call 0040520C
 :006FC6B8           0F84CE000000            je 006FC78C       <- Поднявшись, попадем сюда, и если прыгнем перей... ->
  
 :::::::::::::::::::::::::::УРЕЗАНО::::::::::::::::::::::::::::::::::::::
  
 
 * Reference by a (U)nconditional or (C)onditional Jump at Address:
 |:006FC6B8                     <- Поднимимся верх по этому адресу ->
 |
 :006FC78C            B201                    mov dl, 01  <- ...дем сюда ->
 :006FC78E            A1D8364800              mov eax, dword ptr [004836D8]
 :006FC793            E8AC70D8FF              call 00483844
 :006FC798            8BD8                    mov ebx, eax
 :006FC79A            8B45FC                  mov eax, dword ptr [ebp-04]
 :006FC79D            899800050000            mov dword ptr [eax+00000500], ebx
 :006FC7A3            33C0                    xor eax, eax
 :006FC7A5            55                      push ebp
 :006FC7A6            680DC96F00              push 006FC90D
 :006FC7AB            64FF30                  push dword ptr fs:[eax]
 :006FC7AE            648920                  mov dword ptr fs:[eax], esp
 :006FC7B1            8BC3                    mov eax, ebx
 :006FC7B3            BA00000080              mov edx, 80000000
 :006FC7B8            E86371D8FF              call 00483920
 :006FC7BD            8B45FC                  mov eax, dword ptr [ebp-04]
 :006FC7C0            8B8000050000            mov eax, dword ptr [eax+00000500]
 :006FC7C6            B101                    mov cl, 01
 
* Possible StringData Ref from Code Obj ->"\CLSID\{CE3FB1D1-02AE-4a5f-A6E9-D9F1B4073E6C}\"<- А вот и наша Строчка из Реестра !!! -> ->"InprocServe32"Теперь заменим переход je на jne по адресу 006FC6B8. Далее с HieW изменяем байты и запускаем Super Assistent Pro, дождемся окончания расчета и после этого насладимся надписью :: Спасибо за регистрацию :: После такой надписи возникают кое-какие чувства!!! (поломавший, сам хоть одну прогу чел, меня поймет....)

InLine Patch

Ну вот очередная прога повержена!!! Теперь можно делать патч, и давать его друганам. Но простые патчи, как правило, не ломают пакованные проги. Поэтому приходиться с патчем давать и анпакер к проге, который имеет размер раза в 4-5 больше самого патча. Да к тому же не все юзвера могут им воспользоваться, особенно UPX'ом. Меня, за...бали вопросы типа: "что это за ключ -d и как им воспользоватся!!!" Но и им мона помочь, написав bat файл, хотя зачем нам bat файл, сделаем inLine Patch...
Замечу, что это мой первый опыт написания InLine Patch'а. В чем же отличие простого патча от InLine? Приведу слова GL#0M'а который в своей статье писал : Inline patch - это патч исправляющий код во время выполнения программы. Для того чтобы это проделать, мы ждём пока программа полностью распакуется, и точку, когда программа хочет прыгнуть на OEP (расшифровывается как Original Entry Point - это адрес, с которого бы начинала выполняться программа, если бы не была упакована, когда же программа упакована, выполняться она начинает с EP, что расшифровывается как Entry Point), мы меняем на прыжок к Нашему куску кода, который делает необходимые изменения, а затем прыгает на OEP. Программа продолжает загрузку, ни о чём не подозревая. :)
Все, казалось бы, замечательно и просто. Признаюсь с ASpack'ом у меня не сразу получилось :( Я говорю о вычислении виртуального адреса нашего кода т.е. место куда будет прыгать прога после распаковки. У Bad_guy'я есть статья :: Полуавтоматическая распаковка ASPack 2.12 за 29 секунд :: в которой он описывает нахождения этого адреса. Способ Bad_guy'я мне не помог, прога "нарывалась" на "Invalid address". А уже подумывал забить на этот InLine Patch? Но проблема решилась, ща расскажу, хотя давайте все по порядку........
Для начала найдем место, с которого наша прога переходит на OEP, и собственно само OEP. Для простоты в Pe Tools зайдем в Options->Set Options. В полях Pe Editor и Break&Enter поставим галки напротив Register Shell Extension, сохранив изменения, выйдем из проги. Теперь нажмем на упакованном файле SuperAssistent.exe (размер 2.29Мб) правой кнопкой крысы и выберем из меню :: Break & Enter (Pe Tools). Появиться окно, которое посоветует перед нажием кнопки ввести в SoftIce команду bpint 3, а затем eb eip 60. Так и делаем, активируем Айс и вводим bpint 3, далее выходим из Айса и нажимаем на знакомое окно... Ну вот мы опять в Айсе. Теперь пояснения... Pe tools переписала один байт (60 -> CC) тем самым создав прерывания в Ассистенте. А мы в свою очередь командой bpint 3 останавливаем выполнение проги на этом месте. Остановив возвращаем все на свое место eb eip 60. И далее вводим bpm esp-4 и выходим из Айса (F5), опять прерываемся вот здесь:
 0197:0094A3AF  61                  POPAD                                       
 0197:0094A3B0  7508                JNZ       0094A3BA  <- Здесь мы впишем адрес нашего кода>                          
 0197:0094A3B2  B801000000          MOV       EAX,00000001                       
 0197:0094A3B7  C20C00              RET       000C                               
 ==> 0094A3BA   68BCE26F00          PUSH      006FE2BC   <- Вот Наш OEP->                         
 0197:0094A3BF  C3                  RET                                          
 0197:0094A3C0  8B8526040000        MOV       EAX,[EBP+00000426]                 
 0197:0094A3C6  8D8D3B040000        LEA       ECX,[EBP+0000043B]                 
 0197:0094A3CC  51                  PUSH      ECX 
 0197:0094A3CD  50                  PUSH      EAX                                
 0197:0094A3CE  FF95490F0000        CALL      [EBP+00000F49]                     
 0197:0094A3D4  898555050000        MOV       [EBP+00000555],EAX                 
 0197:0094A3DA  8D8547040000        LEA       EAX,[EBP+00000447]                 
 0197:0094A3E0  50                  PUSH      EAX                                
 0197:0094A3E1  FF95510F0000        CALL      [EBP+00000F51]                     
 0197:0094A3E7  89852A040000        MOV       [EBP+0000042A],EAX                 
 0197:0094A3ED  8D8D52040000        LEA       ECX,[EBP+00000452]                 
 0197:0094A3F3  51                  PUSH      ECX                                
 0197:0094A3F4  50                  PUSH      EAX                                
 0197:0094A3F5  FF95490F0000        CALL      [EBP+00000F49]                     
 0197:0094A3FB  898559050000        MOV       [EBP+00000559],EAX                 
 0197:0094A401  8B852A040000        MOV       EAX,[EBP+0000042A]                 
 0197:0094A407  8D8D5E040000        LEA       ECX,[EBP+0000045E]                 
 0197:0094A40D  51                  PUSH      ECX                                
 0197:0094A40E  50                  PUSH      EAX                               
 0197:0094A40F  FF95490F0000        CALL      [EBP+00000F49]                
 ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДSUPERASSIS!.aspack+03AFДДДДДДДДДДДД
 :/screendump f:\crack\as
 
По адресу 0094A3BA мы можем увидеть OEP. Кстати, некоторые подумают а на хер ваще юзать Айс, когда можно просто открыть HEX редактором прогу и посмотреть что лежит в PUSH? А лежать там будут нули, т.е. Push 00000000. (:
Теперь загрузим нашу прогу в HIEW и найдем место куда можно будет вписать свои команды, т.е. место с нулями. Как правило нулей полно в конце файла. Я выбрал вот этот адрес: 0094с950, ты можешь выбрать любой другой адрес. Учти что не надо выбирать адрес у самого конца файла, т.к. тебе может и не хватить место для вбивания своего кода....
Ну вот мы стоим на Адресе 0094с950 нажмем F3->F2 для правки и в открывшемся окно введем :
 mov d, [004F7B7B], 00000A4E9 <- Забиваем на ПеРеЗаГрУзКу Explorer'а-> 
 mov d, [006FC6B8], 000CE840F <- Регим Себя-> 
 push 0006FE2BC <- Помещаем в Регистр наш OEP-> 
 ret <- Переходим на OEP-> 
 
Для тех, кто не знает как вводить я подскажу... Сначала введем mov d, [004F7B7B], 00000A4E9 подтвердим ввод ENTER'ом и далее опять введем mov d, [006FC6B8], 000CE840F и опять энтер и т.д. После ввода последней команды жмем Enter, затем ESC-> F9 ->. Команда F9 сохраняет изменения в исполняемом файле.

mov d, [004F7B7B], 00000A4E9 - это mov dword ptr [zzzzzzz], xxxxxxx , здесь zzzzzzz, адрес куда вносим изменения, а xxxxxxx, байты, которые будем изменять. Причём изменения (xxxxxxx) вбивать надо наоборот. Было E9A400000, мы пишем 00000A4E9.

Вот что у вас должно получиться в HieW:

Теперь нам осталось сделать так, чтобы наша прога, после распаковки в памяти, прыгнула на наш кусок кода, сделала бы нужные нам изменения и продолжила выполнение. Юзается это очень просто!!! Заменим переход по адресу 0094A3B0 на свой.......... Вот мы и вернулись к виртуальному адрес. Как его узнать? Bad_guy описал, по-моему очень уж муторный способ, я писал что он мне не помог. Намного проще и быстрее воспользоваться HieW. Перейдем на наш кусок кода (адрес 0094С950), выделим первый байт, в моем случае это C7 и нажмем F3 ...... Ну и что мы видим? Адрес поменялся был 0094С950 а стал 0024B750. Вот он наш адресок, его то мы и впишем в нужном нам месте. Теперь нужно перейти к адресу 0094AA3BA и поменять переход. Но для этого нам нужно знать Offset этого адреса. Мы можем, юзая WinDasm, узнать его, т.е. выделить строчку и посмотреть в строку состояния, где увидим @Offsetzzzzzzh, здесь zzzzzzz и будет нам нужный Offset. А можно выделить файл SuperAssistent.exe (размер 2.29Мб) правой кнопкой грызуна и выбрать .:: Load into PE Editor :.. , в окне нужно нажать .:: FLC ::. Затем в появившемся окне, в поле .:: Virtual Address ::. ввести наш адрес, т.е. 0094AA3BA, после этого нажав кнопку .:: Calculate ::. мы узнаем Offset Файла - 002491B0. Теперь в HIEW нажав F5 введем вычисленный нами Offset - 2491B0, тем самым мы окажемся на нужном адресе. Далее, как я писал выше меняем JNZ 0094A3BA на jmp 0024B750. Изменив байты все сохраняем (F9) и выходим из Hiew (F10). Теперь, запустив прогу проверим ее "на вшивость".... Все кульно, прогу можно Юзать. Ну вот и все, теперь берем любой Patch Maker сравниваем оригинальный файл с измененным и создаем Крэк.

P.S. Прога может быть и не плохая, но стоит ли она 600 руб.? Думаю нет. Насчет защиты - она оставляет желать лучшего!!!

Возникли вопросы? Если да, то пишите, постараюсь ответить: titbit@hakeris.net

Greetz: EGOiST, MozgC, freeExec, GL#0M, FEUERRADER, Fess, .::D.e.M.o.N.i.X::. and Bad_guy.

Copyright © 2004 In Da House
All rights Reserved ™ TITBIT
Release: 18.02.04


Обсуждение статьи: Inline patch на примере SuperAssistent Pro 2.1 >>>


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



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


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