Hei alle freaks, denne guiden er dedikert til alle dere som er interessert i cracking, men som ikke kan det.
Først og fremst bør du ha kunnskap til x86 assembly, men det er ikke helt nødvendig, da jeg skal prøve så godt jeg kan å forklare det som trengs å vite. Det er til stor hjelp om du vet hvordan prosessorer fungerer. (Det vil si, et stort pluss om du har kunnskap til registre, opcodes, og så videre.)
Programmeringskunnskaper er heller ikke å forakte, da det er også et stort pluss.
Først og fremst skal jeg si litt om hva cracking er og hvordan det blir utført: (Software) cracking er kunsten i å forbigå valideringssystemer lagt inn i for eksempel spill, programmer, og så videre. Det brukes også til å modifisere programmer for egen vinnings skyld. Til dere pirater som har lastet ned keygens for eksempel: En cracker (gjerne en gruppe) har «reversert koden» (kalt reverse (code) engineering) fra maskinkode til assembly. Deretter har crackerne funnet algoritmen til valideringsprosessen for deretter å skrive en nøkkengenerator selv.
Det er ikke keygenning vi skal ta for oss i denne guiden, men noe kalt patching. Grunnen til dette er at patching er uten tvil det letteste for nybegynnere, og keygenning er forbeholdt de med mer kunnskap om cracking.
Nå lurer du kanskje, er dette i det hele tatt lov? Både ja og nei. Det vi skal gjøre i denne guiden, er 100 % lovlig, grunnet at programmet vi skal cracke er laget av meg, akkurat for denne guiden. Dog, cracker du for eksempel et spill eller et program som ikke er laget for å bli cracket, da er det ulovlig. Husk dette!
Programmet vi skal cracke heter rett og slett Patchme. Du kan laste det ned her:
http://www14.zippyshare.com/v/57438833/file.html
MD5: 8f3b9668dc8d80651a6a3a49ca2d6ee7
Virustotal: http://www.virustotal.com/analisis/2...ceb-1276176039
Grunnen til at jeg har kalt programmet Patchme, er for at vi skal patche programmet. Vanligvis blir slike programmer som dette kalt en Crackme. Som du kanskje har forstått, er crackmes programmet laget for å bli cracket av hobby-crackere.
Last ned programmet og ta en titt på det. Når du trykker på «Validér!» vil du få opp en meldingsboks med innholdet «Beklager, du kan ikke validere.». Ja vel, her har vi jobb foran oss.
Hvordan skal vi så cracke programmet? Med Notepad? Nei, her skal vi bruke en debugger kalt OllyDbg. Les mer på hva programmet er brukt til på linken. (Jeg bruker versjon 1.10.)
Last ned OllyDbg og åpne vår Patchme i Olly:
http://i48.tinypic.com/2n81kd0.jpg
Fortvil ikke! For dere som ikke har brukt en debugger før, vil dette se ut som grøt. Jeg har lagt inn noen piler som beskriver hva hvert vindu tar seg for. Assembly-kode-vinduet er det vi skal jobbe med for det meste. Her har maskinkoden blitt omgjort til assembly-kode, som er lesbart for mennesker. Til venstre ser du opcodes, som er skrevet i det heksadesimale tallsystemet. Opcodes er instruksjonene som for eksempel «mov, jmp, call» og så videre, men i heksadesimal form. Dere som har kunnskap i assembly bør forstå dette lett. Dere med programmeringsbakgrunn bør også klare å forstå dette relativt lett. Dette er grunnen til at det er lurt å ha assembly-kunnskap når man holder på med cracking! Hele prosessen av cracking foregår i assembly.
Til høyre for Assembly-koden har vi registervinduet. Vi bruker så å si kun disse registrene (som er nedskrevet som EAX, EBX, ECX, EDX og så videre). Det finnes mange fler, men de er ikke nødvendige for oss å kunne i startfasen. Et register er en «holdeplass» for programmet der det blir lagt inn informasjon som blir brukt av programmet. Registrene blir vanligvis brukt når informasjonen som blir lagret kun trengs for en kort tid, mens stacken blir gjerne brukt for å lagre informasjon i lengre tid. Dette kommer helt an på programmet, så det er ingen «regler» på bruken av registre og stacken.
Som du ser, har stacken en adresse (i dette tilfellet finner du 0012FF8C markert øverst i stacken). Denne adressen inneholder informasjon som blir brukt av programmet senere. Siden dette er en nybegynnerguide så forstår jeg at dette kan virke surrete, men øvelse gjør mester! Det blir garantert mye lettere etterhvert. Igjen, det hjelper stort om du har assembly- og programmeringskunnskaper.
En siste ting: til venstre for opcodes finner du igjen adresser, men jeg regner med at du forstår at dette er informasjon i minnet gitt ved adresser (som du vet, minnet består av mange adresser).
Greit! La oss starte.
Som vi allerede vet, fikk vi en feilmelding når vi trykket på «Validér!». Med OllyDbg kan vi søke gjennom tekster som programmet bruker. La oss derfor søke gjennom tekstene for å finne feilmeldingen, deretter for å se hva som foregikk, og hvorfor det ikke fungerte å validere programmet. OK?
http://i47.tinypic.com/14ty2y0.jpg
Dere med programmeringsbakgrunn bør godt vite hva text strings er.
http://i45.tinypic.com/670b44.jpg
Her hadde vi flaks! Når vi åpnet text strings-vinduet fikk vi med en gang øye på feilmeldingen vår. Dobbelklikk på «Beklager, […]».
http://i45.tinypic.com/oz6tz.jpg
Nå landet vi på instruksjonen «MOV EAX, 0046C798». Her blir altså meldingsboksen med feilmeldingen laget. Litt over ser du «PUSH 0». Dette er starten på prosedyren som viser feilmeldingen. Hvordan vet jeg dette? Som du ser, har jeg lagt en pil som henviser til en «>». Dette symbolet indikerer en start på en prosedyre. OK, da vet vi at vi må gjøre om programmet til å henvise oss til prosedyren som viser meldingen rett over («Gratulerer, du har […]»). Som du forstår er dette meldingen som forteller oss at vi har validert programmet. Men hvordan skal vi cracke dette, altså lure programmet til å tro vi er validert?
For å gjøre dette må vi gå oppover i koden. Scroll oppover:
http://i47.tinypic.com/2wq4aa8.jpg
Interessant! Her ser vi en «JNZ»-instruksjon. For dere som kan assembly bør dette være enkelt å forstå. For dere som ikke vet hva en JNZ-instruksjon gjør:
JNZ-instruksjonen sjekker flag-registrene (som befinner seg i Register-vinduet, med navnene C, P, A, Z osv.) for informasjon om hvorvidt den skal hoppe over en viss kode (som er i dette tilfellet beskrevet som en pil fra JNZ-instruksjonen til «PUSH 0» lengre ned (som er startprosedyren til feilmeldingen)).
Informasjon om hvorvidt JNZ-instruksjonen skal hoppe eller ikke, blir, som jeg beskrev, bestemt av flag-registrene. Men hvem legger inn true/false-informasjon til flag-registrene? I dette tilfellet: «TEST DL,DL», rett over JNZ. (Forresten, JNZ står for Jump Not Zero, altså den vil hoppe om Z(ERO)-flagget ikke er satt. Det vil si at hvis Z-flagget IKKE er satt, vil JNZ hoppe.)
Hva er så DL? Det er et «underregister» av EDX. Hvorfor ikke bare bruke EDX isteden for dens underregister, DL, lurer du på kanskje? Godt spørsmål. Vanlige informasjonsregistre som EAX, EBX, ECX osv. er 32-bit stort. Hvert av disse registrene har, som beskrevet, underregistre som er på et visst antall bit. Les mer her: http://no.wikipedia.org/wiki/IA-32
DL er derfor under DX (som er 16-bit stort) som igjen er under EDX. Til små instruksjoner (som i dette tilfellet av TEST-instruksjonen) trenger man bare DL for oppgaven. Det hadde vært fullt mulig å bruke EDX også (eller andre registre for den saks skyld), men det er rett og slett ikke nødvendig!
OK! Da regner jeg med at det er påpasselig forståelig. Da har du kanskje resonnert ut i fra det jeg nettopp beskrev at TEST-instruksjonen satt et av flag-registrene til 0? Siden JNZ betyr Jump Not Zero, samt at JNZ-instruksjonen blir utført (da den hopper over gladmeldingen), betyr dette at et av flag-registrene ble satt til 0. I dette tilfellet er det Z-registret (Z = ZERO) som blir anvendt:
http://i50.tinypic.com/315yhcz.jpg
Hva om vi gjør om Z-registret til å vise 1 istedenfor 0? Da vil jo ikke JNZ-instruksjonen bli utført? Riktig! Så enkelt er det. OK, for å gjøre dette vil jeg at du skal sette en breakpoint på JNZ-instruksjonen. Gjør dette ved å markere JNZ-instruksjonen og trykk F2. Adresselinja vil skifte farge, som indikerer en breakpoint.
http://i48.tinypic.com/nnsjna.jpg
Nå lurer du kanskje på hva en breakpoint er? En breakpoint setter rett og slett en stopp i programmet når den spesifikke instruksjonen som har en breakpoint skal utføres. Det vil si at programmet vårt vil stoppes når den skal til å utføre JNZ-instruksjonen. Når dette skjer, kan vi bare modifisere Z-registret! Dermed vil gladmeldingen bli utført isteden.
Greit, kjør programmet når du har satt breakpointen. Deretter trykker du på «Validér!»-knappen og du vil stoppes:
http://i48.tinypic.com/2mcyl52.jpg
Først og fremst bør du ha kunnskap til x86 assembly, men det er ikke helt nødvendig, da jeg skal prøve så godt jeg kan å forklare det som trengs å vite. Det er til stor hjelp om du vet hvordan prosessorer fungerer. (Det vil si, et stort pluss om du har kunnskap til registre, opcodes, og så videre.)
Programmeringskunnskaper er heller ikke å forakte, da det er også et stort pluss.
Først og fremst skal jeg si litt om hva cracking er og hvordan det blir utført: (Software) cracking er kunsten i å forbigå valideringssystemer lagt inn i for eksempel spill, programmer, og så videre. Det brukes også til å modifisere programmer for egen vinnings skyld. Til dere pirater som har lastet ned keygens for eksempel: En cracker (gjerne en gruppe) har «reversert koden» (kalt reverse (code) engineering) fra maskinkode til assembly. Deretter har crackerne funnet algoritmen til valideringsprosessen for deretter å skrive en nøkkengenerator selv.
Det er ikke keygenning vi skal ta for oss i denne guiden, men noe kalt patching. Grunnen til dette er at patching er uten tvil det letteste for nybegynnere, og keygenning er forbeholdt de med mer kunnskap om cracking.
Nå lurer du kanskje, er dette i det hele tatt lov? Både ja og nei. Det vi skal gjøre i denne guiden, er 100 % lovlig, grunnet at programmet vi skal cracke er laget av meg, akkurat for denne guiden. Dog, cracker du for eksempel et spill eller et program som ikke er laget for å bli cracket, da er det ulovlig. Husk dette!
Programmet vi skal cracke heter rett og slett Patchme. Du kan laste det ned her:
http://www14.zippyshare.com/v/57438833/file.html
MD5: 8f3b9668dc8d80651a6a3a49ca2d6ee7
Virustotal: http://www.virustotal.com/analisis/2...ceb-1276176039
Grunnen til at jeg har kalt programmet Patchme, er for at vi skal patche programmet. Vanligvis blir slike programmer som dette kalt en Crackme. Som du kanskje har forstått, er crackmes programmet laget for å bli cracket av hobby-crackere.
Last ned programmet og ta en titt på det. Når du trykker på «Validér!» vil du få opp en meldingsboks med innholdet «Beklager, du kan ikke validere.». Ja vel, her har vi jobb foran oss.
Hvordan skal vi så cracke programmet? Med Notepad? Nei, her skal vi bruke en debugger kalt OllyDbg. Les mer på hva programmet er brukt til på linken. (Jeg bruker versjon 1.10.)
Last ned OllyDbg og åpne vår Patchme i Olly:
http://i48.tinypic.com/2n81kd0.jpg
Fortvil ikke! For dere som ikke har brukt en debugger før, vil dette se ut som grøt. Jeg har lagt inn noen piler som beskriver hva hvert vindu tar seg for. Assembly-kode-vinduet er det vi skal jobbe med for det meste. Her har maskinkoden blitt omgjort til assembly-kode, som er lesbart for mennesker. Til venstre ser du opcodes, som er skrevet i det heksadesimale tallsystemet. Opcodes er instruksjonene som for eksempel «mov, jmp, call» og så videre, men i heksadesimal form. Dere som har kunnskap i assembly bør forstå dette lett. Dere med programmeringsbakgrunn bør også klare å forstå dette relativt lett. Dette er grunnen til at det er lurt å ha assembly-kunnskap når man holder på med cracking! Hele prosessen av cracking foregår i assembly.
Til høyre for Assembly-koden har vi registervinduet. Vi bruker så å si kun disse registrene (som er nedskrevet som EAX, EBX, ECX, EDX og så videre). Det finnes mange fler, men de er ikke nødvendige for oss å kunne i startfasen. Et register er en «holdeplass» for programmet der det blir lagt inn informasjon som blir brukt av programmet. Registrene blir vanligvis brukt når informasjonen som blir lagret kun trengs for en kort tid, mens stacken blir gjerne brukt for å lagre informasjon i lengre tid. Dette kommer helt an på programmet, så det er ingen «regler» på bruken av registre og stacken.
Som du ser, har stacken en adresse (i dette tilfellet finner du 0012FF8C markert øverst i stacken). Denne adressen inneholder informasjon som blir brukt av programmet senere. Siden dette er en nybegynnerguide så forstår jeg at dette kan virke surrete, men øvelse gjør mester! Det blir garantert mye lettere etterhvert. Igjen, det hjelper stort om du har assembly- og programmeringskunnskaper.
En siste ting: til venstre for opcodes finner du igjen adresser, men jeg regner med at du forstår at dette er informasjon i minnet gitt ved adresser (som du vet, minnet består av mange adresser).
Greit! La oss starte.
Som vi allerede vet, fikk vi en feilmelding når vi trykket på «Validér!». Med OllyDbg kan vi søke gjennom tekster som programmet bruker. La oss derfor søke gjennom tekstene for å finne feilmeldingen, deretter for å se hva som foregikk, og hvorfor det ikke fungerte å validere programmet. OK?
http://i47.tinypic.com/14ty2y0.jpg
Dere med programmeringsbakgrunn bør godt vite hva text strings er.
http://i45.tinypic.com/670b44.jpg
Her hadde vi flaks! Når vi åpnet text strings-vinduet fikk vi med en gang øye på feilmeldingen vår. Dobbelklikk på «Beklager, […]».
http://i45.tinypic.com/oz6tz.jpg
Nå landet vi på instruksjonen «MOV EAX, 0046C798». Her blir altså meldingsboksen med feilmeldingen laget. Litt over ser du «PUSH 0». Dette er starten på prosedyren som viser feilmeldingen. Hvordan vet jeg dette? Som du ser, har jeg lagt en pil som henviser til en «>». Dette symbolet indikerer en start på en prosedyre. OK, da vet vi at vi må gjøre om programmet til å henvise oss til prosedyren som viser meldingen rett over («Gratulerer, du har […]»). Som du forstår er dette meldingen som forteller oss at vi har validert programmet. Men hvordan skal vi cracke dette, altså lure programmet til å tro vi er validert?
For å gjøre dette må vi gå oppover i koden. Scroll oppover:
http://i47.tinypic.com/2wq4aa8.jpg
Interessant! Her ser vi en «JNZ»-instruksjon. For dere som kan assembly bør dette være enkelt å forstå. For dere som ikke vet hva en JNZ-instruksjon gjør:
JNZ-instruksjonen sjekker flag-registrene (som befinner seg i Register-vinduet, med navnene C, P, A, Z osv.) for informasjon om hvorvidt den skal hoppe over en viss kode (som er i dette tilfellet beskrevet som en pil fra JNZ-instruksjonen til «PUSH 0» lengre ned (som er startprosedyren til feilmeldingen)).
Informasjon om hvorvidt JNZ-instruksjonen skal hoppe eller ikke, blir, som jeg beskrev, bestemt av flag-registrene. Men hvem legger inn true/false-informasjon til flag-registrene? I dette tilfellet: «TEST DL,DL», rett over JNZ. (Forresten, JNZ står for Jump Not Zero, altså den vil hoppe om Z(ERO)-flagget ikke er satt. Det vil si at hvis Z-flagget IKKE er satt, vil JNZ hoppe.)
Hva er så DL? Det er et «underregister» av EDX. Hvorfor ikke bare bruke EDX isteden for dens underregister, DL, lurer du på kanskje? Godt spørsmål. Vanlige informasjonsregistre som EAX, EBX, ECX osv. er 32-bit stort. Hvert av disse registrene har, som beskrevet, underregistre som er på et visst antall bit. Les mer her: http://no.wikipedia.org/wiki/IA-32
DL er derfor under DX (som er 16-bit stort) som igjen er under EDX. Til små instruksjoner (som i dette tilfellet av TEST-instruksjonen) trenger man bare DL for oppgaven. Det hadde vært fullt mulig å bruke EDX også (eller andre registre for den saks skyld), men det er rett og slett ikke nødvendig!
OK! Da regner jeg med at det er påpasselig forståelig. Da har du kanskje resonnert ut i fra det jeg nettopp beskrev at TEST-instruksjonen satt et av flag-registrene til 0? Siden JNZ betyr Jump Not Zero, samt at JNZ-instruksjonen blir utført (da den hopper over gladmeldingen), betyr dette at et av flag-registrene ble satt til 0. I dette tilfellet er det Z-registret (Z = ZERO) som blir anvendt:
http://i50.tinypic.com/315yhcz.jpg
Hva om vi gjør om Z-registret til å vise 1 istedenfor 0? Da vil jo ikke JNZ-instruksjonen bli utført? Riktig! Så enkelt er det. OK, for å gjøre dette vil jeg at du skal sette en breakpoint på JNZ-instruksjonen. Gjør dette ved å markere JNZ-instruksjonen og trykk F2. Adresselinja vil skifte farge, som indikerer en breakpoint.
http://i48.tinypic.com/nnsjna.jpg
Nå lurer du kanskje på hva en breakpoint er? En breakpoint setter rett og slett en stopp i programmet når den spesifikke instruksjonen som har en breakpoint skal utføres. Det vil si at programmet vårt vil stoppes når den skal til å utføre JNZ-instruksjonen. Når dette skjer, kan vi bare modifisere Z-registret! Dermed vil gladmeldingen bli utført isteden.
Greit, kjør programmet når du har satt breakpointen. Deretter trykker du på «Validér!»-knappen og du vil stoppes:
http://i48.tinypic.com/2mcyl52.jpg
Sist endret av Glowiej; 10. juni 2010 kl. 17:22.