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

 

Intro

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 :)

Tutorial

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.

Greets

Alle i Flying Horse Cracking Force, spesielt til pDriLl som nettop ble med i FHCF, ønsker deg lykke til og ser frem til å jobbe med deg.
Alle som henger på #Cracking.no og noen av de som henger på #Cracking4newbies.
Til alle som har forlatt cracking scenen og IRC, alle jeg ikke lengre ser og sikkert alldri får se igjen :( noen av disse er FastCode, jaydog, sheep fra CREAM, MACER, dracon og mange andre, håper dere en dag kommer tilbake.
Andre personer som fortjener en liten greet er vel Cereal, Mohammed, Bishop, Elessar, Trevil, SpiritMaster, Kyr0N (Juice du er på ferie likevel heldige j....)

Mine real life venner som sikkert alldri kommer til å se denne teksten.


Slutt

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....