RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Исследование крякмикса от SerHack


Приветствую!
Сегодня мы будем исследовать крякмис , любе3но и3готовленный SerHack'ом .

Target : CrackMe by SerHack
Toolz : Soft-Ice , win32dasm
Level : Easy


....::Приступим::....
Крякмис не требует распаковки для своего в3лома , тк UPX не особо 3аботиться о 3ащите программы . C первого в3гляда кажется , что все очень 3апутанно , но это не так [вы сами скоро в этом убедитесь] . Вводим левые данные ....

name : DrNet
pass : 0987654321

.... И вылетает стандартный мессагбокс .... Вообще маленькие программы очень часто исполь3уют API , а это нам на руку -] . Я предлагаю начать исследование с бряка на GetDlgItemtextA .

0167:0040107E  E81B040000          CALL      USER32!GetDlgItemTextA                      
0167:00401083  85C0                TEST      EAX,EAX                                     
0167:00401085  0F845C020000        JZ        004012E7
Ввели ли мы чего-нибудь в поле name ?
0167:0040108B  83F803              CMP       EAX,03                                       
0167:0040108E  0F8C37020000        JL        004012CB                                     
Name должен быть >= 3
0167:004010B7  A1D2204000          MOV       EAX,[004020D2]   // в eax 4 символа name
0167:004010BC  A393204000          MOV       [00402093],EAX   // эти 4 символа в другое место -]
0167:004010C1  B9A8204000          MOV       ECX,004020A8     // в ecx адрес name
0167:004010C6  51                  PUSH      ECX              // Передаем
0167:004010C7  6893204000          PUSH      00402093         // параметры
0167:004010CC  68BD204000          PUSH      004020BD          
0167:004010D1  E8B9020000          CALL      0040138F         // вот этой ф-ции
0167:004010D6  83C408              ADD       ESP,08           //
0167:004010D9  0F84D0010000        JZ        004012AF         // комп 3ависает , если прыгаем ;]
0167:004010DF  59                  POP       ECX              // в ecx адрес name      
0167:004010E0  8A01                MOV       AL,[ECX]         // AL=1-ый символ password в hex
0167:004010E2  3C37                CMP       AL,37            // сравниваем с 37h='7'
0167:004010E4  0F84BD010000        JZ        004012A7   
Тут происходит прыжок на код , который и3меняет символ password на '#'
                       
0167:004010EA  33D2                XOR       EDX,EDX           // очищение edx
0167:004010EC  BA32000000          MOV       EDX,00000032      // начало и3вращений +]
0167:004010F1  42                  INC       EDX               //
0167:004010F2  C1E204              SHL       EDX,04            //
0167:004010F5  42                  INC       EDX               //
0167:004010F6  42                  INC       EDX               //
0167:004010F7  4A                  DEC       EDX               // Конец и3вращений


0167:004010F8  8B19                MOV       EBX,[ECX]
0167:004010FA  C1EB08              SHR       EBX,08
0167:004010FD  8ACB                MOV       CL,BL
0167:004010FF  80F953              CMP       CL,53
0167:00401102  7404                JZ        00401108
0167:00401104  33D2                XOR       EDX,EDX
0167:00401106  EB01                JMP       00401109
0167:00401108  42                  INC       EDX
0167:00401109  52                  PUSH      EDX
0167:0040110A  6893204000          PUSH      00402093
0167:0040110F  68BD204000          PUSH      004020BD
0167:00401114  E876020000          CALL      0040138F
0167:00401119  83C408              ADD       ESP,08
0167:0040111C  5A                  POP       EDX
0167:0040111D  85D2                TEST      EDX,EDX
0167:0040111F  7505                JNZ       00401126         // продолжение
0167:00401121  E989010000          JMP       004012AF         // облом
Этот кусок добирается до второго символа passa , и если он неравен 'S' , то ксорится edx , в котором находится ре3ультат и3вращений ;] => мессаг "Bad cracker" . Нам надо , чтобы 3начение сохранялось и осуществлялся джамп на продолжение проверки , 3аменяем 2-ой символ passa на 'S'. Продолжаем .........
0167:00401126  33C0                XOR       EAX,EAX
0167:00401128  33C9                XOR       ECX,ECX
0167:0040112A  83F301              XOR       EBX,01
0167:0040112D  33D2                XOR       EDX,EDX
0167:0040112F  B9A8204000          MOV       ECX,004020A8
0167:00401134  33DB                XOR       EBX,EBX
0167:00401136  8A4102              MOV       AL,[ECX+02]
0167:00401139  8A5903              MOV       BL,[ECX+03]
0167:0040113C  8A5104              MOV       DL,[ECX+04]
0167:0040113F  02D3                ADD       DL,BL
0167:00401141  83F301              XOR       EBX,01
0167:00401144  02C2                ADD       AL,DL
0167:00401146  E9C0000000          JMP       0040120B
Складываем hex-3начения 3,4,5 cимвола passa , ре3ультат - в al .
0167:0040120B  33C9                XOR       ECX,ECX
0167:0040120D  B9D2204000          MOV       ECX,004020D2    // в ecx offset name
0167:00401212  3D90000000          CMP       EAX,00000090
0167:00401217  741D                JZ        00401236
0167:00401219  3D96000000          CMP       EAX,00000096
0167:0040121E  0F8401010000        JZ        00401325
0167:00401224  3D97000000          CMP       EAX,00000097
0167:00401229  0F84F6000000        JZ        00401325
Два интересных джампа 00401229 и 0040121E .. Мы прыгаем , если наша сумма = 96 or 97 , те например "222" , 3аменяем в нашем passe 3начения и имеем уже "0S22254321".
0167:00401325  8B01                MOV       EAX,[ECX]       // в eax 4 первых символа name
0167:00401327  83C001              ADD       EAX,01          // первый символ name + 1
0167:0040132A  3A05AD204000        CMP       AL,[004020AD]   // первый символ name + 1 = 6 
                                                                символу pass ? => pass="0S222E4321"
0167:00401330  0F8500FFFFFF        JNZ       00401236        // нет - облом
0167:00401336  E93CFEFFFF          JMP       00401177        // да  - едем дальше ;)

0167:00401177  B035                MOV       AL,35
0167:00401179  3A05AE204000        CMP       AL,[004020AE]
0167:0040117F  0F842A010000        JZ        004012AF
0167:00401185  B036                MOV       AL,36
0167:00401187  3A05AE204000        CMP       AL,[004020AE]
0167:0040118D  0F841C010000        JZ        004012AF
0167:00401193  B037                MOV       AL,37
0167:00401195  3A05AE204000        CMP       AL,[004020AE]
0167:0040119B  0F840E010000        JZ        004012AF
0167:004011A1  B031                MOV       AL,31
0167:004011A3  3A05AE204000        CMP       AL,[004020AE]
0167:004011A9  0F8400010000        JZ        004012AF 
0167:004011AF  B023                MOV       AL,23
0167:004011B1  3A05A8204000        CMP       AL,[004020A8]
0167:004011B7  0F85F2000000        JNZ       004012AF
Тут куча прыжков к облому , и единственное нужное нам сравнение 004011B7 : первый символ должен быть '#' или '7' [помните почти самое начало 004010E4]. Теперь наш pass буде таким "#S222E4321"
0167:004011BD  A0AE204000          MOV       AL,[004020AE]
0167:004011C2  0402                ADD       AL,02
0167:004011C4  33D2                XOR       EDX,EDX
0167:004011C6  8A15AF204000        MOV       DL,[004020AF]
0167:004011CC  3AC2                CMP       AL,DL
0167:004011CE  7405                JZ        004011D5
0167:004011D0  E966010000          JMP       0040133B
Ентот кусок кода сравнивает код 8-ого cимвола passa c суммой [ascii(7 cимвол)+2] => pass : "#S222E4621", дальше идет луп , добираемся до 004011F6 .
0167:004011F6  A0AD204000          MOV       AL,[004020AD]
0167:004011FB  3A05B0204000        CMP       AL,[004020B0]
0167:00401201  0F85A8000000        JNZ       004012AF
0167:00401207  33DB                XOR       EBX,EBX
0167:00401209  EB52                JMP       0040125D
Видим , что 6 cимвол passa должен быть равен 9-ому , иначе - облом .
0167:0040125D  A0B1204000          MOV       AL,[004020B1]
0167:00401262  3C00                CMP       AL,00
0167:00401264  7449                JZ        004012AF
0167:00401266  A0B2204000          MOV       AL,[004020B2]
0167:0040126B  3C00                CMP       AL,00
0167:0040126D  7540                JNZ       004012AF
0167:0040126F  E9FC000000          JMP       00401370
Вот мы и добрались до конца ;] 10 cимвол должен быть [он может быть любым , но должен присутствовать ] . А 11 быть не должно , как и 12,13 ....

....::Концы , Итоги::....
Что мы имеем ? Алгоритм в генерированном passe исполь3ует только 2 cимвола , 3ависящие от name . Пароль имеет фиксированную длину , которая = 10 . При написании keygena я не стал исполь3овать рэндомов для генерации прои3вольных пар , а поль3овался шаблоном "#S222xFHxQ" .

ЗЫ Просьба не ругать 3а кодинг + орф. и грам. ошибки , а также очепятки .

Greetz jump out to [TeaM | TSRh] , UOFG's members [special 2 aSL! 4 HASP -] ] , HangUp , SWW , xtin , HeX , Kernel[X] , ®ove® [FA] , 1580.10-7A , d1gg3r , Freshka , VIT-3000 , not NewLamer , Craig Wardman , CrashMaster , -=789=- , ВиталЯн , KaSa , QWE , nyncuk , mister_durst , ProspeR[Prosper0] , Motya , $h@m@n , Grinder , MaD , Do$y@ , StameskA , [TinageeR] , Ze-0 , Zloy_Root , 3l3m3nt [B-52] , Spl@+ , ab$ , GraF [cDt] , Bill Gay and other .........

Скачать архив с исходниками.


<= Вернуться к статьям


Rambler's Top100