VirS vs. FightMe 3.0   03.10.2001 , 18:00:13

Witam wszystkich dnych zamania FightMe 3.0 by JuBE.
			         ~~~~~~~~~~~~~~~~~~~~~
Na wstpie chciaem zauwayc ze ten crackme nie jest raczej 
dla pocztkujcych. Ponadto jeeli nie znasz asemblera 
w stopniu, ktry umoliwia ci pisanie wasnych programw to 
moesz sobie odpuci czytanie.

To mj pierwszy tutorial wiec prosz o wyrozumiao ;)

Co nam bedzie potrzebne:
1. ProcDump
2. IDA (moze byc v 3.8)
3. ExeScope
4. Masm32 lub Tasm (w zalenoci co kto woli).
5. Moe si przyda W32DASM chocia niekoniecznie.
6. Mzg i troche wolnego czasu.

Wszystkie te uyteczne toolsy moesz znle na stronie 
http://www.crackpltools.prv.pl/.

Zaczynamy:

FightMe 3.0 jest programem z gatunku CrackMe, cakiem niele 
zabezpieczonym jak na moje skromne dowiadczenie.
Po pierwsze ogldajc go szybko mona sie przekona ze jest on 
spakowany UPX v. 0.71-0.72 c... rozpakujemy go sobie. Jak? 
Ten tutorial nie o tym ma traktowa wiec odsyam do tutoriali
ktrych autorem jest niejaki smola.
Dla leniwych powiem e wystarczy wczy ProcDumpa, jeeli 
nie masz jeszcze skryptu do UPX to oto on:
[UPX] 
L1=OBJR 
L2=LOOK 61,E9 
L3=BP 
L4=STEP 

OPTL1=00000000 
OPTL2=01010001 
OPTL3=01010001 
OPTL4=00030000 
OPTL5=00000000

Po rozpakowaniu wczamy ExeScope i tworzymy sobie plik .rc
Nie przejmuj sie tym ,e pojawi sie okienko o bdzie plik 
ktry powstanie bedzie ok.
Obejrzyj sobie co te FightMe ma za zasoby (jeszcze do tego wrcimy)
Teraz pora na prawdziw zabawe ;)) Waczamy IDA, czekamy a
troche pomyli i ju po chwili oczom naszym ukazuje si kod 
naszej ofiary. Powiniene go troche przystosowa do ogldania,
na przyklad kiedy bedziesz na offsecie 004012A8 sprbuj 
nacisn "c" jak zobaczysz co takiego jak: 
push    40203Ch
to nacinij na tym  "o" i tak dalej i tak dalej (jak chcesz 
sie czego wiecej dowiedzie o IDA to przeczytaj tutoriale o
rekompilacji zamieszczone na stronie http://jube.fm.interia.pl/
a szczeglnie polecam:
..:: ReKompilacja programu ::..
    czesc #2 writed by W!K0

Dobra idziemy dalej jak ju dostosowae to co widzisz w IDA
do swoich potrzeb moesz zacz po woli analizowa co te 
nasz program bedzie robi. Zaczniemy od pocztku.
Przy offsecie 00401025 widzisz zapewne jaki call, a nad nim 
trzy push'e. Zdradze ci w tajemnicy ze jest to call do procedury
deszyfrujcej, pierwszy push to klucz, drugi to offset konca 
tekstu do odszyfrowania a trzeci to sam zaszyfrowany tekst.

Ja postanowiem sobie uatwi zycie i nada wasne nazwy, ety-
kiety etc.

u mnie wyglda to wic tak:

00401000                 push    0
00401002                 call    j_GetModuleHandleA
00401007                 mov     ds:hInstance, eax
0040100C                 call    j_GetCommandLineA
00401011                 mov     ds:lpCommandLine, eax
00401016                 push    12345678h ; klucz
0040101B                 push    offset BuffName ;znacznik koca
00401020                 push    offset information ; fragment do rozszyfrowania
00401025                 call    rozszyfruj 
.
.
.
004019B4 rozszyfruj      proc near              
004019B4 
004019B4 string          = dword ptr  8
004019B4 endOffset       = dword ptr  0Ch
004019B4 klucz           = dword ptr  10h
004019B4 
004019B4                 enter   0, 0
004019B8                 push    ebx
004019B9                 push    edi
004019BA                 push    esi
004019BB                 mov     edi, [ebp+string]
004019BE                 mov     esi, [ebp+endOffset]
004019C1 
004019C1 loc_4019C1:                             
004019C1                 mov     ebx, edi        ; ebx to offset do tego co mamy rozszyfrowac
004019C3                 add     ebx, 3          ; a teraz na jego 3 wyraz
004019C6                 cmp     ebx, esi        ; porwnaj czy to czasem nie koniec tekstu do rozszyfrowania
004019C8                 ja      short poprawka  ; jak wyej to znaczy ze poszlismy za daleko i trzeba odwrocic xor
004019CA                 mov     eax, [edi]      ; do eax pierwszy DWORD do rozszyfrowania
004019CC                 xor     eax, [ebp+klucz] ; xor z kluczem
004019CF                 mov     [edi], eax      ; i rozszyfrowane na swoja miejsce
004019D1                 add     edi, 4
004019D4                 cmp     edi, esi
004019D6                 ja      short loc_401A04 ; jak niema juz nic do rozszyfrowna to koniec
004019D8                 jmp     short loc_4019C1 ; ebx to offset do tego co mamy rozszyfrowac

Dobra fajnie byoby wiedzie co wyjdzie po odszyfrowaniu, wic albo napiszesz 
program ktory to rozszyfruje albo waczysz np: W32dsm debuggera i pozwolisz eby 
FightMe sam ci to odszyfrow. Jak si zaraz przekonasz ten odszyfrowany fragment 
to rnego rodzaju wiadomoci typu "Please enter your name"  , 
"Your name must have at least 4 characters","Wrong serial number", etc. 
(wicej z W32dsm nie bedziemy korzystali)

Lecimy dalej, dochodzimy do czego takiego:

0040122B                 mov     edi, 184h
00401230                 mov     esi, offset loc_401711 ; odtad liczymy sume kontrolna
00401235                 call    checksum ; jak widzisz po mojej etykiecie to wywoanie
                                          ; procedury liczcej sume kontroln
0040123A                 cmp     eax, 5174CDB9h   ;warto ktra powinna by
0040123F                 jz      short loc_401248 ; jak sie suma kontrolna zgadza to lecimy dalej
                                                  ; jak nie to papa ;)
00401241                 push    0
00401243                 call    j_ExitProcess 
00401248 
00401248 loc_401248:                             
00401248                 push    0
0040124A                 push    offset DlgProc ; tu sie udamy dalej
0040124F                 push    0
00401251                 push    64h
00401253                 push    ds:hInstance
00401259                 call    j_DialogBoxParamA ; tworzymy dialogboxa
0040125E                 push    0
00401260                 call    j_ExitProcess
00401260 start           endp

Nie bd si rozwodzi nad mechanizmami liczenia sumy kontrolnej, powiem jedynie
e kade postawienie puapki, lub patch na fragmenci z ktrego jest liczona
spowoduje natychmiastowy exit.

Idziemy wiec do DlgProc:

DlgProc:                                
004012C5                 enter   0, 0
004012C9                 push    ebx
004012CA                 push    edi
004012CB                 push    esi
004012CC                 cmp     dword ptr [ebp+0Ch], 2 ; WM_DESTROY
004012D0                 jz      short loc_4012F7
004012D2                 cmp     dword ptr [ebp+0Ch], 10h ; WM_CLOSE
004012D6                 jz      short loc_4012F7
004012D8                 cmp     dword ptr [ebp+0Ch], 111h ; WM_COMMAND
004012DF                 jz      short WhatClicked 
004012E1                 cmp     dword ptr [ebp+0Ch], 110h ; WM_INITDIALOG
004012E8                 jz      InitDialog 
004012EE                 xor     eax, eax
004012F0                 pop     esi
004012F1                 pop     edi
004012F2                 pop     ebx
004012F3                 leave
004012F4                 retn    0Ch

Najpierw zobaczymy co sie dzieje jak sie tworzy dialog wiec skaczemy do 
fragmentu InitDialog:
Tam oprcz standardowych rzeczy tj. ustawienie ikony, wycentrowanie okna
miedzy wieszami tworzy sie nastpny wtek ,ktry bdzie liczy sum kontroln:

004016B0                 push    offset liczSume ; to jest adres dla naszego nowego 
                                                 ; wtku - sprytnie ;)
.
.
0040170C                 call    j_CreateThread  ; Tworzymy watek liczacy sume kontroln

Jak popatrzysz dalej to stwierdzisz ze nasza ofiara poszukuje:
1. FileMonitora jak jest to go zamyka.
2. Sprawdza IDT - dla niewiadomych Interrupt Descriptor Table, (jak nie wiesz co to,
	to przecztaj manuala do Pentium). SoftIce wprowadza tam zmiany.
3. SoftIce'a sprawdzajc czy sa 2 sterowniki.
4. TRW2000
5. Jeszcze raz FileMonitora

Od punktu 2-5 jak nasz programik znajdzie to czego szuka wywietli stosowny komunikat
i si adnie wyaczy.

To wszystko jeeli chodzi o InitDialog. Teraz idziemy do obsugi przyciskw.
Jak popatrzysz na plik .rc to moe zauwaysz, przyciski w gownym DialogBox 
maj dokadnie takie ID jak te ktre widzimy poniej (pamietaj ze musisz zamieni
numerki z .rc na ich odpowiednik hex ;))

00401305 WhatClicked:                            
00401305                 cmp     dword ptr [ebp+10h], 0C9h ; czy About?
0040130C                 jz      short About
0040130E                 cmp     dword ptr [ebp+10h], 0CAh ; czy register?
00401315                 jz      short Zaczynamy ; tu si udamy
00401317                 cmp     dword ptr [ebp+10h], 0C8h ; czy exit?
0040131E                 jz      short loc_4012F7
00401320                 pop     esi
00401321                 pop     edi
00401322                 pop     ebx
00401323                 leave
00401324                 retn    0Ch
 
Procedura About narazie nas nie obchodzi wiec udajemy si do Zaczynamy:

Jak widzisz na wstpie program pobiera to co wpisae w jako Name i Serial 
przez wysanie WM_GETTEXT do odpowiednich editbox'w. Dla mojej wygody nazwaem 
buffery do ktrych pobierane s dane odpowiednio: BuffName i BuffSerial.
Program zaraz sprawdza czy co wpisae, jeeli Name ma mniej ni 4 znaki 
to wywietli ci informacje eby wisa co innego (przy okazji jest to tre 
komunikatu to jeden z tych stringw comy na pocztku rozszyfrowli).

Uwaga!!! teraz jest co wanego :

00401399                 mov     edi, offset BuffSerial
0040139E                 dec     edi
0040139F                 xor     ebx, ebx

004013A1 loc_4013A1:                             
004013A1                 mov     al, [edi+ecx]   ; do al znak Name
004013A4                 cmp     al, 2Dh         ;  czy to "-"
004013A6                 jnz     short loc_4013A9 ; jak nie to skok bez inc ebx
004013A8                 inc     ebx
004013A9 
004013A9 loc_4013A9:                          
004013A9                 loop    loc_4013A1      
004013AB                 cmp     ebx, 4          ;  musi by 4 "-"
004013AE                 jnz     BadBoy

jak widzisz ten fragment kodu liczy ile jest "-" w serialu jak nie cztery 
to zgadnij co sie dzieje ;)
Pniej jest jeszcze sprawdzenie czy czasmi pierwszy znak to nie "-" jeeli
nie to dochodzimy do kodu:
 
004013C8 loc_4013C8:                             
004013C8                 cmp     bl, 30h         ; jak poniej 0 to badboy
004013CB                 jb      BadBoy
004013D1                 cmp     bl, 39h         ; jak powyej 9 to badboy
004013D4                 ja      BadBoy
004013DA                 sub     bl, 30h
004013DD                 add     eax, ebx        ; suma do eax
004013DF                 inc     edi
004013E0                 mov     bl, [edi]       ; nastpny znak do bl
004013E2                 cmp     bl, 2Dh
004013E5                 jz      short loc_4013F0 ; jak "-" to skok
004013E7                 mov     edx, 0Ah
004013EC                 mul     edx             ; mnoymy eax przez 0Ah
004013EE                 jmp     short loc_4013C8 
004013F0 ; 
004013F0 
004013F0 loc_4013F0:                             
004013F0                 mov     ds:suma1, eax

Jak widzisz powyszy fragment sprawdza czy wpisae liczby jeeli nie to wypad.
Pniej... ciekawy jestem czy zauwaye sam co sie tu dzieje ? No nic na wyypadek
jakby nie zauway to jest to procedura ktra zamienia to co w pisae w 
editbox'sie na odpowiednik szesnastkowy czyli np jak wpise 123456
to po przemieleniu dostajesz 1e240h mam nadzieje ze jasne.
A do offsetu 004014E4 wszystko przebiega tak samo tylko ze liczone s odpowiedniki
hex nastpnych wartosci midzy "-", po tym wszystkim jak zapewne zauwaye mamy 5
wartoci ktre ja, moe niezbyt fortunnie nazwaem sumami[nie chce mi sie poprawia :P]
Prawdziwa zabawa to kilka nastpnych instrukcji:

004014E9                 mov     eax, ds:suma1
004014EE                 mov     ebx, ds:suma3
004014F4                 add     eax, 1315BE1h
004014F9                 xor     eax, ebx
004014FB                 rol     eax, 3
004014FE                 cmp     eax, ds:suma2
00401504                 jnz     BadBoy
0040150A                 mov     eax, ds:suma1
0040150F                 add     eax, ds:suma2
00401515                 rol     eax, 1
00401517                 add     eax, ds:suma3
0040151D                 rol     eax, 2
00401520                 xor     eax, ds:suma4
00401526                 sub     eax, ds:suma5
0040152C                 mov     ebx, offset loc_4015E8
00401531                 dec     ebx
00401532                 mov     ds:KluczZseriala, eax
00401537                 push    eax ; klucz
00401538                 push    ebx ; offset koca
00401539                 push    offset kawaek_kodu
0040153E                 call    rozszyfruj  

Jak pewnie widzisz wykonywane s tu rne operacje na tych piciu "sumach"
a w kocu wynik tych operacji jest uywany jako klucz do tej procedury
deszyfrujcej ktr widzielimy na samym pocztku (mam nadzieje ze pamietasz ;))
Tylko co tak waciwie bedziemy deszyfrowa ? przeniesz si pod offset 00401543
i jeeli widzisz tam jakie instrkcje to oznacza to e za bardzo si przeje
clickaniem na pocztku ;) nacinij lepiej "u" bo to co widzisz od 00401543 do
004015E8 to jeszcze nie jest kod on si dopiero nim stanie jak znajdziesz klucz
do odszyfrowania. I tu mam przykr wiadomo e klucz ten jest 32 bitowy :0
Mam nadzieje ze wiesz co to oznacza. Nasza sytuacja jest rwnie kiepska 
dla tego ze nie wiemy co ma by w rozszyfrowanym tekcie... ale czy napewno ;)
Pamietasz jak Ci mwiem e plik .rc si nam jeszcze do czegos przyda?
Ot popatrz sobie na trzeci DialogBox czy to nie informacja o naszym 
zwycistwie ? Popatrz sobie teraz na kod i powiedz czy widzisz gdzie 
fragment kodu ktry tworzyby ten Dialog, nie szukaj a tak dokadnie, 
podpowiem ci ze nie ma. Co z tego wynika? A to e w takim razie ten
kod pojawi sie napewno w w tym co chcemy rozszyfrowa.
Teraz pomyl jeeli mamy wywoa dialogbox to naley uy polecenia API
DialogBoxParamA, jeeli nie wiesz co trzeba mu przekaza w pushach to...
kiepski z ciebie programista ;) Dla tych co nie wiedz:

int DialogBoxParam(

    HINSTANCE hInstance,	     // handle to application instance
    LPCTSTR lpTemplateName,	// identifies dialog box template
    HWND hWndParent,	        // handle to owner window
    DLGPROC lpDialogFunc,	   // pointer to dialog box procedure  
    LPARAM dwInitParam 	  // initialization value

   );
Powiniene ju wiedzie co trzeba zrobi, napisa brutalforce !!!
ktry bedzie nam odszyfrowywa ten kod i szuka odpowiedniego cigu bajtw
lepiej zeby sito selekcyjne byo dosy szczelne bo moe sie okazac e nie 
ycia ci nie starczy eby zanalizowa wszystkie wyniki. Proponuj poszuka 
czego takiego:

db 6Ah,0          ;push 0
db 68h,?,?,?,?    ;push jaki adres
db 0FFh,?,?       ;push zmienna lokalna
db 6Ah, 66h       ;!!! to jest ID naszego Dialog'a !!!
                  ; to musi by na 100%
db 0FFh,?,?,?,?,? ; push hInstance
db 0E8 	          ;call

Zauwa e zakadamy e autor nie dozdzieli przestrzennie 
push'y tak jak to zrobi np: przy tworzeniu wtku, jest to
zaoenie optymistyczne ale akurat tutaj si sprawdzio ;)
Nie bed zamieszcza kodu mojego brutalforce; jak bedzisz
chcia napiszesz sobie wasny. (jak masz szczcie to w tym
zipie bdzie plik z odszyfrowanym kodem i kluczem).
Nie bd si rwnie chwali ile mj komputer to liczy ;))
do powiedzie ze duuuugggggo.
No nic osobicie uwaam e jest to gwne zabezpieczenie
tego programu. A moe podam wam klucz, co? No dobra trzymajcie
sie opar foteli.... oto on D8514D1Dh.
Jak go ju mamy i mamy odszyfrowany kod to mozemy w 
IDA zastpi to co byo szyfrowane tym odszyfrowanym.
I tak oczom twoim powinna ukaza si rzecz nastpujca:
  
00401543 kawaek_kodu:                         
00401543                 mov     eax, ds:suma1
00401548                 mov     ebx, ds:suma3
0040154E                 mov     edx, ds:suma5
00401554                 push    ebx             ; na stos suma3
00401555                 push    eax             ; na stos suma1
00401556                 push    edx             ; na stos suma5
00401557                 mov     edi, offset BuffName
0040155C                 mov     eax, 3081983h   ; klucz
00401561                 mov     ecx, 7D1h
00401566 
00401566 Petla1:                                 
00401566                 mov     bl, [edi]       ; do bl  znak name
00401568                 cmp     bl, 0           ; czy to juz koniec
0040156B                 jnz     short Dalej1    ; ror klucza2
0040156D                 mov     edi, offset BuffName
00401572                 jmp     short Petla1    ; ta petla wykonuje sie 7D1 razy
00401574 ; 
00401574 Dalej1:                              
00401574                 ror     eax, 1          ; ror klucza
00401576                 xor     al, bl          ; al  xor znak
00401578                 bswap   eax             ; byte swap eax
0040157A                 xor     eax, ecx        ; xor tego co ze znaku z 
											 ; (ecx - liczba powtorzen petli)
0040157C                 inc     edi             ; nastepny znak
0040157D                 loop    Petla1          ; petla do wyczerpania licznika czyli 7d1h razy
0040157F                 mov     edx, eax        ; do eax pierwsza mielonka
00401581                 push    eax             ; MIX1 na stos

Myl ze jest to dosy jasne zwaszcza z moimi mtnymi przypisami ;))
No nic jak si zapewne zorientowae ten fragment kodu zajmuje sie tym
co wpisale jako Name. Po zakoczeniu na stos wdruje co co nazwaem
MIX1 czyli wynik tego caego mielenia. Teraz nastpny kawaek:

00401582                 mov     edi, offset BuffName
00401587                 mov     eax, [edi]      ; do eax 4 znaki name
00401589                 mov     ecx, 0ABCDEh
0040158E 
0040158E Petla2:                    
0040158E                 mov     bl, [edi]       ; znak do bl
00401590                 cmp     bl, 0
00401593                 jnz     short Dalej2    
00401595                 mov     edi, offset BuffName
0040159A                 jmp     short Petla2    ; znak do bl
0040159C ; 
0040159C 
0040159C Dalej2:                     
0040159C                 rol     eax, 1          ; rol 4 znakow
0040159E                 xor     ah, bl          ; xor ah z aktualnym znakiem
004015A0                 rol     eax, 2          ; nastepny rol
004015A3                 add     eax, ecx        ; dodajemy do naszych zmienionych 4 znakow aktualna wartosc licznika
004015A5                 rol     eax, 2          ; jeszcze raz rol
004015A8                 add     eax, edx        ; do eax dodajemy MIX1
004015AA                 ror     edx, 1          ; nastepny ror
004015AC                 inc     edi             ; nastepny znak
004015AD                 loop    Petla2          ; ta petla wykonuje sie ABCDE razy
004015AF                 push    eax             ; Mix2 na stos

Znowy mielimy tego naszego biednego Name tym razem nawet z tym co wyszo z poprzedniego 
mielenia ;) Podownie wynik operacji wdruje na stos Nazwaem to Mix2. Jak ju mamy dwa
MIX to trafiamy tu:

004015BC                 pop     eax             ; MIX2
004015BD                 pop     ecx             ; MIX1
004015BE                 pop     ebx             ; suma5 do ebx
004015BF                 pop     edx             ; suma1 do edx
004015C0                 pop     edi             ; suam3 do edi
004015C1                 xor     ecx, ebx        ; Mix1 xor suma5
004015C3                 xor     eax, edx        ; Mix2 xor suma1
004015C5                 cmp     ecx, eax        ; Tu  !!!!!!!
004015C7                 jnz     BAD_zaszyfruj_ponownie
004015CD                 add     eax, ecx	 ; Tu !!!!!!!
004015CF                 jnz     short BAD_zaszyfruj_ponownie
004015D1                 push    0		;patrz to czego szukalimy jak ywe ;)
004015D3                 push    offset AboutProc
004015D8                 push    dword ptr [ebp+8]
004015DB                 push    66h
004015DD                 push    ds:hInstance
004015E3                 call    j_DialogBoxParamA

Jak widzisz pod adresem 004015C5 sprawdzamy czy Mix1 xor suma5 == Mix2 xor suma1,
a pod adresem 004015CD dodajemy te wartoci do siebie i te ma by zero. Co to oznacza?
Pomyl jak to liczba ktra odjta od siebie da 0 i dodana do siebie te da zero. Wstyd mi
to pisa (mam nadzieje ze to oczywiste) to !!!uwaga!!! zero "0" we wasnej osobie.
Co nam to mwi ano bardzo duo, z tego wynika ze mix2 == suma1 a mix1 == suma5.
No i jest ekstra bo mamy ju 2 z pord 5 niewiadomych i do tego mamy wynik operacji na
nich, jak nie wiesz o czym pisze to zaraz ci przypomne:
 
004014E9                 mov     eax, ds:suma1
004014EE                 mov     ebx, ds:suma3
004014F4                 add     eax, 1315BE1h
004014F9                 xor     eax, ebx
004014FB                 rol     eax, 3
004014FE                 cmp     eax, ds:suma2
00401504                 jnz     BadBoy
0040150A                 mov     eax, ds:suma1
0040150F                 add     eax, ds:suma2
00401515                 rol     eax, 1
00401517                 add     eax, ds:suma3
0040151D                 rol     eax, 2
00401520                 xor     eax, ds:suma4
00401526                 sub     eax, ds:suma5
0040152C                 mov     ebx, offset loc_4015E8
00401531                 dec     ebx
00401532                 mov     ds:KluczZseriala, eax
00401537                 push    eax ; klucz

gdzie klucz to oczywiscie ta z trudem przeze mnie wyliczona warto D8514D1Dh.
Podsumowujc mamy ju:
klucz = D8514D1Dh
suma1 = 6B4AB921h -- 
                   - te dwie wartoci dostaniecie jak wpiszecie VirS i przepucicie go
                   - przez to co nasz program robi z Name. Dla tego pisem ze trzeba
                   - umiec programowa w ASM
suma5 = 74DBE354h --
Myl ze to ju duo. Co teraz? Teraz popatrzymy sobie jeszcze raz na kod.

================================================================================= 
Jak wiesz co robi dalej to nie czytaj, masz ju dostatecznie duo wiadomoci.
=================================================================================

A jednak zostae ;) No dobra okazuje sie e moesz sobie wymyli np: sume3
Jak to zrobisz to napisz program, ktry ci powie jakie s wartoci sumy2 i sumy4.
Oto mj przyklad:

;-------------ciach--------------------------------------------------------------
.386
.model flat, stdcall
option casemap:none


include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc


includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.data
hex2hex db "Przy pierwszej sumie rownej 6B4AB921h",13,10
	    db "Przy trzeciej sumie rownej 38de5h",13,10
        db "Przy piatej sumie rownej 74DBE354h",13,10
        db "Suma druga wynosi = %08Xh",13,10
        db "Suma czwarta wynosi = %08Xh",0
capt db "Sumy",0

buffer db 128h dup (0)

.code
start:



mov eax,6B4AB921h  ;suma1
mov ebx, 38de5h    ;suma3
add eax, 1315BE1h
xor eax, ebx
rol eax,3
mov edi, eax       ;edi to suma2
;-------------------------------
mov ebx, suma5
mov edx, 0d8514d1dh ; pamietasz e to klucz ? ;)
add edx, ebx   ; magic
;-------------------------------
mov eax,6B4AB921h  ;suma1
add eax, edi       ;edi to sama2
rol eax, 1
add eax, 38de5h    ;dodaj suma3
rol eax,2
xor eax, edx       ;eax xor wartosc wyliczona z klucza i sumy5
mov esi, eax       ;esi to suma4

invoke wsprintf, addr buffer, addr hex2hex,edi, esi
invoke MessageBox,0,addr buffer, addr capt, MB_OK

invoke ExitProcess,0
end start
;-------------ciach--------------------------------------------------------------

Imponujcy nie ;)
Dobra zosta ostatni krok naleey teraz otrzymane wartosci hex zamieni na 
wartoci dziesitne( polecam kalkulator ;)),wstawi w odpowiednie miejsca "-"
i ju.
Dla mnie bedzie to np:
Name: VirS
Serial nr.: 1800059169-1675667681-1073741854-880156926-1960567636

i oto: 
			  Fightme 3.0
			!!! cracked !!!
			congratulations

If u want
mailme virs@wp.pl , wszystkie komentarze mile widziane, jak by cos byo
     ~~~~~~~~~~~~	   niejasne to te moesz napisa, postaram sie odpowiedzie.

Podziekownia dla:
bart'a - twoje bartpaki s niesamowite, byle wiecej takich tekstw jak AntiAnti
W!K0 - fajne te tutory o rekompilacji
ICZELION'a - wszysc wiedz za co ;)
