+-----+----------+----------+-------------------------------+
| 003 | cracking | An-Mojeg | an-mojeg@mail-developpeur.com |
+-----+----------+----------+-------------------------------+

Tutorial - crack de Universe v1.5
#################################

Introduction
------------
	Voilà un second tut de crack sur un soft que vous connaissez pas dutout j'imagine (encore! lol :)
Universe est un prog sympa comme tout (mais payant) qui permet de créer des images spatiales avec la
possibilité de mettre des étoiles, des galaxies etc ... mais en version shareware on peut pas mettre
quelques planètes :'(
	hum ... en fait l'utilitée du soft on s'en tape ce qui nous interresse au niveau technique
c'est qu'avec ce soft je veux vous apprendre à patcher un prog pas seulement en nopant par-ci par-là
voilà na ! :)

Universe v1.5
-------------
	Là tout d'abord nous allons le désassembler mais sans commencer a ce jeter comme des malades
sur les string ref. (elles sont trompeuses ;) alors allons-y au débugger (si vous ne savez pas utiliser
softice, lisez les hccc ou un zine a lise grim je croit aussi) là vous avez le choix, soit vous 
posez un breakpoint sur GetWindowTextA (la fonction qui récup le couple nom d'utilisateur/serial) soit
vous posez un breakpoint sur MessageBox (pour localiser où il nous dit d'aller nous faire foutre en fait).
Bon je vous épargne tous Goto Code locations avec W32DASM et tout les bpx et je vous file la fonction qui
les enregistrement (elle est en 0041A3B0) regardons un peu ça :

================================================================

* Referenced by a CALL at Addresses:
|:0041A009   , :0041A2A8   
|
:0041A3B0 53                      push ebx
:0041A3B1 56                      push esi
:0041A3B2 57                      push edi
:0041A3B3 8BF1                    mov esi, ecx
:0041A3B5 55                      push ebp
:0041A3B6 33FF                    xor edi, edi
:0041A3B8 33DB                    xor ebx, ebx
:0041A3BA 8B442414                mov eax, dword ptr [esp+14]
:0041A3BE 8B08                    mov ecx, dword ptr [eax]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A3E8(U)
|
:0041A3C0 3B59F8                  cmp ebx, dword ptr [ecx-08]			; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3C3 7D25                    jge 0041A3EA					; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3C5 0FBE2C19                movsx ebp, byte ptr [ecx+ebx]			; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3C9 03FD                    add edi, ebp					; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3CB 8BC3                    mov eax, ebx					; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3CD 99                      cdq						; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3CE 33C2                    xor eax, edx					; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3D0 2BC2                    sub eax, edx					; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3D2 83E001                  and eax, 00000001				; tout ça nous concerne pas (on veut pas faire un keygen)
:0041A3D5 33C2                    xor eax, edx					; 
:0041A3D7 2BC2                    sub eax, edx					;
:0041A3D9 83F801                  cmp eax, 00000001				;
:0041A3DC 1BC0                    sbb eax, eax					;
:0041A3DE 43                      inc ebx					;
:0041A3DF 83E002                  and eax, 00000002				;
:0041A3E2 48                      dec eax					;
:0041A3E3 0FAFE8                  imul ebp, eax					;
:0041A3E6 03FD                    add edi, ebp					;
:0041A3E8 EBD6                    jmp 0041A3C0					; etc ... lol

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A3C3(C)
|
:0041A3EA 8BC7                    mov eax, edi
:0041A3EC 0FAFC7                  imul eax, edi
:0041A3EF 03C7                    add eax, edi
:0041A3F1 33FF                    xor edi, edi
:0041A3F3 50                      push eax					; ça aussi
:0041A3F4 E827D7FEFF              call 00407B20
:0041A3F9 83C404                  add esp, 00000004
:0041A3FC 393E                    cmp dword ptr [esi], edi
:0041A3FE 7E0A                    jle 0041A40A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A408(C)
|
:0041A400 47                      inc edi
:0041A401 E83AD7FEFF              call 00407B40
:0041A406 393E                    cmp dword ptr [esi], edi			; ça aussi
:0041A408 7FF6                    jg 0041A400

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A3FE(C)
|
:0041A40A 8B7C2418                mov edi, dword ptr [esp+18]
:0041A40E 85FF                    test edi, edi
:0041A410 7F03                    jg 0041A415					; ça aussi
:0041A412 8B7E10                  mov edi, dword ptr [esi+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A410(C)
|
:0041A415 E826D7FEFF              call 00407B40
:0041A41A 2BC7                    sub eax, edi
:0041A41C 5D                      pop ebp
:0041A41D 5F                      pop edi
:0041A41E 83F801                  cmp eax, 00000001				; voilà qui nous interresse
:0041A421 1BC0                    sbb eax, eax					; ça aussi :)
:0041A423 5E                      pop esi
:0041A424 F7D8                    neg eax
:0041A426 5B                      pop ebx
:0041A427 C20800                  ret 0008

================================================================

	Je vient de me rendre compte que c'était pas la peine de balancer toute là fonction si seulement
deux lignes m'interressait mais bon ... c'est pas grave :). En fait ces deux lignes nous montre le retour
de la fonctions qui est traité comme cela en 0041A009 :

================================================================

(...)
call	0041A05E		; appelle de notre chère fonction
test	eax, eax		; 
jne	0041A05E		; si eax = 0 alors sérial incorrect meuh !
(...)

================================================================

	Ben voilà nous avons plus qu'a modifier le retour de la fonction. Puisque nous savons maintenant que
la fonction d'enregistrement renvoi 0 lorsque le sérial est faux. Mais voilà nous pouvont le faire seulement
en utilisant la place donnée avec ces deux instructions :

cmp eax, 00000001	; 
sbb eax, eax		; si eax est different de 1 nous soutrayons (?) eax par eax, on le fout a zéro quoi

soit 83 F8 01 1B C0 soit 5 octets :)

Nous allons donc remplacer ces instructions par :
xor eax, eax		; on met eax a 0
inc eax			; on l'incrémente

Pis voilà voilou. Pour tester cela avec SoftIce on met un breakpoint sur 0041A41E.

bpx 0041A41E
On va a la boite de dialog d'enregistrement on met n'importe quoi (bah An-Mojeg/666 ça va très bien :) et on
appuie sur le bouton register, là softice arrive puis on entre nos ptites instructions comme ça :
a		; <- pour rentrer les instructions quoi :)
xor eax, eax
inc eax
nop		; ben oui faut un peu noper pour combler les trous 
nop		;
(echap)
(ctrl+D)

Bingo ! c'est enregistré yaouuuuuuuuuuuuuuu ! Voilà maintenant ce que ça nous donne au desassembleur :

================================================================

:0041A41E 33C0                    xor eax, eax
:0041A420 40                      inc eax
:0041A421 90                      nop
:0041A422 90                      nop

================================================================

	Il ne vous reste plus qu'a remplacer 83 F8 01 1B C0 par 33 C0 40 90 90 à l'offset 0x1981E.
	Que c'est bôooo bon ben vous savez faire les cracks maintenant nan ? (cf 001)

An-Mojeg		[ an-mojeg@mail-developpeur.com ]