Idag har jeg lekt meg litt med OllyDbg, mest for å lære meg å bruke den. Så i den anledning vil jeg skrive veldig kort og enkelt om hva jeg gjorde. I første omgang gidder jeg ikke forklare så veldig dypt omkring hvorfor jeg gjør ting og oppgir heller ikke noen adresser i programmet som vil være veldig versjonsbestemt, dere får heller spørre i tråden ![Mr Cool](/forum/images/smilies/freak/cool.gif)
Det å ha lest den gamle tråden om cracking av Hex Workshop vil være en stor fordel.
WinZip 8.0
Her tenkte jeg først jeg bare skulle finne en gyldig registrasjonsnøkkel. Det burde være grei skuring tenkte jeg når jeg startet OllyDbg og lastet inn WinZip.exe.
Først måtte jeg ordne meg noen breakpoints så jeg kunne begynne å lese hvor WinZip hentet inn sine variabler for å validere det jeg skriver inn. Et breakpoint forteller debuggeren(OllyDbg) hvor den skal bryte inn i kjøringen og la meg se hva som skjer. Av erfaring så tenker jeg at WinZip bruker User32 APIen GetDlgItemTextA for å hente inn det jeg skriver i dialogboksen.
Jeg trykker CTRL+N i OllyDbg for å få opp en liste over alle "names" den finner i WinZip.exe. Ved å sortere på "Name" finner jeg fort fram til user32.GetDlgItemTextA og ved å høyreklikke på den og velge "Set breakpoint on every reference" får jeg et breakpoint på alle plasser som bruker GetDlgItemTextA.
Da er jeg klar til å kjøre WinZip og trykker F9(Run). WinZip starter, jeg finner fram registrasjonsskjermbildet på "Help" menyen og skriver inn "Brukernavn" som navn og "123456" som registrasjonsnummer. I dét jeg trykker OK bryter OllyDbg av og jeg kan se at "Brukernavn" som jeg nettopp skrev inn ligger i et register. Det forteller meg at WinZip har tenkt å sammenligne det jeg skrev inn med noe den generer.
Ved å trykke F8(Step Over) så kjører jeg programmet steg for steg. Grunnen til at jeg bruke Step Over og ikke Step Into er at jeg i første omgang ikke er så interessert i hva som skjer i subrutinene så jeg vil ikke se hva som skjer ved "Calls". Etter noen steg så ser jeg WinZip sammenligner "Brukernavn" med strengen "MuradMeraly" som den har skaffet fram fra et sted. Det vil jo selvsagt ikke gå, men nå er jeg først og fremst ute etter hva den sammenligner registrasjonsnøkkelen med.
Ved å gå videre steg for steg så ser jeg "123456" blir lastet inn i registeret og etterhvert kommer det også "50785491" inn i registeret og blir sammenlignet med min "123456". Aha , tenker jeg og fjerner alle breakpoints(ctrl+n, høyreklikk på user32.GetDlgItemTextA og "Remove all breakpoints") og trykker F9(Run) igjen.
WinZip forteller meg at registreringen var mislykket, men nå prøver jeg igjen. Denne gangen skriver jeg inn "Brukernavn" og "50785491" og trykker OK. Og jaggu så får jeg opp en meldning om at registeringen var vellykket. Avslutter WinZip og OllyDbg og når jeg starter WinZip igjen så er alle nagscreens borte og jeg har en registrert WinZip![Smil](/forum/images/smilies/freak/smile.gif)
FlashFXP
Denne var litt spesiell, siden jeg er så veldig glad i å lese at jeg er på dag 1437 av min 30 dagers evalueringsperiode så ville jeg gjerne beholde meldinga, men fjerne den 30 sekunders ventetida. Igjen opp med OllyDbg og lastet inn FlashFXP.exe.
Timere hadde jeg aldri debugget etter før og lurte igrunn veldig på hvordan jeg skulle angripe denne problemstillingen. Men jeg fant fram listen over API-kall(ctrl+n) og begynte å lete etter "SetTimer", "GetTimer" og "Timer" siden det var de 3 mest logiske alternativene jeg kunne tenke meg. Og der fant jeg jaggu en User32.SetTimer og jeg satte breakpoints på alle.
Ved å starte FlashFXP(F9) så kom skjermbildet opp og OllyDbg avbrøt kjøringen på en SetTimer. Jeg begynte å trykke F8(Step Over) og tenkte først at jeg skulle finne ut hvor de 30 sekundene kom fra. Men etter å ha gjort dette mange ganger ble jeg ikke noe særlig klokere da jeg rett og slett ikke skjønte hva FlashFXP drev med. Alt jeg så var at antall sekund kom fra ESI-registeret.
Da tenkte jeg det var best å skifte taktikk og se om jeg ikke kunne finne en annen måte å omgå telleren på. Jeg kunne ikke endre PUSH ESI(som anga antall sekund til timeren) til NOP uten å ødelegge hele rutinen rundt. Tilfeldigvis la jeg merke til at EAX-registeret ble tømt litt lengre opp og dermed var 0000000.
Ved å trykke mellomrom når linja som inneholder PUSH ESI er market får jeg opp en dialogboks hvor jeg kan endre linja. Jeg endret PUSH ESI til PUSH EAX, fjernet alle breakpointene og kjørte FlashFXP(F9). Og da kom dialogboksen opp uten 30 sekunds nedtelling![Smil](/forum/images/smilies/freak/smile.gif)
Ved å høyreklikke på den samme linja og velge "Copy to Executable->Selection" og lukke vinduet som da spretter opp gjorde jeg endringen permanent og oppdaterte FlashFXP.exe.
Noen ord
Nå hjelper kanskje ikke denne artikkelen deg så veldig mye i selve debugginga, men jeg ville heller at du leser den også prøver en del på egenhånd. Du lærer ikke så mye om jeg hadde skrevet ned alle adressene og nøyaktig hva du skal gjøre. Jeg tror det er verdt å gjøre et forsøk iallefall. Det er uansett bare å stille spørsmål i tråden så skal jeg og de som kan dette så uhyre mye bedre enn meg hjelpe dere.
![Mr Cool](/forum/images/smilies/freak/cool.gif)
Det å ha lest den gamle tråden om cracking av Hex Workshop vil være en stor fordel.
WinZip 8.0
Her tenkte jeg først jeg bare skulle finne en gyldig registrasjonsnøkkel. Det burde være grei skuring tenkte jeg når jeg startet OllyDbg og lastet inn WinZip.exe.
Først måtte jeg ordne meg noen breakpoints så jeg kunne begynne å lese hvor WinZip hentet inn sine variabler for å validere det jeg skriver inn. Et breakpoint forteller debuggeren(OllyDbg) hvor den skal bryte inn i kjøringen og la meg se hva som skjer. Av erfaring så tenker jeg at WinZip bruker User32 APIen GetDlgItemTextA for å hente inn det jeg skriver i dialogboksen.
Jeg trykker CTRL+N i OllyDbg for å få opp en liste over alle "names" den finner i WinZip.exe. Ved å sortere på "Name" finner jeg fort fram til user32.GetDlgItemTextA og ved å høyreklikke på den og velge "Set breakpoint on every reference" får jeg et breakpoint på alle plasser som bruker GetDlgItemTextA.
Da er jeg klar til å kjøre WinZip og trykker F9(Run). WinZip starter, jeg finner fram registrasjonsskjermbildet på "Help" menyen og skriver inn "Brukernavn" som navn og "123456" som registrasjonsnummer. I dét jeg trykker OK bryter OllyDbg av og jeg kan se at "Brukernavn" som jeg nettopp skrev inn ligger i et register. Det forteller meg at WinZip har tenkt å sammenligne det jeg skrev inn med noe den generer.
Ved å trykke F8(Step Over) så kjører jeg programmet steg for steg. Grunnen til at jeg bruke Step Over og ikke Step Into er at jeg i første omgang ikke er så interessert i hva som skjer i subrutinene så jeg vil ikke se hva som skjer ved "Calls". Etter noen steg så ser jeg WinZip sammenligner "Brukernavn" med strengen "MuradMeraly" som den har skaffet fram fra et sted. Det vil jo selvsagt ikke gå, men nå er jeg først og fremst ute etter hva den sammenligner registrasjonsnøkkelen med.
Ved å gå videre steg for steg så ser jeg "123456" blir lastet inn i registeret og etterhvert kommer det også "50785491" inn i registeret og blir sammenlignet med min "123456". Aha , tenker jeg og fjerner alle breakpoints(ctrl+n, høyreklikk på user32.GetDlgItemTextA og "Remove all breakpoints") og trykker F9(Run) igjen.
WinZip forteller meg at registreringen var mislykket, men nå prøver jeg igjen. Denne gangen skriver jeg inn "Brukernavn" og "50785491" og trykker OK. Og jaggu så får jeg opp en meldning om at registeringen var vellykket. Avslutter WinZip og OllyDbg og når jeg starter WinZip igjen så er alle nagscreens borte og jeg har en registrert WinZip
![Smil](/forum/images/smilies/freak/smile.gif)
FlashFXP
Denne var litt spesiell, siden jeg er så veldig glad i å lese at jeg er på dag 1437 av min 30 dagers evalueringsperiode så ville jeg gjerne beholde meldinga, men fjerne den 30 sekunders ventetida. Igjen opp med OllyDbg og lastet inn FlashFXP.exe.
Timere hadde jeg aldri debugget etter før og lurte igrunn veldig på hvordan jeg skulle angripe denne problemstillingen. Men jeg fant fram listen over API-kall(ctrl+n) og begynte å lete etter "SetTimer", "GetTimer" og "Timer" siden det var de 3 mest logiske alternativene jeg kunne tenke meg. Og der fant jeg jaggu en User32.SetTimer og jeg satte breakpoints på alle.
Ved å starte FlashFXP(F9) så kom skjermbildet opp og OllyDbg avbrøt kjøringen på en SetTimer. Jeg begynte å trykke F8(Step Over) og tenkte først at jeg skulle finne ut hvor de 30 sekundene kom fra. Men etter å ha gjort dette mange ganger ble jeg ikke noe særlig klokere da jeg rett og slett ikke skjønte hva FlashFXP drev med. Alt jeg så var at antall sekund kom fra ESI-registeret.
Da tenkte jeg det var best å skifte taktikk og se om jeg ikke kunne finne en annen måte å omgå telleren på. Jeg kunne ikke endre PUSH ESI(som anga antall sekund til timeren) til NOP uten å ødelegge hele rutinen rundt. Tilfeldigvis la jeg merke til at EAX-registeret ble tømt litt lengre opp og dermed var 0000000.
Ved å trykke mellomrom når linja som inneholder PUSH ESI er market får jeg opp en dialogboks hvor jeg kan endre linja. Jeg endret PUSH ESI til PUSH EAX, fjernet alle breakpointene og kjørte FlashFXP(F9). Og da kom dialogboksen opp uten 30 sekunds nedtelling
![Smil](/forum/images/smilies/freak/smile.gif)
Ved å høyreklikke på den samme linja og velge "Copy to Executable->Selection" og lukke vinduet som da spretter opp gjorde jeg endringen permanent og oppdaterte FlashFXP.exe.
Noen ord
Nå hjelper kanskje ikke denne artikkelen deg så veldig mye i selve debugginga, men jeg ville heller at du leser den også prøver en del på egenhånd. Du lærer ikke så mye om jeg hadde skrevet ned alle adressene og nøyaktig hva du skal gjøre. Jeg tror det er verdt å gjøre et forsøk iallefall. Det er uansett bare å stille spørsmål i tråden så skal jeg og de som kan dette så uhyre mye bedre enn meg hjelpe dere.
Sist endret av TipeX; 16. april 2006 kl. 20:35.