Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Исследование Текстового перекодировщика Штирлиц версия 4.0

Оформил: DeeCo
Автор: http://www.cracklab.narod.ru

Инструменты: 0) SoftIce
1) WDAsm
2) Hex editor (HView).

И вновь я говорю вам здрасте, дорогие мои читатели.
Вот попалась мне в руки чудесная программка, которая настолько хитро перекодирует текстовые файлы, что вы не запутаетесь в различных русских кодировках. Мне она понравилась, если бы не огромный баннер в правом нижнем углу, который существует в течении минуты с момента создания и всячески мешает мне работать. Непорядок.

Я взял файл Shtirlitz.exe и дизассемблировал его в WDAsm. Затем зашёл в String Reference и начал искать подозрительный текст... И нашёл!!! строку : "Shtirlitz.Banner"
Дважды кликаю на неё и попадаю сюда:
:00401924 FF1594954400            Call dword ptr [00449594]
:0040192A 50                      push eax
:0040192B 6800080000              push 00000800

* Possible StringData Ref from Data Obj ->"Shtirlitz.Banner"
                                  |
:00401930 68D0004400              push 004400D0
:00401935 B928764400              mov ecx, 00447628
:0040193A E836530000              call 00406C75
Судя по вызываемым функциям (GetTickCOunt, SetTimer) мы в процедуре обработки баннерного состояния :)

Теперь посмотрим чуть выше:
* Referenced by a CALL at Address:
|:0040182A   			<-- Вот из этого адреса вызывается процедура
|
:00401911 55                      push ebp
:00401912 8BEC                    mov ebp, esp
:00401914 83EC1C                  sub esp, 0000001C
Идём по адресу 0040182A, с которого вызывается эта функция и видим:

:0040182A E8E2000000              call 00401911 <--вызываем процедуру обработки баннера
:0040182F 84C0                    test al, al
:00401831 750E                    jne 00401841  <--если все ОК - прыгаем
Вот то что нам надо, а что если jne 00401841 на jne 00401833 и тогда программа будет всегда думать, что время баннера истекло.
так и есть, я заменил в HView jne 00401841 на jne 00401833, т.е. теперь программа не будет в любом случае прыгать на процедуру вывода баннерного окна.
Но программа при запуске начала ругаться, что исполняемый модуль был изменён. Значит в программе есть CRC проверка. Будем копать дальше.
Запустим программу с помощью SymbolLoader'a из пакета SoftIce, чтобы оказаться в самом начале программы, затем скролим (не заходя в функции) до этого места:
:00435CE3 FF151C974400            Call dword ptr [0044971C]
:00435CE9 50                      push eax
:00435CEA E83D0CFDFF              call 0040692C		<-- Подозрительная функция
:00435CEF 8945A0                  mov dword ptr [ebp-60], eax
:00435CF2 50                      push eax
:00435CF3 E808FDFFFF              call 00435A00		<--это конец программе
:00435CF8 EB21                    jmp 00435D1B
Из того, что функция call 00435A00 делает полный каюк программе я заключил, что перед ней функция call 0040692C что-то представляет из себя!
Я зашёл в неё (F8) и оказался тут:
:0040692C 8B0D88734400            mov ecx, dword ptr [00447388]
:00406932 85C9                    test ecx, ecx
:00406934 7414                    je 0040694A
:00406936 FF742410                push [esp+10]
:0040693A 8B01                    mov eax, dword ptr [ecx]
:0040693C FF742410                push [esp+10]
:00406940 FF74240C                push [esp+0C]
:00406944 FF10                    call dword ptr [eax]	<--что-то скрывают?
Их того, что больше функций нет, я предположил, что функция call dword ptr [eax] тоже очень странна! Я опять зашёл в неё и оказался тут:
Это оказалось самое главное:
:0041FC4E 55                      push ebp
:0041FC4F 8BEC                    mov ebp, esp
:0041FC51 83EC1C                  sub esp, 0000001C
:0041FC54 53                      push ebx
:0041FC55 56                      push esi
:0041FC56 57                      push edi
:0041FC57 8BF9                    mov edi, ecx
:0041FC59 FF7510                  push [ebp+10]
:0041FC5C FF750C                  push [ebp+0C]
:0041FC5F FF7508                  push [ebp+08]
:0041FC62 E84D6EFEFF              call 00406AB4
:0041FC67 84C0                    test al, al
:0041FC69 745C                    je 0041FCC7
:0041FC6B 8BCF                    mov ecx, edi
:0041FC6D E8E9060000              call 0042035B
:0041FC72 8BCF                    mov ecx, edi
:0041FC74 E80F070000              call 00420388
:0041FC79 84C0                    test al, al
:0041FC7B 754A                    jne 0041FCC7
:0041FC7D 8BCF                    mov ecx, edi
:0041FC7F E80B030000              call 0041FF8F
:0041FC84 84C0                    test al, al
:0041FC86 743F                    je 0041FCC7
:0041FC88 68A9010000              push 000001A9
:0041FC8D E8A2040000              call 00420134
:0041FC92 59                      pop ecx
:0041FC93 50                      push eax
:0041FC94 E8074B0100              call 004347A0
:0041FC99 59                      pop ecx
:0041FC9A 8BF0                    mov esi, eax
:0041FC9C 8BCF                    mov ecx, edi
:0041FC9E E8B9030000              call 0042005C	<--Процедура генерации CRC
:0041FCA3 663BC6                  cmp ax, si	<--в ax - сгенерированный CRC, а в si - правильный (0x8560)
:0041FCA6 7426                    je 0041FCCE	<--если совпадают - прыгаем через сообщение о неверном CRC
Здесь необходимо заменить je 0041FCCE на jmp 0041FCCE, чтобы программа всегда думала, что CRC правильный.
Я сделал все необходимые изменения, но при запуске программы главное окно появилось и тут же закрылось, получив всего 5 сообщений (WM_???).
Так, Так, Так! Значит программа где-то ещё делает проверку! Я в этом месте немного помучался, но потом пошел старым и проверенным способом:
запустил программу в SymbolLoader'e и начиная с адреса 0041FC4E прошёлся по НЕ изменнённой программе отладчиком, записав все условные переходы. Затем то же самое проделал с изменённой программой, сравнивая условные переходы с неизменённой программой. И очень скоро по адресу 0041FE9B я натолкнулся на расхождение:
:0041FE9B 750B                    jne 0041FEA8			<--кракнутая программа здесь прыгала, в то время как НЕ кракнутая - НЕ прыгала
:0041FE9D 8B45FC                  mov eax, dword ptr [ebp-04]
:0041FEA0 3B05E0314400            cmp eax, dword ptr [004431E0]
:0041FEA6 7412                    je 0041FEBA			<--кракнутая - не прыгает, не кракнутая - прыгает!
Ура! Я нашёл вторую проверку на некракнутость!
Теперь я просто заменил jne 0041FEA8 на jne 0041FE9D, а
je 0041FEBA на jmp 0041FEBA и........Все заработало! Ура! Баннера больше нет!
И ни на что программа не жалуется!!!

ВсЁ!
А для самых маленьких крак:
----------Начало  крака----------------
Shtirlitz v4.0 Cracker

by vallkor (vallkor@chat.ru)
Shtirl~1.exe
00000C32: 0E 00
0001F0A6: 74 EB
0001F29C: 0B 00
0001F2A6: 74 EB
---------- Конец Крака ----------------
Исследовал и наваял туториал: vallkor//PTDS
E-mail: vallkor@chat.ru
Page : http://vallkor.chat.ru

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay