![]() |
Solutions
Описание: Это тема представляет из себя сборник решений наиболее интерсных задачек(CrackMe). Думаю новичкам и не только будет полезно почитать решения таких людей как hidden, ProTeuS, Ra$cal. ИМХО не писать же из-за пары интересных приёмов статьи. Условие: Не выкладывать решения до прохождения, расчитанным автором crackme, определённого числа людей или истечения срока давности! Формат: Придерживайтесь следующего формата! Код:
CrackMe: ... |
..::[FaTmiKE 2oo5]::.. CrackMe #2
CrackMe: ..::[FaTmiKE 2oo5]::.. CrackMe #2 Цель: закейгенить Сложность: легко Коментарий: KeyGen писать не будем, только найдём способ генерации. link: http://www.crackmes.de/archive/ Решение: Обходим упаковщик, тк распаковка не воходит в наши планы. Так и не посмотрел какой но судя по pusha - popa - UPX. Два способа обхода этого препятствия: f8 > hr esp > run > hd esp или Ctrl-F > popa > f2 > f9 > f2 > f8 В первую очередь пореверим крякмис на возможность String Reference взлома. Другими словами пороверим наличие в открытом виде таких строк, как "Registred", "good","sucsessfull","Cool","Xaker","Cracker","pas sword". Для этого жмём F10 (эквивалент нажатия на правую клавишу), Search for > All referenced text strings. Ничего полезного((! Поищем функции ввода, вывода, и проставим бряки. Для этого в command bar'е наберём "bpx MessageBoxA". Перед нами предстали все апи. Но MessageBoxA и GetWindowTextA среди них нет. Но где то они вызываться должны!! С этими словами, я полез в Executable modules(Alt-E). Выбираем user32.dll, тк именно там храняться интересующие нас функции, и Ctrl-N. Ищем MessageBoxA, enter (входим в функцию). Ставим бряк на retn 10. Почему? Вдруг автору крякми вздумается украсть пару байт или проверить первый байт на присутствие int 3 (это breackpoint F2, можно так сказать). F9. Вводим что-нибудь и жмём "Go!". Вылетает сообщение, о необходимости регистрации. Жмём Ok и брякаемся на retn 10. F8 и мы вновь в программе. Поднимимся немного выше. Что то маловато кода. Только функции зашифровки/расшифровки текста и MessageBoxA. Код:
004018E0 3E:8B0D 78924000 MOV ECX,DWORD PTR DS:[409278] ; Crackme2.004010F0Проскроллируем ниже, поищем функцию GetModuleHandleA. Код:
00407006 FF15 14804000 CALL DWORD PTR DS:[408014] ; kernel32.GetModuleHandleAВот и то, что мы искали: Код:
004013E9 6A 00 PUSH 0push ADDR DlgProc push NULL push ADDR DlgName push hInstance call DialogBoxParam или более привычный для меня вариант invoke DialogBoxParam, hInstance, ADDR DlgName,NULL,addr DlgProc,NULL Нам нужен адрес функции диалогового окна, DlgProc равный, в нашем случае, 00401450. Отправляемся по нему, Ctrl-G > 00401450. Вот она, DlgProc, во всей красе. Код:
00401450 55 PUSH EBP ; DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAMКод:
0040145F 0F84 BC020000 JE Crackme2.00401721 ; WM_CLOSEКод:
0040146A 0F84 22020000 JE Crackme2.00401692 ; WM_INITDIALOGWM_*** - сообщения от Windows, которые должна обработать DlgProc. Код:
WM_CLOSE equ 10hmov eax,wParam wParam - ID кнопки, меню и тп. Код:
0040147E 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]Код:
00401481 05 18FCFFFF ADD EAX,-3E8Код:
00401486 83F8 09 CMP EAX,9Код:
0040148F 33C9 XOR ECX,ECXСтавим бряк на jmp и жмём f9. Вводим вместо имени и пароля 01234, 56789 соответсвенно. Для удобства все символы разные. Посмотрим, что делается после нажатия "Go!". Мы попадаем на функцию. Код:
004014E3 FF15 58924000 CALL DWORD PTR DS:[409258] ; Crackme2.004018E0Чтож трейсим)). Ниже встречаются вызовы GetDlgItemTextA. Введёные слова записываются в стек. После второй GetDlgItemTextA встречаем: Код:
0040154C 837D 10 13 CMP DWORD PTR SS:[EBP+10],13Код:
00401556 8A0D 1C924000 MOV CL,BYTE PTR DS:[40921C]Проходим проверки, всё гуд)). Трейсим!! Дальше нам встречается цикл: Код:
00401592 0FBE4C05 98 MOVSX ECX,BYTE PTR SS:[EBP+EAX-68]И умноножение на некое DEADBEFF. Код:
0040159E 69F6 EFBEADDE IMUL ESI,ESI,DEADBEEFКод:
004015A4 8975 0C MOV DWORD PTR SS:[EBP+C],ESIКод:
push 75AC7566 ; - наш "хэш"))Код:
004015C5 8A55 CC MOV DL,BYTE PTR SS:[EBP-34]Формируем новый пароль a75b-cACd-e75f-g66h. Ну ещё добавил ab cd ef gh для наглядности. Хотя вместо них можно поставить что угодно. Пробуем пароль. Попадаем в ольку, проходим все прверки. Дальше идут функции GetDlgItem, EnableWindow. Код:
ControlID = 3EF (1007.)Момент истины, барабанная дробь)). Жмём "Go!". Мдя... Только для зарегестрированных пользователей! Крякмис всётаки не хочет нас таковыми считать)))! Придётся перезапускаться. Ставим старые breackpoint'ы. Вводим старые имя и пароль. Проходим проверки. И вот, что мы проглядели: Код:
0040164D 890D 58924000 MOV DWORD PTR DS:[409258],ECXКод:
004014E3 FF15 58924000 CALL DWORD PTR DS:[409258] ; Crackme2.004018E0Код:
004014E3 FF15 58924000 CALL DWORD PTR DS:[409258] ; Crackme2.004012B0Код:
004012B0 55 PUSH EBPКод:
004012B9 0FBE05 18924000 MOVSX EAX,BYTE PTR DS:[409218]xx000000 00yy0000 0000zz00 000000uu Затем с помощью or собирает всё в один регистр ecx xxyyzzuu в нашем случае: ECX 61626364 или abcd ECX сохраняется и тоже самое проделывается с efgh. Далее идёт некая функция зайдём в неё. Код:
00401115 8B15 48914000 MOV EDX,DWORD PTR DS:[409148]Код:
00401124 33D1 XOR EDX,ECXКод:
0040112C 8915 48914000 MOV DWORD PTR DS:[409148],EDXКод:
00401776 813D 98914000 E8>CMP DWORD PTR DS:[409198],97BE8Придётся опять перезапускать и проходить до того места где всё расхоривается. Улавиливаете чем хорить байты в 409198 и 40915c. Правильно тем чем сравнивется. итак до расхоривания у нас было: Код:
00409198 A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]Код:
4b4c2ca4Password: K75E-WACL-S75H-I66T Проверяем! |
hiddCrackMeImp
CrackMe: hiddCrackMeImp Цель: найти последовательность действий для регистрации Сложность: средне Решение: Запускаем, видим функцию. Нужно зайти, тк лично у меня по f8 прога упала. Код:
00401BB7 > E8 16000000 CALL HidCreck.00401BD2Код:
00401BE2 8D41 FF LEA EAX,DWORD PTR DS:[ECX-1]Код:
00401BF3 C3 RETNКод:
00401009 E8 02040000 CALL HidCreck.00401410Код:
0040143E 66:8338 8B CMP WORD PTR DS:[EAX],0FF8BКод:
EAX 77D48666 user32.RegisterHotKeyКод:
0006F848 00401BB5 /CALL to RegisterHotKey from HidCreck.00401BB0Код:
0006FD80 00401BB5 /CALL to RegisterHotKey from HidCreck.00401BB0Код:
0006FD80 00401BB5 /CALL to RegisterHotKey from HidCreck.00401BB0Код:
0006FD80 00401BB5 /CALL to RegisterHotKey from HidCreck.00401BB0Ну вот!! registred)) Лично мой путь был более длинным(( Я ставил бряк на CreateWindowExA, искал функцию окна, там нашол сравнение при получении uMsg равного 111h и ток потом до меня допёрло, для чего нужна была эта функция. Я просто не ждал, что регистрация будет проходить так необычно)) |
First CrackMe by ProTeuS
CrackMe: First CrackMe by ProTeuS Цель: найти верный пароль Сложность: средне link: http://www.forum.antichat.ru Решение: Запускаем, вводим чтонить! Брякаемся по 004578AE. Код:
004578AE 21 DB 21 ; CHAR '!'адрес возврата (помимо SEH-обработчика). Смотрим в стек. Так оно и есть)). Код:
0012F920 004579C5 RETURN to CrackMe.004579C5Код:
004579B7 . 64:FF30 PUSH DWORD PTR FS:[EAX]Код:
0045796C . E8 3FE5FAFF CALL <JMP.&kernel32.GetCurrentProcess> ; |[GetCurrentProcessКод:
0045793C . 55 PUSH EBPВводим чтонить. И брякаемся. Дальше трейсим. Код:
0012F5F8 00457977 /CALL to ReadProcessMemory from CrackMe.00457972Код:
0045798D . 3013 XOR BYTE PTR DS:[EBX],DLс push ebp. Алго криптования нам известен)). 99 xor 55 = 0CCh = 204d Пасс: 204 |
CrackMe: CrackMe by [Great]
Цель: найти верный пароль Сложность: средне Решение: Выложу сам свое решение нормальное :) Во-первых прога запакована UPX'ом, поэтому быстро распаковываем. Открываем прогу в олли, ждем окончания анализа, запускаем по F5, и.... она закрывается. Причем вместе с олли. Аналогичная фишка и в других отладчиках, например, встроенном в MS Visual Studio. Что-то тут не так :) Вообще можно обойтись плагином IsDebuggerPresent hide для олли, но ввиду того, что он есть не у всех, мы пойдем влоб) Код:
004010B5 |. B8 01000000 MOV EAX, 1Код:
0040120F . FF55 FC CALL DWORD PTR [EBP-4] ; kernel32.IsDebuggerPresentКод:
004012DA . 68 90304000 PUSH ucrackme.00403090 ; ASCII "ertwrwe"Код:
00401365 . 0FBE8A 903040>MOVSX ECX, BYTE PTR [EDX+403090]Перезапускаем, вводим super_mega_lamer_password и Registration completed! |
CrackMe #3 by anorganix
CrackMe: CrackMe #3 by anorganix Цель: найти верный пароль Сложность: средне link: http://arteam.accessroot.com/releases/ (Crackmes 1 To 8 By Anorganix) Решение: Грузим прогу в Olly! Код:
100A45BC > 9C PUSHFDКод:
100A482D 9D POPFDКод:
10053B48 55 DB 55 ; CHAR 'U'F10 > Analysis > During next analysis ... > command. После третьей команды я опять попробовал нажать Ctrl-A и, о чудо, Olly всё проанализировала как надо!! Код:
10053B48 . 55 PUSH EBPКод:
10053B6A > E8 3903FBFF CALL CrackMe3.10003EA8Код:
10053657 |. 6A 04 PUSH 4Код:
0012FC6C 1005367F /CALL to CreateProcessA from crackme3.1005367AКод:
1005373F |. E8 002AFBFF CALL <JMP.&kernel32.ResumeThread> ; \ResumeThreadОткрываем карту памяти и вот что замечаем: Код:
Memory map, item 15Код:
00400068 BC950700 DD 000795BC ; AddressOfEntryPoint = 795BCКод:
0012FC80 100536F6 /CALL to WriteProcessMemory from crackme3.100536F1Код:
$+795BC > 9C PUSHFDF9 и открывается новый процесс Olly! Ура мы на EP! Возвращаем на место pushf и обходим пакер, благо использовался старый! Мдя.. На первый взгляд ничего не изменилось... Код:
00454DFC 55 PUSH EBPПопадание на ep нам практически ничего не дало! Пытал прогу и на String reference и бряки на апи ставил, естественно на последние байты, но это ничего не дало. ппц! Но у меня в запасе был ещё один приём. Я ввёл dimok и вылетело сообщение о неправильности пароля. В ArtMoney нашёл адреса, в которых лежит это слово. Поставил на них бряки и ещё раз нажал ввод! Бряк сработал мгновенно я оказался внутри какойто функции! Посомотрим на стек, там несколько раз встречается слово dimok. Но мы ищем первый адрес вазврата в секцию кода и находим Код:
0012F45C |00437B10 RETURN to CrackMe3.00437B10 from CrackMe3.00406278Код:
00437B03 50 PUSH EAXКод:
00437B1A 8B53 08 MOV EDX,DWORD PTR DS:[EBX+8]Код:
0012F93C 00DB2448 ASCII "dimok"Код:
0012F950 |00434C7A RETURN to CrackMe3.00434C7AКод:
004549BC 55 PUSH EBP |
Ra$cal KeyGenMe 2
Написал как автор крякми. То есть на что я делал ставку. Ждём солюшена человека, взломавшего сей крякми... Итак. Основная фича этого творения - антиотладка используется с интересной целью. Не просто выдаёт месаджбокс и выходит. А данные получаемые от проверок изменяют внутренний ключ, который участвует в проверке. Таким образом если программа отлаживается и хоть одна проверка обнаружила отладчик, то найденный ключ не подойдёт при запуске программы без отладчика. Теперь про реализацию... Сначала была придумана константа - 0x7DA3EF10. Далее вспомнил какие проверки знаю. Всего решил сделать 5 штук. Соотв решил какие биты в константе должны быть изменены. 3 бита должны быть изменены, 2 должны остаться. 0x7923EF14. Далее для сложности обнаружения обращений к этому дворду (в олли очень просто найти всю работу с конкретным адресом в секции данных. то есть легко локализовать и изменения и использование этой константы) сделал так. Дворд был разбит на 2: ControlDW_L = 0x5ca3ef14 и ControlDW_H = 0xba617923. В сладших словах находятся части константы. А для собсно скрытия обращений сделал ещё две переменные. Итог - static DWORD DummyBefore = 0x547298f0, ControlDW_L = 0x5ca3ef14, ControlDW_H = 0xba617923, DummyAfter = 0xba45910f; Компилятор сделает так что эти переменные в памяти находятся последовательно. Следовательно чтоб обратиться к нужной достаточно получить адрес подставной переменной и и прибавить/удалить 4. Или 8. Вобщем как это работает: Код:
_asm{Для реализации идеи пришлось придумывать, как связать возвращаемое значение проверки (причём не просто cmp jnz, а именно то значение, которое возвращает апи(например) при наличии отладчика и при его отсутствии). Так для IsDebuggerPresent задумано, что при отсутствии отладчика он вернёт 0. То есть если вернёт 1 константа будет испорчена... Код:
temp = IsDebuggerPresent();Код:
004016D0 >/$ 55 PUSH EBPКод:
00401630 >/. 55 PUSH EBPУстановка бряка в олли осуществляется просто. В целевой процесс пишут байт 0xCC по нужному адресу. Поэтому я читаю 4 байта с конца функции (куда я ожидаю установки бряка). Код:
004016B2 |. 8B51 68 |MOV EDX,DWORD PTR DS:[ECX+68]Код:
0040163F |. 8B0D 28204000 |MOV ECX,DWORD PTR DS:[MemoryCrc]Эта проверка проверят, установлен ли хардбряк. Для этого вызывает исключение и проверяет переданнвый контекст потока в функцию обработчик исключения, в котором было исключение. Отладчик для полноты картины ставит в контекст ВСЕХ потов хард бряки, заданные пользователем в каком-то одном. Чтобы мы не пропустили никаких интересующих нас событий. Следовательно, даже если бряк поставлен в другом потоке, в нашем созданном потоке он тоже будет. Поэтому в контексте можно проверить их наличие. Код:
00401748 |. 33DB XOR EBX,EBXСобсно есть ещё проверки, но логика их такая же. Перечислю только их суть - проверка отладочного порта и фича с обработкой CloseHandle с неправильным параметром. Теперь что с алгоритмом. Как я и говорил он простой. Напишу тока код моего генератора Код:
DWORD Control = 0x7DA3EF10; |
CrackME by _taha_
CrackMe: CrackME by _taha_(мой тобишь)
Цель: найти верный пароль Сложность: легко link: искать в разделе крякмисы Поскольку на мой кякмис было только три ответа, я решил последовать примеру Rascal’a и написать небольшой солюшен. Сейчас я расскажу о неновых, зато довольно интересных, антиотладочных приёмах затронутых в этом крякмисе. Из множества приёмчиков я отобрал именно эти. Итак начнём... Открываем файл в OllyDbg. Первое, что бросается в глаза не стандартное начало. Это явно не стартап.. Первое что вы увидели это переход, войдя в него - инкремент [ESP], затем стандартное продолжение установки обработчика исключений. Код:
0040103C |. 64:FF35 00000>PUSH DWORD PTR FS:[0] ; |Код:
call opaКод:
00401000 >/$ E8 34000000 CALL _CrackME.00401039Код:
0040101E |. 66:3115 26304>XOR WORD PTR DS:[403026],DXДалее вроде всё тихо, всё за исключением одной функции 0040106C |. E8 6A010000 CALL _CrackME.004011DB Код:
mov eax, fs:[30h] ;Код:
004010B9 . E8 4C010000 CALL <JMP.&kernel32.IsDebuggerPresent> ; [IsDebuggerPresent00401145 . E8 3D000000 CALL _CrackME.00401187 Исследовав внутренности этой функции, вы должны были понять, что хэшируется. Но это не всё! Одна из главных “интересностей” крякмиса скрывается ИМЕНО ЗДЕСЬ. Код:
0040118E |. 8B1424 MOV EDX,DWORD PTR SS:[ESP]Далее идёт вызов Int1, что должно повлечь исключительную ситуацию. Фитча в том, что Olly не считает прирывание INT1 исключением если оно идёт с префиксом, а вот Windows считает. Код:
0040114A . F3:64: PREFIX REP: ; Superfluous prefixКод:
004011B4 /$ 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C] ; Structured exception handlerС анти дебагом всё! Дальше идёт сравнение: Код:
0040114D . 3B05 26304000 CMP EAX,DWORD PTR DS:[403026]Если вы проделали всё правильно, то у вас должно храниться по этому адресу число 2D5253F3h. Теперь о том как найти пароль. Ведь хэш – это необратимое преобразование, следовательно ничего кроме брута вам не остается. Как вы должны были подметить, пароль состоит из 4’х символов. К тому же, как я написал пароль состоит из русских букв. Заметьте это значительно снижает область брута. Приводить код брутера не буду, только дам вам вот эти линки: http://www.reversing.be/article.php?story=20050302175850923&query=brutefor cing http://www.reversing.be/article.php?story=20050414211341413&query=brutefor cing Замечу только, что если всё проделанно верно, то пароль брутится считанные секунды. |
CrackMe: CrackMe by taha
Цель: найти пару имя+ключ Сложность: легко link: в разделе реверсинг Решение: В этой статье я постараюсь максимально подробно описать взлом данного крекми, но если у вас есть замечания/дополнения/ прием не нравится какой-либо (или способ лучше есть), пишите в пм или icq-буду рада конструктивной критике. Приступим Итак, загружаем crackme в отладчик Entry point Код:
00401185 > B9 C7010000 MOV ECX,1C7Шифровщик простой - ксорный. Код:
004011A7 80340E 18 XOR BYTE PTR DS:[ESI+ECX],18 ; с каждым проходом значение уменьшается, двигаемся к началуВ esi в самом начале цикла 400FFF=>адрес с которого начинается расшифровка=00400FFF+185=401184. Так как ecx после каждого прохода цикла декрементируется => расшифровываться код начинает с конца. Самый конец цикла Код:
как расшифровывается код. Пока идет расшифровка кода - управление передается на адрес 004011A7. В ecx в этот момент считается количество оставшихся байт... Когда код расшифруется- джамп передаст управление на адрес 00401001... Начинаем трассировать. Вызов функций в уже раскриптованом коде имеет вид, подобный этому Код:
00401035 . /EB FF JMP SHORT CrackME.00401036инструкцию call [адрес] (опкод FF15 хххххххх). Но это еще не все. Довольно неприятна и такая конструкция Код:
00401090 . /74 01 JE SHORT CrackME.00401093Код:
Код:
00401035 . /EB FF JMP SHORT CrackME.00401036Код:
00401003 /EB FF JMP SHORT CrackME.00401004После работы скрипта код выглядит так Код:
00401023 |> \830424 09 ADD DWORD PTR SS:[ESP],9Теперь поиск всех вызовов имортируемых функций (Search for -> All intermodular call's). Отлично. Найдены все функции. А их всего ничего USER32.DialogBoxParamA kernel32.ExitProcess USER32.GetDlgItemTextA USER32.GetDlgItemTextA SHLWAPI.StrToIntA USER32.MessageBoxA USER32.EndDialog И проанализировано верно) Что ж. Пора запускать программу. Жмем f9. Высвечивается диалог для ввода имени и пароля. Теперь назначение по крайне мере двух вызовов функции GetDlgItemTextA нам ясно) Первый читает имя, второй-код. Это я узнала, загрузив файл в Restorator и посмотрев идентификаторы эдитов для ввода имени 101 (в хексе -65h), а пароля-102 (66 в хексе). Теперь смотрим на параметры функции GetDlgItemTextA. В первом случае как раз в качестве ид-а идет 65h, а во втором - 66h. После прочтения имени и пароля вызывается функция StrToIntA, принимающая в качестве параметра указатель на строку, которую требуется перевести в число. В качестве параметра в данном случае-строка с паролем. Из этого можно сделать вывод, что пароль состоит из цифр. Потом берется имя юзера и с ним проводятся следующие манипуляции Код:
004010B9 . 52 PUSH EDX ;строка с паролемКод:
Код:
И еще. Сначала я, как порядочная, ввела свой семисимвольный ник, но крекми наглым образом проигнорировал этот факт и урезал до 6-ти символов.... Хм( Присмотрелась к функции чтения имени Код:
В общем далее вникать в суть происходящего дальше не имеет смысла, так как у нас есть функция StrToIntA. Как она работает-известно. Что должно получится-нам тоже известно - это содержимое регистра cx. Возьмем, например, число 1111 и переведем его в хекс. Получим 457. Введем 1111 в поле пароль и посмотрим что вернет функция StrToIntA. А вернет она..... то самое 457... Это означает, что в поле пароля мы должны ввести число, полученое путем перевода регистра cx в десятичную систему. Все элементарно=) Вот и все... |
Crackmy2 by Xserg
CrackMe:
Цель: найти верный пароль Сложность: автором позиционируется как "сложно" Коментарий: предупреждаю - буду краток. link: http://ifolder.ru/5872875 Решение: Запускаем крякми... Имя, пароль... Вводим чён-ть... Need good password. Запускаем под Олей - debug detected. Ну что ж, будем лечить. Трассируем программу с начала. Узнаём начало DialogProc 401810. Оставляем бряк после DialogBoxIndirectParamA, так как там мы окажемся после ввода пароля, а так же ставим бряк на саму DialogProc. Пускаем программу (F9) брякаемся, идём - всё пролетает до RETN 10. Поэтому жмём ещё раз F9. Видим - по адресу 401836 создаётся таймер. Смотрим процедуру таймера - ничего интересного она не делает - что-то увеличивает, что-то уменьшает и тп. Значит ясно - нужен для антиотладки. Отключать его нельзя, ибо вероятна проверка на его запущенность. Соображаем... А давайте поставим огромный интервал? Доходим до самого вызова, а дальше в стеке правим в 12FC88 100ms на сколько влезет. Например 0FFFFFFF ms (не забываем писать байты в обратном порядке!). Теперь снимаем бряк с 401810 - ничего нового уже не происходит, происходит обыкновенная прорисовка окна. Посмотрим дальше. Видим взятие имени и пароля. Теперь либо ставим бряк на попадающиеся на глаза команды по адресам типа 40185F - GetDlgItem, то есть те команды, которые мы только что проскачили, трассируя программу до формы, либо ищем эти команды в прыжках на импортируемые функции, видим там Local call from xxxx и ставим бряк на xxxx. F9. Вводи чтон-ть в логин и пасс, нажимаем ок. Брякаемся на GetDlgItem. Трассируем... До EndDialog ничего интересного нет. После EndDialog трассировать бесполезно, поэтому нажимаем F9 и ждём пока сработает наш бряк в 401802. Сработал! Трассируем (заходя во все call'ы)... Видим создание потока. Наверняка тоже для антиотладки! Смотрим ThreadFunction... 40101D... Там что-то страшное... ладно, поставим туда бряк и попробуем запуститься по F9. Трассируя её, смотрим, что у нас там происходит. Проверяется содержимое dword [403063], если там ноль, то выводим сообщение про отладчик, иначе уменьшаем это значение на 1. Сейчас там 1F. А давайте поставим FFFFFFFF. Итак, у нас есть очень много времени, чтобы закончить это крякми. Снимем бряки и запустим его выполняться. (В опциях надо поставить, чтобы все ошибки обрабатывала программа). Ждём-с... Замечательно! Пишет, что пасс неверен, но ничего не говорит про отладчик! Посмотрим на код - в нём появились команды типа MessgeBox, появились слова "need good password" Запомним то место, где мы видим MessageBox(401567), перезапустим программу и, сделав те же манипуляции с таймером и с числом 1F, поставим бряк Memory Breakpoint on write на 401567. Смотрим после каждого бряка, что там. Однажды видим появился call! Смотрим назад - там "Congratulations", а перед этим проверка пароля. Нехитрый анализ показывает, что прыжок в случае неверного пароля идёт с 4014AD. Поставим бряк на предшествующий CMP. Жмём F9... Попадаем как раз туда. теперь осталось собрать пароль :) Побайтно смотрим буковки из AL... Для имени Ter я получил пароль X43Vr3U6qQ74Up9Q. Закрываем всё, запускаем крякми, вставляем буковки... Цитата:
|
| Время: 06:42 |