Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  26 6664
Jeg tenkte jeg kunne kontribuere litt på dette forumet, så jeg har skrevet
en tutorial på hvordan man kan cracke mIRC. Mer spesifikt; hvordan man kan
lage en keygen. Jeg valgte mIRC fordi den brukes av mange og fordi den
er relativt enkel.


Det eneste programmet jeg har brukt er IDA pro (interactive disassembler pro), siden jeg synes den er best til å analysere kode.
Det fungerer også som en debugger, så da slår vi jo to fluer i en smekk =)

Andre forslag til disassembler og debugger er henholdsvis w32dasm og Ollydbg.
w32dasm fungerer også som en debugger, men den er ikke særlig god.


------------------------------------------------------------------------------

Last inn fila (mirc.exe) i en disassembler eller debugger.
Det jeg vanligvis bruker å gjøre først er å søke gjennom string referansene
i programmet for å lete etter eventuelle feilmeldinger som f.eks:
"The serial you have entered is incorrect"
Hvis jeg finner en slik referanse bruker jeg å backtrace i koden til jeg finner
der koden hopper til feilmeldingen.
I dette tilfellet fungerer ikke dette, siden teksten ligger som en ressurs som
loades av LoadString apien. I slike tilfeller bruker jeg å finne hvor i koden
programmet henter inn brukernavn og serial. Det kan være i form av tekst du skriver
inn i en tekstboks, en fil med registreringsinformasjon, en nøkkel i registeret +++
mIRC benytter tekstboks-metoden. Det finnes et utall måter å lese tekst fra en
tekstboks, sett ifra en programmerers synspunkt.
F.eks GetWindowTextA, GetDlgItemTextA, SendMessageA med WM_GETTEXT, SendDlgItemMessageA med WM_GETTEXT ++

mIRC benytter den siste av de jeg listet opp.
(Jeg måtte prøve meg frem for å finne det ut.)

Før vi starter vil jeg at vi skal benytte oss av IDA's
FLIRT funksjonalitet. FLIRT står for Fast Library Identification
and Recognition Technology, og er en måte å gjenkjenne funksjonskall
som er mye brukt.

Trykk Shift-F5. Høyreklikk og velg "Apply new signature".
Gjør dette med "Microsoft Visual Studio.Net COM+ Runtime" og
"Microsoft VisualC 2-8/net runtime". IDA vil så automatisk
endre navnene på kjente funksjoner slik at det f.eks står
call _strchr istedenfor call sub_570260.

Start opp programmet i debuggeren til IDA ved å trykke F9.
mIRC vil starte opp på vanlig vis.
Gå så inn på "Help"-menyen til mIRC og velg "register".
Skriv inn noe bogus registreringsinformasjon. I mitt tilfelle har jeg skrevet inn
"Elessar" og "1234567", slik at vi har noe å arbeide med.
Før du trykker OK må vi sette et breakpoint på SendDlgItemMessage, som
er den apien mIRC bruker for å hente inn teksten fra registreringsdialogen.
Trykk Shift-F4 for å få opp "Names"-vinduet. Dette vinduet inneholder
alle navn på funksjoner og variabler. Klikk på vinduet og trykk ALT-T.
Du vil få opp en søkefunksjon. Skriv inn SendDlgItemMessage og trykk OK.
Apien vil så dukke opp. Høyre-klikk så på den og velg "Add Breakpoint".
Du er nå klar til å trykke OK i registreringsdialogen til mIRC.

Trykk OK og debuggeren vil forhåpentligvis stoppe
på addresse 004C7BAA. Slik ser koden ut der:

--------------------------------------------------------------------------

Kode

.text:004C7BA0 mov     esi, [esp+48h+hWnd]
.text:004C7BA4 mov     edi, ds:SendDlgItemMessageA
.text:004C7BAA push    offset aElessar                 ; lParam    <- Her havner du
.text:004C7BAF push    3E7h                            ; wParam
.text:004C7BB4 push    0Dh                             ; Msg
.text:004C7BB6 push    83h                             ; nIDDlgItem
.text:004C7BBB push    esi                             ; hDlg
.text:004C7BBC call    edi ; SendDlgItemMessageA
.text:004C7BBE push    offset a1234123456              ; lParam
.text:004C7BC3 push    3E7h                            ; wParam
.text:004C7BC8 push    0Dh                             ; Msg
.text:004C7BCA push    84h                             ; nIDDlgItem
.text:004C7BCF push    esi                             ; hDlg
.text:004C7BD0 call    edi ; SendDlgItemMessageA
.text:004C7BD2 mov     edx, offset a1234123456         ; "1234567"
.text:004C7BD7 mov     ecx, offset aElessar            ; "Elessar"
.text:004C7BDC call    sub_4C7600                      ; sjekk brukernavn og serial
.text:004C7BE1 test    eax, eax
.text:004C7BE3 jz      loc_4C7CCE
--------------------------------------------------------------------------

Vi ser her at koden leser inn brukernavn og serial og caller en funksjon
med disse to som argument. Vi ser etterpå at når koden har returnert
så sjekker den om eax ikke er null. Hvis den ikke er null hopper den til loc_4C7CCE.
Dette er typisk dårlig beskyttelse siden vi da kan bare endre jz til jmp slik at den
alltid vil godta serial. Men vi må isåfall huske å endre på de to andre plassene
i koden som også caller denne subrutinen. I dette tilfellet er dette ikke interessant
siden vi vil lage en keygen.

Trykk F8 14 ganger til du kommer til call sub_4C7600.
Trykk så F7 for å gå inn i denne subrutinen.

La oss inspisere koden i sub_4C7600.

--------------------------------------------------------------------------

Kode

.text:004C7600 sub_4C7600 proc near                    ; CODE XREF: sub_4C76E0+A9p
.text:004C7600                                         ; sub_4C79F0+58p ...
.text:004C7600
.text:004C7600 var_208= dword ptr -208h
.text:004C7600 var_104= dword ptr -104h
.text:004C7600
.text:004C7600 sub     esp, 208h		<- Vi havner her.
.text:004C7606 push    esi
.text:004C7607 push    edi
.text:004C7608 mov     esi, edx
.text:004C760A mov     edi, ecx
.text:004C760C mov     edx, 104h
.text:004C7611 lea     ecx, [esp+210h+var_208]
.text:004C7615 call    sub_41EF30                      ; nuller ut en buffer
.text:004C761A mov     edx, 104h
.text:004C761F lea     ecx, [esp+210h+var_104]
.text:004C7626 call    sub_41EF30		       ;nuller ut en buffer
.text:004C762B push    edi
.text:004C762C mov     edx, 104h
.text:004C7631 lea     ecx, [esp+214h+var_208]
.text:004C7635 call    sub_41EE40                      ; kopierer en string (username) til buffer
.text:004C763A push    esi
.text:004C763B mov     edx, 104h
.text:004C7640 lea     ecx, [esp+214h+var_104]
.text:004C7647 call    sub_41EE40                      ; kopierer en string (serial) til buffer
.text:004C764C lea     edx, [esp+210h+var_104]         ; serial
.text:004C7653 lea     ecx, [esp+210h+var_208]         ; username
.text:004C7657 call    sub_4C7400                      ; den virkelige testen, her inne er den viktige koden
.text:004C765C test    eax, eax
.text:004C765E jz      short loc_4C766E		;vi kunne ha NOP'a ut denne, så hadde den alltid godtatt serial
						;det andre viktige med denne jz'en er at den hopper til en annen serial-sjekk rutine
						;mIRC har faktisk to forskjellige måter å validere serials på. Vi vil bare analysere den første.
.text:004C7660 pop     edi				
.text:004C7661 mov     eax, 1
.text:004C7666 pop     esi
.text:004C7667 add     esp, 208h
.text:004C766D retn
--------------------------------------------------------------------------

Her ser vi at koden zero'er ut to buffere som den etterpå kopierer brukernavn og serial til.
Det har jeg jo selvfølgelig funnet ut ved å single-steppe inn i sub_41EF30 og sub_41EE40.
Jeg orker ikke beskrive hva som skjer her inne fordi det ikke er viktig for serialutregningene.
Anbefaler derimot at dere selv går inn og tracer igjennom det som skjer der.
Trykk F8 21 ganger til du kommer til "call sub_4C7400".

La oss sjekke sub_4C7400. Der inne foregår valideringen av brukernavn vs serial, og vi
ser at den vil returnere 1 i eax dersom koden er gyldig. Denne subrutinen er ganske stor,
så jeg tror jeg prøver å dele den opp litt og forklare etterhvert.
Trykk F7 for å gå inn i den.

--------------------------------------------------------------------------

Kode

.text:004C7400 sub     esp, 0A4h	<- Her havner vi.
.text:004C7406 push    ebx
.text:004C7407 push    ebp
.text:004C7408 push    esi
.text:004C7409 mov     esi, 0Bh
.text:004C740E mov     eax, 0Ah
.text:004C7413 push    edi
.text:004C7414 mov     edi, ecx
.text:004C7416 mov     ecx, 0Eh
.text:004C741B mov     [esp+0B4h+var_A0], esi
.text:004C741F mov     ebp, 6
.text:004C7424 mov     ebx, 10h
.text:004C7429 mov     [esp+0B4h+var_78], esi
.text:004C742D mov     [esp+0B4h+var_64], esi
.text:004C7431 mov     [esp+0B4h+var_50], esi
.text:004C7435 mov     [esp+0B4h+var_44], esi
.text:004C7439 mov     esi, 8
.text:004C743E mov     [esp+0B4h+var_A4], edx
....
OSV.... (måtte kutte ned her slik at posten ikke blir over 16000 tegn)
--------------------------------------------------------------------------

Fortsettelse følger i neste post - m0b
Sist endret av m0b; 10. mai 2006 kl. 23:03.
m0b
m0b's Avatar
DonorAdministrator
Denne koden initialiserer en tabell med verdier.
Verdiene er: {0xb,0x6,0x11,0xc,0xc,0xe,0x5,0xc,0x10,0xa,0xb,0x6,0xe,0xe,0 x4,0xb,0x6,0xe,0xe,0x4,0xb,0x9,0xc,0xb,0xa,0x8,0xa,0xa,0x10, 0x8,0x4,0x6,0xa,0xc,0x10,0x8,0xa,0x4,0x10,0x0}

Trykk F8 57 ganger til du kommer hit:

Dette er fortsettelse på tråden.

--------------------------------------------------------------------------

Kode

.text:004C7518 loc_4C7518:                             ; CODE XREF: sub_4C7400+11Dj
.text:004C7518 mov     dl, [eax]		
.text:004C751A inc     eax
.text:004C751B test    dl, dl
.text:004C751D jnz     short loc_4C7518
.text:004C751F sub     eax, esi
.text:004C7521 cmp     eax, ecx                        ; må være større enn 4 eller større
.text:004C7523 jnb     short loc_4C7532
--------------------------------------------------------------------------

Denne koden sjekker at brukernavn er 4 tegn eller mer, hvis ikke vil den ikke
godta brukernavn. Sørg derfor for å ha langt nok brukernavn.
Trykk F7 til du kommer til adresse: 004C7521 cmp eax, ecx
Denne instruksjonen sammeligner verdiene i eax og ecx.
ecx inneholder verdien 4, og eax inneholder lengden på brukernavnet ditt
Trykk F7 en gang og du havner på "jnb short loc_4C7532".
Denne intruksjonen hopper til adresse loc_4C7532 dersom comparen i forrige
instruksjon tilsier at eax ikke er mindre enn ecx. jnb står for
"jump if not below". Dersom du har et brukernavn som er mindre enn 4 tegn vil
koden ikke hoppe her, men istedet returnere fra denne subrutinen med verdi 0.
Dette vil vi ikke, så dersom du har brukt et navn med mindre enn 4 tegn
må du trykke F9. Programmet vil da vise deg en message om at serial ikke var
korrekt. Skriv så inn et lengre brukernavn og trykk OK igjen. Breakpointet
er fortsatt aktivt, og du vil havne på begynnelsen igjen. Single-step så til du
kommer tilbake til "004C7523 jnb short loc_4C7532".

Trykk F7 en gang og du kommer hit:

--------------------------------------------------------------------------

Kode

.text:004C7532 mov     ebx, [esp+0B4h+var_A4]
.text:004C7536 push    2Dh
.text:004C7538 push    ebx
.text:004C7539 call    _strchr                          ; denne subrutinen returnerer en pointer til første tilfelle av tegnet "-" i en string
						        ; hvis det ikke eksisterer returnerer den 0
.text:004C753E mov     esi, eax
.text:004C7540 add     esp, 8
.text:004C7543 test    esi, esi
.text:004C7545 jz      short loc_4C7525
--------------------------------------------------------------------------

Denne koden leter etter en "-" i serial, hvis den ikke finnes vil programmet
ikke godta serial (altså den hopper til loc_4C7525 dersom esi er 0).
2Dh er forresten hexkoden for ascii-tegnet "-".
Vi må derfor skrive inn nytt serial. Trykk F9, og skriv inn nytt serial.
(F.eks "Elessar" og "1234-123456").
Når du trykker OK vil programmet fortsatt breake på breakpointet vi har
satt. Vi er derfor tilbake på begynnelsen og må single-steppe til vi
kommer til: 004C7545 jz short loc_4C7525. Denne gangen vil programmet
ikke hoppe, så vi kan trykke på F7 en gang.

Vi kommer til denne koden:

--------------------------------------------------------------------------

Kode

.text:004C7547 push    ebx				; pointer til serial
.text:004C7548 mov     byte ptr [esi], 0		; nullterminerer serial der "-"'en er
.text:004C754B call    _atol                            ; string to long, konverterer alt i serial før "-" til en long
.text:004C7550 add     esp, 4
.text:004C7553 mov     byte ptr [esi], 2Dh              
.text:004C7556 inc     esi
.text:004C7557 mov     ebp, eax                         ; putter første del av serial i ebp
.text:004C7559 cmp     byte ptr [esi], 0
.text:004C755C jz      short loc_4C7525
.text:004C755E push    esi
.text:004C755F call    _atol                            ; string to long, konverterer alt i serial etter "-" til en long
.text:004C7564 mov     ecx, edi
.text:004C7566 add     esp, 4
.text:004C7569 mov     [esp+0B4h+var_A4], eax		; putter andre del av serial i en stackvariabel
--------------------------------------------------------------------------

Kommentarene mine til denne koden burde være nok. Vi vet ihvertfall nå at serial har dette formatet:

"tall-tall"

Trykk nå på F8 til du kommer hit:

--------------------------------------------------------------------------

Kode

.text:004C7590 movzx   eax, byte ptr [esi+edi]         ; henter ut (char)brukernavn[esi], der esi begynner på 3, altså den fjerde byten
.text:004C7594 imul    eax, [esp+edx*4+0B4h+var_A0]	
.text:004C7599 add     ebx, eax				;ebx = ebx + ( (char)brukernavn[esi] * tabell[esi-3])
.text:004C759B inc     edx
.text:004C759C cmp     edx, 26h
.text:004C759F jle     short loc_4C75A3
.text:004C75A1 xor     edx, edx
.text:004C75A3
.text:004C75A3 loc_4C75A3:                             ; CODE XREF: sub_4C7400+19Fj
.text:004C75A3 inc     esi
.text:004C75A4 cmp     esi, ecx
.text:004C75A6 jl      short loc_4C7590              ;looper (lengde på brukernavn minus 3) ganger
--------------------------------------------------------------------------

Denne koden kan kanskje bedre forklares med litt java:

for(int esi=3;esi<(lengde på brukernavn);esi++) {
ebx += brukernavn[esi]*tabell[(esi-3)%0x26];
}

Der tabell er den tabellen som ble initialisert tidligere.

Trykk F8 til du kommer hit:

--------------------------------------------------------------------------

Kode

.text:004C75A8 cmp     ebp, ebx                        ; den første delen i serial skal være verdien som er i ebx
.text:004C75AA jnz     loc_4C7525			;hvis ikke er serial ugyldig
--------------------------------------------------------------------------
Verdien som står i ebx er altså den første delen av serial (med grunntall 10 vel å merke).
For "Elessar" vil da første del av serial være:

"4972-"

Det er kanskje best om du nå trykker F9, skriver inn "4972-" (eller din verdi for ditt brukernavn),
og singlestepper til du kommer tilbake til "004C75AA jnz loc_4C7525" igjen.

Trykk så F7 en gang til du kommer hit:


--------------------------------------------------------------------------

Kode

.text:004C75B0 mov     esi, 3  		<- Vi havner her.
.text:004C75B5 xor     edx, edx
.text:004C75B7 xor     ebx, ebx
.text:004C75B9 cmp     ecx, esi
.text:004C75BB jle     short loc_4C75E0
.text:004C75BD lea     ecx, [ecx+0]
.text:004C75C0
.text:004C75C0 loc_4C75C0:                             
.text:004C75C0 movzx   eax, byte ptr [esi+edi-1]       ; henter ut (char)brukernavn[esi-1] 
.text:004C75C5 movzx   ebp, byte ptr [esi+edi]	       ; henter ut (char)brukernavn[esi] 
.text:004C75C9 imul    eax, ebp                        ; ganger disse verdiene sammen 
.text:004C75CC imul    eax, [esp+edx*4+0B4h+var_A0]    ; ganger denne verdien igjen med tabell[esi-3]
.text:004C75D1 add     ebx, eax			       ; ebx = ebx + verdi
.text:004C75D3 inc     edx
.text:004C75D4 cmp     edx, 26h
.text:004C75D7 jle     short loc_4C75DB
.text:004C75D9 xor     edx, edx
.text:004C75DB
.text:004C75DB loc_4C75DB:                             ; CODE XREF: sub_4C7400+1D7j
.text:004C75DB inc     esi
.text:004C75DC cmp     esi, ecx
.text:004C75DE jl      short loc_4C75C0
--------------------------------------------------------------------------

Best forklart med noe mer java-kode:

for(int esi=3;esi<(lengde på brukernavn);esi++) {
ebx += (brukernavn[esi]*brukernavn[esi-1])*tabell[(esi-3)%0x26];
}
Så siste del,

trykk F7 til du kommer hit:

--------------------------------------------------------------------------

Kode

.text:004C75E0 mov     ecx, [esp+0B4h+var_A4] 	       ;stackvariabelen som siste del av serial ble lagret i
.text:004C75E4 pop     edi
.text:004C75E5 pop     esi
.text:004C75E6 xor     eax, eax
.text:004C75E8 cmp     ecx, ebx                        ; siste del av serial skal være det som står i ebx
.text:004C75EA pop     ebp
.text:004C75EB setz    al
--------------------------------------------------------------------------
Det som står i ebx nå er det som skal være siste del i serial.
Vi har nå et komplett serial for brukernavn "Elessar": "4972-529446".

Og ikke minst har vi alt vi trenger for å lage en keygen.
Siden jeg ikke har installert noen form for compiler på denne laptopen unntatt java,
har jeg bestemt meg for å programmere keygennen i java.
Sourcekoden til keygennen er:

Kode

//Keygen for mIRC, laget av Elessar (Evinyatar) for nFF
import java.io.*;
class Keygen {
 
	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
		System.out.print("mIRC keygen\nSkriv inn brukernavn: ");
		String bruker = in.readLine();
 
		if(bruker.length() > 3) {
			System.out.println("Serial for " + bruker + " er: " + finnSerial(bruker));
		}else{
			System.out.println("\nBrukernavn må være lengre enn 3 tegn!");
		}
	}
 
	private static String finnSerial(String bruker) {
 
		//oppslagstabell
		final int[] tabell = {0xb,0x6,0x11,0xc,0xc,0xe,0x5,0xc,0x10,0xa,0xb,0x6,0xe,0xe,0x4,0xb,0x6,0xe,0xe,0x4,0xb,0x9,0xc,0xb,0xa,0x8,0xa,0xa,0x10,0x8,0x4,0x6,0xa,0xc,0x10,0x8,0xa,0x4,0x10,0x0};
 
		char[] array = bruker.toCharArray();
 
		int del1 = 0; //første del av serial
		int del2 = 0; //andre del av serial
 
		for(int i=3;i<bruker.length();i++) {
			del1 += (int)array[i]*tabell[(i-3)%0x26];
			del2 += ((int)array[i]*(int)array[i-1])*tabell[(i-3)%0x26];
		}
 
		return del1 + "-" + del2;
	}
 
}
Sist endret av m0b; 10. mai 2006 kl. 23:04.
Jeg har nå prøvd meg med både olly og IDA Pro men får ikke til noe... eneste jeg omsider kom fra til reg vinduet til mirc med IDA, men der stoppet det

Nå skal det sies at jeg kun har en demo 5.0 av IDA kan det være noe der?

mvh DrDoc
Evinyatar's Avatar
Trådstarter
Muligens, IDA 5.0 demo har en del begrensninger, men jeg vet ikke hvilke.
Hvis du sier ifra hvor du sitter fast, så kanskje jeg kan prøve å guide deg fra der?

Skal selvfølgelig også være fullt mulig å bruke Ollydbg, men output vil
jo ikke ligne helt på det som jeg har postet.
Sist endret av Evinyatar; 1. mai 2006 kl. 20:02.
Vet ikke helt om dette er lov å skrive, jeg. Men man kan jo gå på #serialz @ efnet. Skrive !serial mirc

Også får man serial
Evinyatar's Avatar
Trådstarter
Hehe, joda, men ideen var jo å lære hvordan man finner den selv.
Husk at de på #serialz har gjort noe liknende av dette for å finne tak i serial =)

Som en kjent cracker en gang sa:

Give a man a crack, and he will be hungry again tomorrow.
Teach a man to crack, and he will never be hungry again
Vis hele sitatet...
Sist endret av Evinyatar; 1. mai 2006 kl. 20:04.
Hei

Ja, jeg vil klare det selv, klarte det engang tidligere med den winzip saken som Tipex la ut tidligere, så jeg skal klare det igjen

mvh DrD
Evinyatar's Avatar
Trådstarter
Flott innstilling!
I min erfaring er det folk med slik innstilling som gjør det bra =)
Jepp Evinyatar! Helt enig, har selv cracket et par små programmer.

Bra initiativ Hadde vært utrolig kjekt med flere sånne poster
Evinyatar's Avatar
Trådstarter
Takk, takk.
Joda, jeg har noen planer =)
Hei igjen

Har du en litt mer detaljert guide for meg som newbie på detta? Etter at jeg hadde skrevet inn min reg på mirc og trykket ok, så stoppet jo break på der jeg hadde satt den.

Men jeg fant det ikke igjen i den posten du skrev ; text:004C7BD2 mov edx, offset a1234123456 ; "1234567"
.text:004C7BD7 mov ecx, offset aElessar ; "Elessar"
.text:004C7BDC call sub_4C7600 ; sjekk brukernavn og serial
.text:004C7BE1 test eax, eax
.text:004C7BE3 jz loc_4C7CCE

Det der så jeg aldri, selv om jeg brukte annet navn og key.. men fant adressene

mvh DrD
Evinyatar's Avatar
Trådstarter
Hvor er det din breaker da? Hvis du paster litt output fra der du er så kanskje
det blir lettere for meg å se hva du har gjort og hvor du er =)

.text:004C7BD2 mov edx, offset a1234123456 ; "1234567"
.text:004C7BD7 mov ecx, offset aElessar ; "Elessar"
.text:004C7BDC call sub_4C7600 ; sjekk brukernavn og serial
.text:004C7BE1 test eax, eax
.text:004C7BE3 jz loc_4C7CCE

Hvis du undret på det, så er de tingene som står etter ; det jeg har skrevet
som kommentarer.

Mente du at det ikke stod f.eks offset dittserialher, men
istedet en adresse som f.eks offset dword_5A0BC8 ?
Det burde jeg kanskje ha nevnt, men jeg har endret på disse
navnene for å gjøre koden mer lesbar. I IDA pro kan man høyreklikke
på variabelnavnene og gi dem nytt navn.

Beklager om det var det som forvirret deg
Sist endret av Evinyatar; 1. mai 2006 kl. 20:53.
Jeg gir meg ikke ennå nei

Hvor mange ganger må jeg resume? (f9 antar jeg?) føler jeg må trykke ett utall antall ganger før jeg kommer noe framover, er det rett?

mvh DrD
Evinyatar's Avatar
Trådstarter
Enda et lurt triks jeg burde ha fått med i artikkelen:

Disable det breakpointet du har på SendDlgItemMessage, og vent
heller med å enable den igjen like før du trykker på OK knappen
i registrerings-dialogen. På denne måten vil den ikke breake
på alle de andre gangene et kall til den apien skjer.

Du kan disable breakpointet ved å gå i names vinduet igjen
og søke etter apien. høyreklikk og velg disable.
Etter du har skrevet inn registreringsinformasjonen og er klar
til å trykke OK, da først kan du enable den igjen.

Hvis du ikke ser Names vinduet mens du har debuggeren oppe
kan du gå på:

View->Open subviews->Names
.text:004C7BD2 mov edx, offset dword_5A0BC8
.text:004C7BD7 mov ecx, offset dword_5A07E0


da fikk jeg dette, er jeg på rette veien da?

mvh DrD
Evinyatar's Avatar
Trådstarter
Jepp!
Der er koden som passerer argumentene (brukernavn og serial) til
funksjonen som validerer (call sub_4C7600).

Jeg hadde bare gitt variablene dword_5A0BC8 og dword_5A07E0 nye navn.

Stå på! =)
jeg sitter nå her å prøver, men skjønner egentlig svært lite trace tilbake til hvor osv? skjønner nada av det, men jeg prøver nå iaf

"Så tracer du koden til der vi var =" <- hvor i heite var vi da

mvh DrD
Evinyatar's Avatar
Trådstarter
Dette skrev jeg:

Denne koden leter etter en "-" i serial, hvis den ikke finnes (altså at den returnerer 0), så
vil programmet ikke godta serial. Restart derfor prosessen og skriv inn nytt serial.
F.eks "Elessar" og "1234-123456"
Så tracer du koden til der vi var =)
Vis hele sitatet...
Og dette var koden som teksten refererte til:

.text:004C7532 mov ebx, [esp+0B4h+var_A4]
.text:004C7536 push 2Dh
.text:004C7538 push ebx
.text:004C7539 call sub_570260 ; denne subrutinen returnerer en pointer til første tilfelle av tegnet "-" i en string
; hvis det ikke eksisterer returnerer den 0
.text:004C753E mov esi, eax
.text:004C7540 add esp, 8
.text:004C7543 test esi, esi
.text:004C7545 jz short loc_4C7525
Vis hele sitatet...
Jeg er kanskje dårlig til å forklare, men det jeg det jeg prøvde å forklare var hva jeg
får ut av å se en kode som denne. Koden sjekker om serial inneholder en '-'. Hvis den ikke gjør det hopper den (jz short loc_4C7525) til en annen sted i koden som returnerer ut av denne subrutinen med en verdi i eax satt til 0 (false). Programmet vil jo sammenligne verdien i eax når den har kommet ut av subrutinen. Hvis eax inneholder 0 vil den vise en beskjed om at serial er feil. Hvis den ikke er 0 viser den at serial er korrekt.

Siden vi skrev inn et tulleserial (1234567) vil jo ikke koden finne en '-' i
serial, og dermed vil den hoppe på koden: jz short loc_4C7525

Jeg ville derfor at vi skrev inn en ny serial med en - i, f.eks 1234-123456,
og så gjøre akkurat det samme som du har gjort opp til det punktet.
Altså å gå gjennom koden til du kommer til der den sjekker om '-' er i serial igjen,
for denne gangen vil koden IKKE hoppe på jz short loc_4C7525, slik at vi kan fortsette
å analyse.

Håper det ble litt lettere å forstå =)
Hallois

Jeg kommer "aldri" til å kunne skrive noe i help/reg i mirc progget.. kan trykke f9 og enter i hele kveld

mvh DrD
Evinyatar's Avatar
Trådstarter
.text:004C7BD2 mov edx, offset dword_5A0BC8
.text:004C7BD7 mov ecx, offset dword_5A07E0

Men hvis du hadde kommet forbi den koden her, så må du jo ha fått skrevet
inn brukernavn og serial?

Jeg håper du ikke bare trykker F9, men bruker F7 (step into) og F8 (step over) også.

F7 og F8 single-stepper en instruksjon om gangen. Forskjellen er at
F7 går inn i subrutiner, mens F8 utfører alt i subrutinen og fortsetter til
instruksjonen etter call.
"Restart derfor prosessen"

hvor langt tilbake skal jeg da gå? hva skal trykke i ida progget?
Evinyatar's Avatar
Trådstarter
Når jeg skriver "restart prosessen" mener jeg at du skal trykke på "stop" knappen.
(terminate the debugged process) og start på nytt igjen helt fra begynnelsen.
I dette tilfellet,dog, trenger du ikke gjøre det, du kan heller bare skrive inn brukernavn og serial på nytt (etter at du har trykt F9, continue) og trace koden (F7 og F8) tilbake
til dit du var kommet i tutorialen.
Hei å hå

men nå tror jeg at hjernen skal få litt hvile med spillet Condemned... prøver igjen i morgen kveld, med litt mer hvilt hodet som klarer å tenke litt klarere

mvh Dr
Evinyatar's Avatar
Trådstarter
Oki =)
Tenkte kanskje jeg kunne skrive et lite tillegg til denne artikkelen, med
informasjon om hvert eneste lille tastetrykk jeg trykker. Blir kanskje lettere
å følge da?

Har også vurdert en artikkel om bruk av IDA pro/Ollydbg.
Heisann

Nå virker jeg jo kanskje veldig dum men det er da tross alt mitt andre forsøk på cracke ett prog da så jeg trenger det bit for bit, eller inn med teskje

Takker enda engang da

ps, gjelder metoden på andre små progs også?

mvh DrD
Evinyatar's Avatar
Trådstarter
Synes ikke du virker dum i det hele tatt. Det tar litt tid å lære dette, det vet jeg av erfaring (dessuten er forklaringene mine i vageste laget) =)

Hva slags metode er det du snakker om?

Min generelle approach er:

Finn hvor den leser inn registreringsinformasjon, og debug fra der for å
se hva den faktisk gjør med informasjonen.

Brorparten av programmene jeg har tatt har brukt vanlige tekstbokser som
du skriver inn registreringsinformasjonen i. Det finnes bare et fast antall apier som
kan brukes til å lese tekst fra en tekstboks, så problemet er vanligvis bare å finne ut av hvilke det er slik at du kan sette breakpoint på dem. Men man kan jo bare prøve seg frem.

Her er de jeg kommer på i farta:

De to mest brukte apiene:
GetWindowText
GetDlgItemText

Andre måter:
SendMessage med WM_GETTEXT og handle til tekstboks.
SendDlgItemMessage (den som mirc bruker) med WM_GETTEXT og dialog-id til tekstboks.
GetDlgItemInt, denne har jeg bare sett i bruk en gang. Den leser et tall fra en tekstboks.

LoadLibrary og GetProcAddress.
Sist endret av Evinyatar; 2. mai 2006 kl. 00:06.
▼ ... over en uke senere ... ▼
Evinyatar's Avatar
Trådstarter
Nå har jeg fått lagt inn noen små endringer i artikkelen som forhåpentligvis
gjør den litt lettere å følge.

Legger forresten ved en del linker til diverse cracking/asm-ressurser:

assemblyprogrammering:

kan ikke bli god cracker uten et godt grep om assemblyen =)

http://win32asm.cjb.net - side med win32asm ressurser, win32 asm er da assembly i windows

www.movsd.com - hjemmesiden til masm32, den beste assembleren for win32, imo

cracking:

http://www.fhcf.net - norsk crackegruppe, lagt ned nå. noen norske tutorials her.

http://forum.fhcf.net/ - fhcf's forum, fremdeles aktiv

http://www.reteam.org - en gjeng med flinke crackere/reversere, de har også noen bra artikler

http://www.reteam.org/research.html - reteam's samling av tutorials, her kan man også legge inn egne.

http://zor.org/krobar - samling av tutorials (mange for nybegynnere), mye dårlig, noe bra

http://www.crackmes.de - side full av crackmes/keygenmes, fint sted å øve på =)

http://www.woodmann.com/forum/ - Reverse Engineering/cracking/unpacking forum

http://community.reverse-engineering.net/ - Reverse Engineering/cracking/unpacking forum

http://www.woodmann.com/fravia/index.htm - Legendarisk, men nå ganske utdatert.Dette er cracking-historie dog, historiepensum for alle crackere (artige historier om +ORC) =) En del gullkorn er nok fremdeles å finne.

http://www.searchlores.org/ - Det nye forumet til +Fravia. Ikke så mye crackinginformasjon lengre, men mye informasjon om søketeknikker og søkemotorer.
Viktig, siden man må være flink til å lete etter god informasjon =)

http://biw.rult.at - sted med crackmes og tutorials

tools:
http://www.exetools.com/ - tools til cracking og programmering
http://protools.cjb.net/ - tools til cracking og programmering