/\                                                       /\
        /  \_                                                   _/  \
   ____/    /__      T E A M  .  F I F T Y  .  T H R E E      __\    \____
   \__     ____\\-                                 ____    -//____     __/
     /    /_____                             ______\   \__________\    \
   _/    /_\    \_________________________-//     //    ____/    /_\    \_
 __\            _\  ____ /___  _    \_    \/     //    ___\/_            /__
))______________\_    _______\_|__   /____\/_____\    /gf  _/______________((
                  \___\\-       /___//-         /____((-
              TEAM FiFTY THREE  TUTORiALS PACK # SEVENTEEN

IDA Demo 4.8 patching


Автор - CHEfir 
Цель - IDA Demo 4.8 
Сложность - 1/10 
Инструменты - OllyDbg, PEiD, AspackDie, W32dsm 
Метод взлома - Патч 

Введение... 

Привет всем!!! По некоторым причинам мне надо было покопаться в одной проге и очень понадобилась Ида. Запустил и... пробный период закончился! 
Вот проблема: 
Кликнем по EXE, а он нам мессаж (Целых два) типа "Sorry, this is DEMO!!!", и выходит в окошки :( 

Начнем... 

Пихаем екзешник в PEiD, а он нам выдал Аспа 2.12, лично я распаковал с помощью AspackDie... Затем в Олю, а тут у меня не стандартное начало (я не знаю почему так произошло, но думаю это потому что прога не до конца распоковалась. Так что распаковывайте вручную!!!)). Начинаем трейсить по F8 пока не вылетит NAG`лое окно, останавливаемся на 005C7EE8 и секунды через 2 вылетает сообщение 
************************************************************************************
005C7EE2   |.  E8  0B740000     CALL     
005C7EE7   |.  50              PUSH  EAX 
005C7EE8   |.  FF56  18         CALL  DWORD  PTR  DS:[ESI+18]               ;  
МЫ 
ТУТ!!!   
************************************************************************************ 
У меня может код и адреса отличаться от ваших, но принцип я думаю понятен... Ставим бряк по адресу 005C7EE8 (Выделяем эту строку и давим F2) затем Ctrl+F2 для рестарта проги. Жмем "play" или F9. Тормозим на бряке (для того они и нужны) и заходим в процедуру (F7) и трейсим по F8 пока сообщение опять не вылетит... 
************************************************************************************ 
00401F85    .  8B81  B8040000   MOV  EAX,DWORD  PTR  DS:[ECX+4B8]     ; 
Неинтересно... 
00401F8B    .  E8  5C0B1600     CALL  unpacked.00562AEC             ; 
Неинтересно... 
00401F90    .  E8  CB430300     CALL  unpacked.00436360             ;  А  вот  
тут 
мы  и  тормознули 
************************************************************************************ 
Снова ставим бряк на 00401F90 затем Ctrl+F2 -> F9 -> Тормозим на бряке, заходим в процедуру и трейсим по F8 пока сообщение опять не вылетит... 
************************************************************************************ 
00436548   |>  B8  01000000     MOV  EAX,1 
0043654D   |>  E8  264F0300     CALL  unpacked.0046B478          ;  <---  МЫ 
ТУТ!!! 
00436552   |.  6A  00           PUSH  0                          ;  /Arg1  = 
00000000 
00436554   |.  E8  5F281900     CALL  unpacked.005C8DB8          ; 
\unpacked.005C8DB8 
00436559   |.  59              POP  ECX 
0043655A   |.  3D  F0EBDF43     CMP  EAX,43DFEBF0 
0043655F      7C  3B           JL  SHORT  unpacked.0043659C           
00436561   |.  68  71005E00     PUSH  unpacked.005E0071          ;  /Arg1  = 
005E0071  ASCII 
Sorry,  
00436566   |.  E8  E508FDFF     CALL  unpacked.00406E50          ; 
\unpacked.00406E50 
************************************************************************************ 
Тормозим на 0043654D. Вас не смущает команда MOV EAX,1? Перед процедурой вывода сообщения в EAX помещается 1, а что случиться, если там будет ноль? Выделяем строку 00436548, давим ПРОБЕЛ, все стираем и пишем "xor eax,eax" без кавычек. Эта команда обнулит значение в eax. Снова выделяем строку 00436548. Правый клик и "New origin here" (По любому должны знать что это такое). Проходим 0043654D по F8 и... ура... сообщения нет!!! Но по адресу 00436566 выскакивает еще один мессаж. Посмотрим выше... Какое чудо может случиться чтобы перепрыгнуть этот CALL... Смотри на 0043655A. Это сравнение содержимого EAX с 43DFEBF0. Если в EAX другое число то прыжок на 0043659C не осуществится и выскочит "Sorry, this is DEMO!!!" Так что просто выделяем 0043655F, жмакаем ПРОБЕЛ для изменение кода и вместо JL пишем JMP (Учите асму). Тыкаем в любом месте кода правой кнопкой крысы, далее Copy to executable -> All modifications, Copy all, вылезет новое окно, правой кнопкой, Save file, и сохроняем новый екзешник, например new.exe Вот и все, прога запускается и работает без проблем... ну почти без проблем. Во время работы выскакивает сообщение "The demonstration version has expired". Запихнем new.exe в W32dsm и поищем в refs -> String data слово "Warning" (учитывая регистр), давим два раза и попадаем сюда: 
************************************************************************************ 
*  Possible  StringData  Ref  from  Data  Obj  ->"Warning" 
                                   | 
:0041A383  B827AA5D00           mov  eax,  005DAA27    
************************************************************************************ 
Посмотрим, откуда вызывается эта процедура. Как? Нам подскажет надпись выше: 
************************************************************************************ 
*  Referenced  by  a  (U)nconditional  or  (C)onditional  Jump  at  Address: 
|:0041A33A(U) 
| 
************************************************************************************ 
Найдем эту строку... 
************************************************************************************ 
:0041A331  7409                 je  0041A33C 
:0041A333  C745C803000000       mov  [ebp-38],  00000003 
:0041A33A  EB36                 jmp  0041A372                 ;  А  вот  наш 
джамп 
************************************************************************************ 
Но бряк на него ставить бесполезно т.к. тут все запутанно и прога не попадет на эту строчку из-за джампа на 0041A331. Вывод: ставим бряк на 0041A331. В Olly открываем new.exe и в commandBar`е пишем bp 0041A331 и давим F9 для запуска проги. Открывается Ида... Нам надо сделать так, чтобы выскочило сообщение. Для этого откроем любой файл в Иде... Опа! Бряк сработал! Ищем начала процедуры... Она начинается так: 
************************************************************************************ 
0041A2C0      55              PUSH  EBP 
0041A2C1      8BEC            MOV  EBP,ESP 
0041A2C3   |.  83C4  C8         ADD  ESP,-38 
************************************************************************************ 
Теперь ищем ближайший джамп... 
************************************************************************************ 
0041A2DC   |.  84D2            TEST  DL,DL 
0041A2DE      75  1C           JNZ  SHORT  unpacked.0041A2FC        ;  Этот  
вполне 
подойдет... 
0041A2E0   |.  66:C745  E4  080>MOV  WORD  PTR  SS:[EBP-1C],8 
--------------------------------------------------------- 
---------------пропущено  несколько  строк----------------- 
--------------------------------------------------------- 
0041A380   |.  FF75  CC         PUSH  DWORD  PTR  SS:[EBP-34]         ;  |Arg1 
0041A383   |.  B8  27AA5D00     MOV  EAX,unpacked.005DAA27          ;  |ASCII 
"Warning" 
0041A388   |.  8B4D  D0         MOV  ECX,DWORD  PTR  SS:[EBP-30]      ;  | 
0041A38B   |.  BA  03000000     MOV  EDX,3                          ;  | 
0041A390      E8  73980B00     CALL  unpacked.004D3C08             ; 
\unpacked.004D3C08 
0041A395   |.  8B45  D4         MOV  EAX,DWORD  PTR  SS:[EBP-2C] 
0041A398   |.  64:A3  00000000  MOV  DWORD  PTR  FS:[0],EAX 
0041A39E   |.  8BE5            MOV  ESP,EBP 
0041A3A0   |.  5D              POP  EBP 
0041A3A1   \.  C3              RETN 
************************************************************************************ 
Наша цель это перепрыгнуть CALL "Warning". Для этого выделим строчку 0041A2DE -> пробел -> стираем все и пишем "Jmp 0041A395". Ну, вот и все. Конечно, остался NAG при выходе из проге, но я думаю, вы без труда сможете убить этот раздрожитель нервной системы :) Я не стал это рассматривать т.к. для нормальной работы проги это не мешает... P.S. Когда я дописал статью мне в голову пришла идея скручивания таймера триала :) Но как бы там не было мне понравилась иследование. 

Удачного вам ревесинга!!! 

26.11.2006 ;)