Author: | Potsmoke |
Target: | Bishop's CrackMe 9 |
Tools: | SoftIce, Ida Pro |
Other: | De som vil kan jo bruke W32dasm i steden for Ida Pro, Les tutorialen i Internet Explorer 5 |
|
Hvor mange ganger
har du ikke funnet en serial uten å egentlig vite hvordan den ble laget?
Du tracer i SoftIce, dumper alt som lyser av registre uten å ha en fjern
anelse om hva du egentlig driver med, plutselig dukker det opp en rekke med
tall i data window som du noterer ned på en liten lapp og håper
på er serialen.
I noen programmer kan man trace og dumpe alt som er men likevel ikke finne noe
serial, hvorfor?
En gang cracket jeg et program der jeg fant serialen og var fornøyd med
det da jeg ikke skjønte hvordan serialen ble laget, et par måneder
senere får jeg høre at dette programmet har Blowfish algo :) Tenk
deg at et program som har en såpass solid beskyttelse likevel viser serialen
(Samme gjelder RSA og andre typer), det er nok noe med måten algoen er
laget/satt inn på som gjør at den viser serialen, et eller annet
sted må jo programmet sjekke om denne serialen er den samme som vi har
skrevet inn.
For å unngå slikt kan det jo være en ide å ikke sjekke
hele serialen på slutten men heller sjekke deler av den, i dag skal vi
se på en CrackMe der du ikke finner serialen uansett hvor mye du dumper,
her skal vi reverse litt :)
|
I
det vi fyrer opp CrackMe'n finner vi ut at den har anti SoftIce beskyttelse,
i følge reglene på denne CrackMe'n må man fjerne denne manuelt
uten bruk av IcePatch eller FrogSIce (IcePatch og FrogSIce er 2 programmer som
lurer anti SoftIce beskyttelsen slik at vi likevel kan bruke SoftIce)
Vi fyre opp Ida Pro og begynner å disassemble, vi tar så turen innom
string data refs der vi klikker på stringen "SoftICE detected..."
(Husk at det finnes import/export/string data refs plugin til Ida Pro for de
som ikke liker Ida slik den er, jeg er en av de)
004010E6 loc_4010E6: ; CODE XREF: sub_40102B+14j
004010E6 push 0
004010E8 push offset aSofticeDetecte ; "SoftICE detected..."
004010ED push offset aSofticeDetec_0 ; "SoftICE detected, oh FrogSICE not allow"...
004010F2 push 0
004010F4 call j_MessageBoxA
004010F9 jmp short loc_4010D6
Error messagen blir
pushet på stacken og så blir messageboxen callet. Hvis vi ser helt
øverst kan vi se at vi kom fra adressen 40103F (40102B+14=40103F) så
det vil vel si at det er noe på den adressen som sjekker om SoftIce er
loadet eller ikke.
La oss ta turen til adresse 40103F.
0040102B push ebp
0040102C mov ebp, esp
0040102E cmp [ebp+arg_4], 110h
00401035 jnz short loc_401093
00401037 mov ah, 43h
00401039 int 68h ; - APPC/PC
0040103B cmp ax, 0F386h
0040103F jz loc_4010E6 <-- Hopp og vis error message hvis SoftIce er loadet
00401045 jmp short loc_40105B
Når man ser int 68 eller int 3 bør det ringe en bjelle, dette er typisk anti SoftIce.
Her er et utdrag fra FrogSIce Code.txt filen:
____________________________________________________________________________
Code 07
=======
Method of detection of the WinICE handler in the int68h (V86)
mov ah,43h
int 68h
cmp ax,0F386h
jz SoftICE_Detected
Note that, while loaded, FrogsICE will patch interrupt 68h so that it
will be impossible for an application to detect SoftICE.
=> it is not possible to set a BPINT 68 with softice but you can hook a 32Bit
app like this:
BPX exec_int if ax==68
(function called is located at byte ptr [ebp+1Dh] and client eip is
located at [ebp+48h] for 32Bit apps)
_____________________________________________________________________________
Det sier seg vel selv at det er JZ (0040103F) som avgjør om vi får anti SoftIce erroren eller ikke, for å fjerne anti SoftIce beskyttelsen må vi få den til å IKKE hoppe, det kan vi gjøre på flere måter, valget er ditt :) (Nop*6 eller jnz eller kanskje cmp bx, 0F386)
Nå som anti
SoftIce beskyttelsen er fjernet kan vi sette et breakpoint på GetDlgItemTextA,
vi skriver inn et serial (112288) og trykker på "Check" knappen.
Vi trykker F11 for å komme inn i koden.
004010B4 E8D9000000 CALL USER32!GetDlgItemTextA <-- Her havner vi
004010B9 8BC8 MOV ECX,EAX <-- Legger lengden av serialen vår inn i ECX
004010BB 83F900 CMP ECX,00 <-- Sjekker om vi har skrevet inn serial
004010BE 747E JZ 0040113E <-- Hopp og avslutt hvis serial mangler
004010C0 E87D000000 CALL 00401142 <-- Inne i callet blir serial regnet ut
004010C5 3D4B435546 CMP EAX,4655434B <-- Er EAX lik 4655434B?
004010CA 7433 JZ 004010FF <-- Hvis EAX er lik 4655434B hopper vi til REGISTERED
004010CC EB59 JMP 00401127 <-- Hvis ikke EAX er lik 4655434B hopp og avslutt
004010CE EB10 JMP 004010E0
004010D0 837D0C10 CMP DWORD PTR [EBP+0C],10
004010D4 750A JNZ 004010E0
004010D6 6A00 PUSH 00
004010D8 FF7508 PUSH DWORD PTR [EBP+08]
004010DB E8A6000000 CALL USER32!EndDialog
004010E0 33C0 XOR EAX,EAX
004010E2 C9 LEAVE
004010E3 C21000 RET 0010
004010E6 6A00 PUSH 00
004010E8 68E1344000 PUSH 004034E1
004010ED 6891344000 PUSH 00403491
004010F2 6A00 PUSH 00
004010F4 E89F000000 CALL USER32!MessageBoxA
Vi tar turen innom
callet (004010C0),
trykker F8
for å gå inn i callet når du står på adressen
004010C0
00401142 83F90C CMP ECX,0C <-- Er serialen vår 12 tegn? 00401145 7535 JNZ 0040117C <-- Hopp hvis serialen vår IKKE er 12 tegn 00401147 33C0 XOR EAX,EAX <-- Gjør klar til utregning, resetter EAX (EAX=0) 00401149 8D0500304000 LEA EAX,[00403000] <-- Legger en pointer til serialen vår inn i EAX 0040114F C10009 ROL DWORD PTR [EAX],09 <-- ROL'er de første 4 tegnene i serialen vår med 9 00401152 813064727068 XOR DWORD PTR [EAX],68707264 <-- XOR'er resultatet med 68707264 00401158 7522 JNZ 0040117C <-- Hvis resultatet av XOR'en ikke er lik 0 hopp og quit 0040115A 83C004 ADD EAX,04 <-- Gjør de 4 midterste tegnene i serialen vår klar 0040115D C10809 ROR DWORD PTR [EAX],09 <-- ROR'er de 4 midterste tegnene i serialen vår med 9 00401160 81309B989C99 XOR DWORD PTR [EAX],999C989B <-- XOR'er resultatet med 999C989B 00401166 7514 JNZ 0040117C <-- Hvis resultatet av XOR'en ikke er lik 0 hopp og quit 00401168 83C004 ADD EAX,04 <-- Gjør klar de 4 siste tegnene i serialen vår 0040116B C10809 ROR DWORD PTR [EAX],09 <-- ROR'er de 4 siste tegnene i serialen vår med 9 0040116E 81301C991918 XOR DWORD PTR [EAX],1819991C <-- XOR'er resultatet med 1819991C 00401174 7506 JNZ 0040117C <-- Hvis resultatet av XOR'en ikke er lik 0 hopp og quit 00401176 B84B435546 MOV EAX,4655434B <-- Hvis alle resultater stemmer legg 4655434B i EAX 0040117B C3 RET <-- Return to caller :)
(Hvis du kjeder
deg skriv ? 4655434B i SoftIce, FUCK? hehe, artig verdi å legge i EAX
dersom serialen er riktig)
Her har vi selve utregningen av serialen, kanskje ikke lett å si hva serialen
skal være i farten, det finnes kun EN serial som er riktig.
Helt øverst kan vi se at serialen må være 12 tegn (C hex),
siden jeg i begynnelsen brukte 112288 som serial må jeg nå bytte
den ut med noe annet, jeg velger heller 111122228888 og trykker igjen på
"Check" knappen.
Når jeg nå tracer over CMP ECX,0C vil den ikke hoppe fordi serialen
min er 12 tegn, den resetter så EAX og gjør seg klar til utregning
av serial.
Programmet starter med å legge en pointer til serialen vår inn i
EAX, så ROL'er den de 4 første tegnene i serialen vår med
9 (dword = 4byte)
Resultatet av de 4 første tegnene i serialen vår ROL'et med 9 skal
bli 68707264, hvis resultatet ikke er det vil CrackMe'n vise oss erroren "Nope,
wrong code"
Hvis resultatet av de 4 første tegnene i serialen ROL'et med 9 blir 68707264
vil 68707264 XOR 68707264 bli 0, XOR'er man et tall med et likt tall blir alltid
resultatet 0, det er slik vi nullstiller registre blant annet.
For at de 4 første tegnene i serialen vår skal bli riktig må
de 4 første tegnene ROL'et med 9 og så XOR'et med 68707264 bli
lik 0, hvis resultatet ikke blir 0 vil heller ikke serialen bli riktig.
For å komme videre må vi altså finne ut hvilket tall ROL'et
med 9 som blir 68707264, hvordan skal vi nå få til dette da? Reversing?
:)
Vi starter CrackMe'n på nytt, skriver inn 111122228888, trykker "Check" knappen og tracer helt til vi havner på ROL (40114F) når vi står på ROL linjen skriver vi følgende:
d eax [enter] | ;Display memory - Så vi editerer på riktig plass i minnet hvor de 4 første tegnene i serialen ligger |
a [enter] | ;Assemble code - Gjør klar til å endre ASM koden |
ror dword ptr [eax], 09 [enter] [enter] | ;Endrer selve ASM koden i programmet, men dette skjer i minnet |
e [enter] | ;Edit memory - Gjør at vi kan endre vedier i minnet |
64727068 [enter] | ;Skriver inn 68707264 reversert i minnet, vi skriver inn 64727068 på plassen til 31313131 (1111) |
Vi trykker F10 1 gang, legg merke til verdien i data window, 984211118888,
Trykk F5 for å gå ut av SoftIce.
Hva er dette
for et nummer? :) hihi, de 4 første tallene i serialen skal altså
være 9842, nå er det bare å finne ut hva de 8 neste tegnene
skal være og det fungerer mer eller mindre på samme måte.
Dette kan kanskje
virke litt rotete men er ganske logisk, vi ville finne ut hvilken 4 tall ROL'et
med 9 som gir oss resultatet 68707264, vi reverserte litt, endret ROL til ROR
og la inn 68707264 i minnet slik at SoftIce ROR'et verdien og slik fikk vi vite
hva de 4 første tegnene i serialet skulle være.
Reverse vil si at vi gjør ting baklengs for å finne ut hva en verdi
skal være for å få riktig resultat, derfor brukte vi ROR som
er motsatt (baklengs) av ROL.
Grunnen til at vi skrev inn 68797264 som 64727068 er fordi alle verdier i minnet
blir lagret reversert, det er slik CPU'n er bygget opp og fungerer.
Vi har nå
de 4 første tegnene i serialen og vi har endret litt på ASM koden
til programmet, hvis vi nå skriver inn 984211118888 som serial vil ikke
de 4 første tegnene lengre være riktige da vi endret ROL til ROR,
dette vil si at vi må endre ROR tilbake til ROL slik at vi får tilbake
den orginal koden.
Det finnes 2 måter å endre koden tilbake på, vi kan trace
og endre koden slik vi gjorde i sta men bare motsatt eller vi kan rett og slett
restarte CrackMe'n, når vi restarter CrackMe'n vil vi få tilbake
den orginale koden, alle endringer vi gjør i SoftIce skjer jo bare i
minnet og disse vil forsvinne når vi restarter CrackMe'n
Etter at vi har avsluttet CrackMe'n fyrer vi den opp igjen, skriver inn 984211118888
som serial og trykker "Check" knappen, nå kan vi trace til vi
havner på ROR (40115D) legg merke til at vi IKKE hopper på jnz (491158)
denne gangen, det er fordi de 4 første tegnene i serialen vår er
riktig, 9842 ROL med 9 = 687072664 som XOR'et med 68707264 = 0 og det er 0 vi
vil ha som resultat.
Nå skal vi se på de 4 midterste tegnene i serialen og denne gangen
blir tallene ROR'et med 9 i steden for ROL'et, det vil si akkurat det motsatte.
Når vi står på ROR (40115D) skriver vi følgene:
d eax [enter] | ;Display memory - Så vi editerer på riktig plass i minnet hvor de 4 midterste tegnene i serialen ligger |
a [enter] | ;Assemble code - Gjør klar til å endre ASM koden |
rol dword ptr [eax], 09 [enter] [enter] | ;Endrer selve ASM koden i programmet, men dette skjer i minnet |
e [enter] | ;Edit memory - Gjør at vi kan endre vedier i minnet |
9B989C99 [enter] | ;Skriver inn 999C988B reversert, vi skriver inn 9B989C99 på plassen til 32323232 (2222) |
Vi trykker F10 1 gang og noterer verdien i data window, 984237198888
Trykk F5
for å gå ut av SoftIce.
Nå som vi kjenner til de 8 første tegnene i serialen gjenstår
kun de 4 siste.
Vi må
igjen restarte CrackMe'n igjen før vi kan fortsette.
Vi er nesten ferdig
nå, vi skriver inn 984237198888 som serial etter at vi restartet CrackMe'n,
vi ser at første og andre del av serialen blir godkjent og vi havner
på en ny ROR (40116B)
Vi skriver følgene:
d eax [enter] | ;Display memory - Så vi editerer på riktig plass i minnet hvor de 4 siste tegnene i serialen ligger |
a [enter] | ;Assemble code - Gjør klar til å endre ASM koden |
rol dword ptr [eax], 09 [enter] [enter] | ;Endrer selve ASM koden i programmet, men dette skjer i minnet |
e [enter] | ;Edit memory - Gjør at vi kan endre vedier i minnet |
1C991918 [enter] | ;Skriver inn 1819991C reversert, vi skriver inn 1C991918 på plassen til 38383838 (8888) |
Nå er det bare å trykke F10 1 gang og vi noterer de 4 siste tallene
som er 0823 før vi går ut av Softice ved å trykke F5
Hele serialen skal
nå være 984237190823, vi disabler breakpointet ved å skrive
bd 0 (har du flere breakpoint skriver du bd *) og så er det bare å
restarte CrackMe'n for å få tilbake den orginale koden før
vi prøver serialen, tror du serialen funker da? nesten for godt til å
være sant spør du meg.
Utrolig men sant, den funket.
I dag har vi sett på en serial protection der du ikke kan finne serialen
uten å litt peil på hva du driver med, vi har også sett litt
på revsering av algo, noe som brukes en del.
|
|
Da var vi ferdig
for i dag, håper du lærte noe :)
Du finner som vanlig flere norske tutorials på www.fhcf.net
Kjeder du deg kan du sende en mail til team_fhcf@hotmail.com eller ta turen
innom #Cracking.no på IRC EFNet.
Håper jeg ser deg igjen i noen av mine andre tutorials, natt....