скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Исследование Текстового перекодировщика Штирлиц версия 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






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook