Привет!
Решил я вот написать тутор по краку. Предмет крака - простенькая программка,
которая позволяет анимировать GIF-файлы под именем "Gif movie gear". Версия -
2.62, но, видимо, это несущественно. Меня привлекла малыми размерами (600Kb),
в отличие от ULead, который весит 4Mb. Правда, я его не смотрел.
Я ломал эту прогу давно, еще версию 2.0, но теперь решил, что раз у меня есть
IDA, то надо писать кей-ген.
Необходимые программы:
1. IDA 3.8b by Ilfak G. Взять можно на www.datarescue.com.
2. W32DASM 8.93, взять можно на http://i.am/ctocopok
3. Hex-калькулятор. Взять можно в стандартном наборе Windows'9X.
4. Хотите патчить - возьмите Hiew. CRK-файл - в конце тутора.
-----
Поехали!
Перво-наперво, я взял и загрузил сию прогу в ИДУ. Подождал маленько, получил
готовый листинг. С чего начать поиск процедур, ответственных за проверку моего
номера?
Жмем Alt-Tab в виндах, запускаем жертву, пробуем зарегистрироваться.
Внимательно читаем маты, которые нам высказывает жертва, видимо зная, что
сейчас она падет.
Пытаемся найти такой текст в ИДЕ. Жмем Alt-b, набираем "Invalid Reg", с
кавычками, причем двойными. Текст не нашелся. Блин. Догадываемся, что текст
может быть и в Unicode.
Ищем теперь так: "I"0"n"0"v"0"a"0"l"0"i"0"d".
Найдем несколько совпадений, но все - в сегменте .rsrc. Никаких ссылок на эту
строчку (как, впрочем, и на любую другую в этом сегенте) ИДА нам не дала. Жаль.
Однако, тормозить не будем, а возьмем в руки W32Dasm и натравим его на жертву.
Подождем, пока он не выдаст нам листинг:.. Далее, идем в StrRefs, ищем там нашу
строку, находим ее под номером 40213. Переведем это в Hex. Получили 9D15h.
Догадаемся, что это -- номер ресурса, который подгружается прогой. Странно, что
ИДА такой возможности нам не дает, ну да ладно. Зато умеет многое другое.
Отлично.
Дальше тыкаем в эту строку мышой два раза, находим "possible reference to :".
Приведу соответствующий участок кода, выдранный с помощью IDA.
-----
Show_Invalid: ; CODE XREF: sub_0_42B960+C3 j
push 30h
push 9D15h
push 9D14h
push esi
call sub_0_40BBE0 ; Call Procedure
add esp, 10h ; Add
push 44Fh
push esi
call edi ; Indirect Call Near Procedure
push eax
call ds:SetFocus ; SetFocus:
-----
Наименование метке дал я. W32Dasm тоже даст этот Xref.
Смотрим, а что же побудило нашу прогу перейти по этому адресу, ведь не дОлжно
ей так поступать!
-----
lea ecx, [esp+104h+var_8C] ; Load Effective Address
lea edx, [esp+104h+var_F0] ; Load Effective Address
push ecx
push edx
call Check_reginfo ; Call Procedure
add esp, 8 ; Add
test eax, eax ; Logical Compare
jz Show_Invalid ; Jump if Zero (ZF=1)
-----
Ага. Два Lea, потом их push, потом зовет процедурку, чистим за ней стек,
проверяем eax, и, если он равен 0 - кричим, что мы не регистренные. Все ясно.
Нас ждет эта процедурка, войдем же в нее!
Кое-где я наставлю комментариев..
-----
Check_reginfo proc near ; CODE XREF: sub_0_42B850+89 p
; sub_0_42B960+B9 p
;так еще и не раз, оказывается ее вызывают!
Name_add = dword ptr 0Ch
RegCode_add = dword ptr 10h
push ebx
push ebp
mov ebp, [esp+RegCode_add]
push esi
push edi
cmp byte ptr [ebp+0], 'm' ; Compare Two Operands
jnz Bad_guy ; Jump if Not Zero (ZF=0)
cmp byte ptr [ebp+1], 'v' ; Compare Two Operands
jnz Bad_guy ; Jump if Not Zero (ZF=0)
cmp byte ptr [ebp+2], 'g' ; Compare Two Operands
jnz Bad_guy ; Jump if Not Zero (ZF=0)
cmp byte ptr [ebp+3], '2' ; Compare Two Operands
jnz Bad_guy ; Jump if Not Zero (ZF=0)
. . . . .
Bad_guy: ; . . .
pop edi
pop esi
pop ebp
xor eax, eax ; Logical Exclusive OR
; Обнуляет eax(!!) Не надо нам этого!
pop ebx
retn ; Return Near from Procedure
Check_reginfo endp
-----
Итак, понятно, что первые 4 символа регкода - 'mvg2'.
-----
mov ebx, offset off_0_447290
loc_0_42B7C5: ; CODE XREF: Check_reginfo+56 j
mov edx, [ebx]
or ecx, 0FFFFFFFFh ; Logical Inclusive OR
mov edi, edx
xor eax, eax ; Logical Exclusive OR
repne scasb ; Compare String
not ecx ; One's Complement Negation
dec ecx ; Decrement by 1
mov edi, edx
mov esi, ebp
xor eax, eax ; Logical Exclusive OR
repe cmpsb ; Compare Strings
jz short Bad_guy ; Jump if Zero (ZF=1)
add ebx, 4 ; Add
cmp ebx, offset aMvg2s00 ; Compare Two Operands
jb short loc_0_42B7C5 ; Jump if Below (CF=1)
-----
Это - проверка на широко известные серийные номера к жертве. Довольно топорная.
Нас она не волнует, вряд ли кто-то публиковал в и-нете серийный номерок для
нашего имени!
-----
cmp byte ptr [ebp+4], 's' ; Compare Two Operands
jnz short loc_0_42B7EF ; Jump if Not Zero (ZF=0)
inc ebp ; Increment by 1
-----
Если после mvg2 стоит 's', значит, это - Site license. Что она значит - не
знаю, но номер у нее на эту s длиннее.
-----
loc_0_42B7EF: ; CODE XREF: Check_reginfo+5C j
add ebp, 7 ; Add
push ebp
call _atoi ; Call Procedure
-----
Вот она и есть - главная точка программы. Переводим последние четыре цифры
номерка в hex.
-----
mov edx, [esp+18h] ; Адрес имени.
add esp, 4 ; Add
mov edi, edx
xor ecx, ecx ; Logical Exclusive OR
mov dl, [edx]
mov esi, 6Feh ; Начальное значение
test dl, dl ; Logical Compare
; Имя закончилось?
jz short loc_0_42B836 ; Jump if Zero (ZF=1) - Угу
loc_0_42B80E:
inc ecx ; Increment by 1
movsx edx, dl ; Move with Sign-Extend
mov ebx, ecx
imul ebx, edx ; Signed Multiply
add esi, ebx ; Add
cmp esi, 0DFDh ; Compare Two Operands
jle short loc_0_42B827 ; Jump if Less or Equal (ZF=1|SF!=OF)
sub esi, 0DFDh ; Integer Subtraction
loc_0_42B827:
cmp ecx, 0Ah ; Compare Two Operands
jle short loc_0_42B82E ; Jump if Less or Equal (ZF=1|SF!=OF)
xor ecx, ecx ; Logical Exclusive OR
loc_0_42B82E:
mov dl, [edi+1]
inc edi ; Increment by 1
test dl, dl ; Logical Compare
; Имя закончилось?
jnz short loc_0_42B80E ; Jump if Not Zero (ZF=0)
-----
Посчитали контрольную сумму по имени. занесли ее в ESI. Кстати, если имени нет,
то контрольная суммы должна быть 6Feh, то есть последние четыре цифры номера -
1790 ! они даже не проверяют, а есть ли имя!!
loc_0_42B836:
cmp esi, eax ; Compare Two Operands
jnz short Bad_guy ; Jump if Not Zero (ZF=0)
mov eax, 1 ; eax=1 -- Registration correct
pop edi
pop esi
pop ebp
pop ebx
retn ; Return Near from Procedure
Bad_guy:
pop edi
pop esi
pop ebp
xor eax, eax ; Logical Exclusive OR
pop ebx
retn ; Return Near from Procedure
Check_reginfo endp
; ---------------------------------------------------------------------------
Таким образом, на экране видны инструкции, считающие последние четыре цифры
сернума. Этого достаточно, чтобы написать кей-ген.
Можно просто пропатчить - для этого в первой же инструкцией по адресу Bad_guy
надо поставить jump на mov eax, 1. :
[BeginXCK]-----------------------------------
і Description : [W95] Gif Movie Gear 2.62 crack by Ctocopok
і Crack subject : Shareware limitation
і Crack made by : ctocopok
і Crack made at : 26-03-1999 01:28:19
і Comments : Shitty protection...
і Protection : [--------------------] %01
і Time for hack : 00 hours 15 minutes 00 seconds
і Type of hack : JMP Correction
і Used packer : None
і Used unpacker : None
і Src language : Visual C/C++
і Price : $30
і Used tools : IDA 3.8b, W32Dasm 8.93, Calculator, HiEW 6.02
і Under Music : ROBERT MILES
[BeginCRK]-----------------------------------
[W95] Gif Movie Gear 2.62 crack by Ctocopok
Shareware limitation
MOVGEAR.EXE
0002AC44: 5F EB
0002AC45: 5E F4
[EndCRK]-------------------------------------
[EndXCK]-------------------------------------
Кейген пишите сами, или возьмите у mr.Fixit
Счетчик запусков находится в реестре в разделе 'lamani'.
Best regards,Ctocopok (c) 1999/03/26.
P.S.Сегодня решил посмотреть, как обстоят дела с новыми версиями программы. Что ж, автор не тратит времени зря. В целях, видимо, сокращения
размера программы была убрана проверка на "левые" номера. Кроме того, "неизменяемая" часть регистрационного кода стала вместо mvg2 - mg37.
Ну, и, разумеется, смещения в файле стали другими. Однако ж, номера ресурсов для "Invalid regcode" остались те же - 9D14h 9D15h.
Для версии 3.0 я кейген пока писать не стал, хотя он и крайне похож на 2.6, а сделал за пять минут патч:
000314A5 : 33 40
000314A6 : C0 90
что заменяет xor eax, eax на inc eax NOP.
В результате программа регистрируется с любым кодом.
23 Dec 2000.