Привет! Решил я вот написать тутор по краку. Предмет крака - простенькая программка, которая позволяет анимировать 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.




* Извините, но в данный момент существует проблема с подключением к MySQL серверу.

Приносим свои извинения, просим Вас зайти немного позже.