Автор: [RU].Ban0K! <ru.ban0k@mail.ru>
Olly Debuger v1.09d HIEW или иной редактор Инструменты как всегда у меня сайте IN.FATAL.RU
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... то если мы будем патчить на прямую... то тут выйдет небольшая ошибка... несколько последующих байт сменят "ориентацию"... т.е. просто патч одной ячейки здесь уже отпадает... Но и мы не хилые.. мы сделаем немного по-другому... по умнее!
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С начало видимо вычисленный хэш сравнивается с правильным... и на этом всё... прога идёт либо на установку "! REGISTERED !"... либо на "[-= UNREGISTERED =-]". Отсюда следует, что нам надо бы заменить:; \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
00404069 |. 75 12 JNZ SHORT clab2.0040407Dна:
00404069 |. 74 12 JZ SHORT clab2.0040407DИ всё... мы нашли ячейку для патча... (Если бы его можно было бы сделать просто так...)
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)
Комментарий Bad_guy'я от 1 сентября 2003 года: На этот раз Рубанок немного увлекся и занялся крэкми, который написан для пусть и не новичков, но для тех, кто мало знает про распаковку программ и хочет потренироваться. Подобрать же серийный номер к этому крэкми - дело достаточно сложное, но выполнимое - такой взлом был осуществлен.
Рубанок говорит, что: "Bad_guy допустил ошибку, ... НАДО ШИФРОВАТЬ ПУСТОЕ МЕСТО!!!". Ну, начнем с того, что в этом крэкми зашифрована только секция кода и ресурсов, к тому же один из взломов данного крэкми, который был проведен крэкером по имени -= ALEX =- показал, что если запаковать даже абсолютно все секции, то в заголовках все равно останется место, чтобы вставить туда свой код inline патча. Единственным спасением в этом случае может стать только грамотно написанная проверка CRC или процедура восстановления заголовков.
Материалы находятся на сайте http://cracklab.narod.ru/doc/