Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Написание КейГена для PowerArchiver 2003 8.xx

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: V0ldemAr <v0ldemar@mail333.com>

Инструменты:
1) OllyDebuger
2) W32Dasm - как то статтю писать надо
3) Masm32 - только им и пользуюсь для написания кейгенов

Ну Let’s Go.
Когда то я только и мог что узнать серийник к этой проге ну а теперь:
"Заработал много екпириенса и получил левел ап" © Goblin
Короче мой метод нахождения места генерации:
Открываем в Олли прогу ждем пару сек и далее
пускаем прогу по F9 выскакивает баннер с кнопками и на одной из них
написано что-то типа "Enter Reg Code" жмем видим нужно ввести имя и код
вводим имя: V0ldemAr код: 12344321
Переходим в Олли и нажимаем Ctrl+N в появившемся окне ищем LoadIconA и
по правой кнопке мыши устанавливаем брейк на импорт для чехлов:
Toggle breakpoint on import.
Почему на LoadIconA, потому что месага о неверном коде
имеет иконку, а прога написана на Дельфях потому эта функ.
Все можно жать ОК.


00601F22 MOV EAX,POWERARC.0060200C ; ASCII "Incorrect registration... "
После где то 3-х выходов по Ctrl+F9 и конечно нажатия кнопке ОК
на месаге.

00601F27 CALL POWERARC.0066C328
Мы здесь, правда интересно :)

00601F2C CMP BYTE PTR DS:[C003EC],3
00601F33 JNZ POWERARC.00601FCC
00601F39 MOV EAX,EBX
00601F3B CALL POWERARC.00452B38
00601F40 JMP POWERARC.00601FCC
00601F45 MOV EAX,DWORD PTR DS:[6AEE68] Прыжок сюда если код хорош
Видим что ниже у нас хорошая месага но как туда попадают.
Смотри выше.
00601FB2 MOV CX,WORD PTR DS:[602000]
00601FB9 MOV DL,2
00601FBB MOV EAX,POWERARC.006020C0 ; ASCII "Registration accepted!..."
00601FC0 CALL POWERARC.0066C328
00601FC5 MOV EAX,EBX
00601FC7 CALL POWERARC.00452B38
00601FCC XOR EAX,EAX

А вот как
00601ECE MOV EDX,DWORD PTR SS:[EBP-8] Передают наше имя и код
00601ED1 MOV EAX,DWORD PTR SS:[EBP-4]
00601ED4 CALL POWERARC.00601DE0
00601ED9 TEST AL,AL
00601EDB JNZ SHORT POWERARC.00601F45
Переход на хорошую месагу а точнее под плохую
00601EDD INC BYTE PTR DS:[C003EC]

Ясно ставим брейк на 00601ECE (по F2)
И снова в проге жмем ОК.
Попадаем на брейке и заходим в CALL POWERARC.00601DE0
Чуть трассируем и видим что:
00601E10 LEA EDX,DWORD PTR SS:[EBP-C] - это буфер хорошего кода
00601E13 MOV EAX,DWORD PTR SS:[EBP-4] - наше имя
00601E16 CALL POWERARC.00656CBC - Все ясно нужно сюда зайти
00601E1B MOV EDX,DWORD PTR SS:[EBP-C] - хор код
00601E1E MOV EAX,DWORD PTR SS:[EBP-8] - наш код

И вот мы наконец здесь:
Ну трассируем, а там увидим.

---- поскипано------

00656D04 MOV DWORD PTR FS:[EAX],ESP
Люблю Олли за это, что показывает строки
00656D07 MOV ESI,POWERARC.00656F1C ; ASCII 0B,"IP-POWERARC"
Интересная строка!
00656D0C LEA EDI,DWORD PTR SS:[EBP-114]

--------- Мусор никому не нужен --------

Ниже приведен код что-то типа:
.data
conv db "%1.2x",0
buff db 16 dup (0)
invoke wsprintf,addr buff,addr conv, 1403h

00656D33 XOR EDI,EDI
00656D35 MOV ESI,1403h - 1403 :)
00656D3A LEA EAX,DWORD PTR SS:[EBP-10] - buff
00656D3D PUSH EAX
00656D3E MOV DWORD PTR SS:[EBP-21C],ESI
00656D44 MOV BYTE PTR SS:[EBP-218],0
00656D4B LEA EDX,DWORD PTR SS:[EBP-21C]
00656D51 XOR ECX,ECX
00656D53 MOV EAX,POWERARC.00656F30 - conv - ; |ASCII "%1.2x"
00656D58 CALL POWERARC.0040B1C4
00656D5D XOR EAX,EAX
00656D5F MOV AL,BYTE PTR SS:[EBP-214]
00656D65 TEST EAX,EAX
00656D67 JLE SHORT POWERARC.00656DD4
00656D69 MOV DWORD PTR SS:[EBP-14],EAX - длинна имени
00656D6C LEA EBX,DWORD PTR SS:[EBP-213] - имя
00656D72 /XOR EAX,EAX
00656D74 |MOV AL,BYTE PTR DS:[EBX] - берем символ имени первый раз конечно первый символ
00656D76 |ADD EAX,ESI - символ имени + esi а в esi 1403h ну это сейчас
00656D78 |MOV ECX,0FF - 255
00656D7D |CDQ
00656D7E |IDIV ECX - eax mod 255 результат в edx
00656D80 |MOV ESI,EDX
00656D82 |CMP EDI,DWORD PTR SS:[EBP-C] - потом как стало известно
00656D85 |JGE SHORT POWERARC.00656D8A - здесь проверяют кончилась ли наша интересная строка
00656D87 |INC EDI
00656D88 |JMP SHORT POWERARC.00656D8F
00656D8A |MOV EDI,1 - если да то уст. пойнтер на начало строки
00656D8F |XOR EAX,EAX
00656D91 |MOV AL,BYTE PTR SS:[EBP+EDI-114] - берем символ из этой строки
00656D98 |XOR ESI,EAX - и ксорим на суму та что была выше
А дальше тоже самое, что и сверху
invoke wsprintf,addr buff1,addr conv,edx

00656D9A |LEA EAX,DWORD PTR SS:[EBP-220] - buff1
00656DA0 |PUSH EAX
00656DA1 |MOV DWORD PTR SS:[EBP-21C],ESI - наше число
00656DA7 |MOV BYTE PTR SS:[EBP-218],0
00656DAE |LEA EDX,DWORD PTR SS:[EBP-21C] - передаем его в функ.
00656DB4 |XOR ECX,ECX
00656DB6 |MOV EAX,POWERARC.00656F30 - conv - ; |ASCII "%1.2x"
00656DBB |CALL POWERARC.0040B1C4
00656DC0 |MOV EDX,DWORD PTR SS:[EBP-220]
00656DC6 |LEA EAX,DWORD PTR SS:[EBP-10]

И теперь соединяют
invoke lstrcat,addr buff,addr buff1

00656DC9 |CALL POWERARC.004041F8
00656DCE |INC EBX
00656DCF |DEC DWORD PTR SS:[EBP-14] - проверяем конец ли, если нет то наверх

00656DD2 \JNZ SHORT POWERARC.00656D72
00656DD4 MOV EAX,DWORD PTR SS:[EBP-10] - в конце имеем длинную строку но это не код
00656DD7 CALL POWERARC.004041F0 - берем длину этой строки
00656DDC MOV ESI,EAX
00656DDE TEST ESI,ESI
00656DE0 JNS SHORT POWERARC.00656DE5
00656DE2 ADD ESI,3
00656DE5 SAR ESI,2 - длинна/4
Чтобы много не писать я просто напишу это в чистом виде на асме
Ниже кода проги пример, просто под дебагером это очень легко увидеть.

00656DE8 MOV BYTE PTR SS:[EBP-214],0
00656DEF MOV EBX,1
00656DF4 /LEA EAX,DWORD PTR SS:[EBP-224]
00656DFA |LEA EDX,DWORD PTR SS:[EBP-214]
00656E00 |CALL POWERARC.00404194
00656E05 |LEA EAX,DWORD PTR SS:[EBP-224]
00656E0B |PUSH EAX
00656E0C |LEA EAX,DWORD PTR SS:[EBP-22C]
00656E12 |MOV EDI,EBX
00656E14 |IMUL EDI,ESI X+20/4
00656E17 |MOV EDX,DWORD PTR SS:[EBP-10]
00656E1A |MOV DL,BYTE PTR DS:[EDX+EDI-1] mov al,[ebx+ecx-1]
00656E1E |MOV BYTE PTR DS:[EAX+1],DL
00656E21 |MOV BYTE PTR DS:[EAX],1
00656E24 |LEA EDX,DWORD PTR SS:[EBP-22C]
00656E2A |LEA EAX,DWORD PTR SS:[EBP-228]
00656E30 |CALL POWERARC.00404194
00656E35 |MOV EDX,DWORD PTR SS:[EBP-228]
00656E3B |POP EAX ; POWERARC.00601E1B
00656E3C |CALL POWERARC.004041F8
00656E41 |MOV EDX,DWORD PTR SS:[EBP-224]
00656E47 |LEA EAX,DWORD PTR SS:[EBP-214]
00656E4D |MOV ECX,0FF
00656E52 |CALL POWERARC.004041CC
00656E57 |LEA EAX,DWORD PTR SS:[EBP-230]
00656E5D |LEA EDX,DWORD PTR SS:[EBP-214]
00656E63 |CALL POWERARC.00404194
00656E68 |LEA EAX,DWORD PTR SS:[EBP-230]
00656E6E |PUSH EAX
00656E6F |LEA EAX,DWORD PTR SS:[EBP-22C]
00656E75 |MOV EDX,DWORD PTR SS:[EBP-10]
00656E78 |MOV DL,BYTE PTR DS:[EDX+EDI-2]
00656E7C |MOV BYTE PTR DS:[EAX+1],DL
00656E7F |MOV BYTE PTR DS:[EAX],1
00656E82 |LEA EDX,DWORD PTR SS:[EBP-22C]
00656E88 |LEA EAX,DWORD PTR SS:[EBP-234]
00656E8E |CALL POWERARC.00404194
00656E93 |MOV EDX,DWORD PTR SS:[EBP-234]
00656E99 |POP EAX ; POWERARC.00601E1B
00656E9A |CALL POWERARC.004041F8
00656E9F |MOV EDX,DWORD PTR SS:[EBP-230]
00656EA5 |LEA EAX,DWORD PTR SS:[EBP-214]
00656EAB |MOV ECX,0FF
00656EB0 |CALL POWERARC.004041CC
00656EB5 |INC EBX
00656EB6 |CMP EBX,5
00656EB9 \JNZ POWERARC.00656DF4
00656EBF MOV EAX,DWORD PTR SS:[EBP-8]
00656EC2 LEA EDX,DWORD PTR SS:[EBP-214]
00656EC8 CALL POWERARC.00404194
00656ECD XOR EAX,EAX
00656ECF POP EDX ; POWERARC.00601E1B


Суть алгоритма:
.data
nlen dd 0
buff3 db 255 dup (0) - здесь наша строка

Например, для моего имени длинна строки = 20

invoke lstrlen,addr buff3
mov nlen,1
sar eax,2 - 20/4
mov edi,eax
mov ebx,eax
Берем X = 20/4 ;X = 5


lea edx,buff2
lea ecx,buff3
fill:

Далее берем X-ый символ из этой сторки и заносим в буффер
mov al,[ebx+ecx-1]
mov [edx],al
inc edx
Потом X-ый - 1
mov al,[ebx+ecx-2]
mov [edx],al
inc edx
потом устанавливаем пойнтер на X+20/4 позиций, то есть если у меня
была строка на 20 и первый пойнтер был на 5 символе то второй на 10 3-й на 15 и 4-й на 20
add ebx,edi - X+20/4
inc nlen
cmp nlen,4
jle fill
mov al,0
mov [edx],al
Ну вот и все если у меня была строка

140324045D91B970F435
21 43 65 87
то код 23D57953

Минимальная длинна имени 2 почему, потому что
чтобы сделать код длинной 8 нужно к константе 1403 добавить
еще 2 байта то есть имя длинной в 2 символа

Вот полный текс генерации

genkey proc
invoke lstrcat,addr buff3,addr fnum
invoke lstrlen,addr buff1
cmp eax,1
jle exgen
mov nlen,eax
mov edi,0
mov esi,1403h
lea ebx,buff1
back: xor eax,eax
mov al,[ebx]
add eax,esi
mov ecx,0ffh
cdq
idiv ecx
mov esi,edx
cmp edi,0bh
jge clr
inc edi
jmp nxt
clr: mov edi,1
nxt: xor eax,eax
mov al,[edi+powarc]
xor esi,eax
inc ebx
invoke wsprintf,addr buff2,addr conv,esi
invoke lstrcat,addr buff3,addr buff2
dec nlen
jnz back

invoke lstrlen,addr buff3
mov nlen,1
sar eax,2
mov edi,eax
mov ebx,eax

lea edx,buff2
lea ecx,buff3
fill:
mov al,[ebx+ecx-1]
mov [edx],al
inc edx
mov al,[ebx+ecx-2]
mov [edx],al
inc edx
add ebx,edi
inc nlen
cmp nlen,4
jle fill
mov al,0
mov [edx],al
ret
exgen: mov eax,1

ret

genkey endp


А это вызываем функ.
.data
conv db "%1.2X",0
powarc db 0bh,"IP-POWERARC",0
fnum db "1403",0

nlen dd 0
errlen db "Must be 2 or more chars",0


Типа ButtonClick1

.if eax == 1003
mov buff1,0
mov buff2,0
mov buff3,0
invoke GetDlgItemText,hWin,1001,addr buff1,255
call genkey
cmp eax,1
je exgen
invoke SetDlgItemText,hWin,1002,addr buff2
jmp con

exgen: invoke SetDlgItemText,hWin,1002,addr errlen
con:
.endif

Вроде все.

mail to: v0ldemar@mail333.com

Обсуждение статьи: Написание КейГена для PowerArchiver 2003 8.xx >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS