+--------------------------------------+ | www.DuHo.org stelt voor: | | | | Beginnen met Soft-Ice | +--------------------------------------+ Wat? Soft-Ice tutorial v1.0 Door wie? Phr0zeN (aka tPo) Wanneer? 26/05/2000 doelgroep? Cracking-newbies hoe bekijken? notepad, gemaximaliseerd, auto-terugloop aan Contact-info? zie "4. Slot" ------------------------------- 0. Intro ------------------------------- Met deze gids wil ik beginnende krakers inleiden in de soft-ice wereld. Soft-Ice (=sice van nu af aan) is de bekendste, en volgens velen ook de beste debugger. Daar kan ik eigenlijk niet over oordelen want ik heb nog geen ander gebruikt, maar als cracking tool voldoet het zeker aan mijn _nobele_ ;) eisen. Sommigen vragen zich misschien af wat het verschil is tussen een debugger zoals sice en een dissasembler zoals w32dasm. Wel, met sice "opereer" je het prog als het in het geheugen geladen is en "leeft", want het voert zijn instructies uit terwijl je door de code stapt. Met de dissasembling-methode bestudeer je een "dode" lijst van instructies (daarom wordt het ook wel "deadlisting" genoemd), je kunt dus onmogelijk de inhoud van registers of een geheugenplaats zien of veranderen. Nog iets: een minimum aan voorkennis over asm is vereist, tenminste als je iets van de stroom van gegevens waarmee sice je scherm vult wil begrijpen. Heb je die kennis, dan is werken met sice eigenlijk zeer gemakkelijk, als je maar oefent, oefent en nog eens oefent! ------------------------------- 1. Installatie & Configuratie ------------------------------- Heb je sice nog niet, download het dan van protools.cjb.net (dé bron voor al je tools). Het maakt niet uit of je sice3.0 of sice4.0 hebt, er zijn geen noemenswaardige verschillen voor de kraker. Doe de setup en open na installatie het bestand "winice.dat" (in de sice directory) met kladblok. Dit bestand bevat enkele instellingen die we manueel zullen aanpassen. Hieronder staan onderdelen uit mijn winice.dat met uitleg. Pas de standaardwaarde in je eigen winice.dat aan naargelang je eigen voorkeur/instellingen. ----->De volgende instellingen gaan we aanpassen<------ // mijn uitleg staat na zo'n "//"-en PHYSMB=64 // PHYSMB= aantal megabyte ram waarmee je pc voorzien is DRAWSIZE=16384 // DRAWSIZE=Video geheugen in kilobyte (in mijn geval 16mb) INIT="lines 57;altscr off; color F A 4F 1F 4E;wc 32;wd 20;code on;faults off;X;" // Hierboven: Sice commandos die bij het opstarten automatisch toegepast worden. // Het is mogelijk om verschillende "INIT=" 's te gebruiken, // maar de laatste moet eindigen met een "X;" // De volgende commando's kunnen automatisch opgestart worden: // // + Code ON|OFF : Wordt gebruikt om de hex opcode v/d asm instructies te tonen/verbergen // + Faults ON|OFF : Zorgt ervoor dat sice wel/niet tevoorschijn komt bij een gpf // (blauw -en/of dialoogscherm). Als newbie zet je dit best op OFF // + Lines # : Waarbij "#" de grote van het sice-venster voorstelt in lijnen (tussen 25 en 90) // + WC # : toon/verberg het venster met de asmCode, "#" is de grote in lijnen // + WD # : toon/verberg het Datavenster, "#" is de grootte in lijnen // + WR # : toon/verberg het venster met de Registers, "#" is de grootte in lijnen // + WW # : toon/verberg het Watch-venster, "#" is de grootte in lijnen // + ALTKEY KeyCombo : De sice sneltoets veranderen (standaard ) // + ^ : Dit teken ("^") voert een commando uit zonder het op de commandline te tonen // + ; : Dit teken (";") simuleert dat de gebruiker op duwt (na een commando). // + X : brengt sice weer naar de achtergrond ; ***** Examples of export symbols that can be included for Windows 95 ***** ; Change the path to the appropriate drive and directory // hierna staat een lijst met regels die eruit zien als: ;EXP=c:\windows\system\kernel32.dll //Verwijder de ";" voor elke lijn. daardoor wordt de lijn daadwerkelijk uitgegevoerd. //(anders wordt de lijn enkel als kommentaar aanzien) //bv. EXP=path\something.dll zorgt ervoor dat alle functies in something.dll door sice //herkend worden. Je kunt dan sice de opdracht geven om "in te breken" in het programma als //een functie uit de dll aanroept. (zie verder: breakpoints) ------------------------------- 2. Werken met sice ------------------------------- A. layout van het sice-venster - - - - - - - - - - - - - - - - Als je (of de sneltoets die je ingesteld hebt) indrukt kom je terecht in het sice venster. Dit venster is onderverdeeld in verschillende stukken: + Code window - kun je af/aanzetten met het commando WC + Data window - kun je af/aanzetten met het commando WD + Register Window - kun je af/aanzetten met het commando WR Dit zijn de belangrijkste, andere zul je niet onmiddelijk nodig hebben. Zet ze alle 3 aan. + Het codewindow bevat de asm instructies die op het moment uitgevoerd worden. De eerstvolgende uit te voeren instructie staat in kleur. Je kunt de grote aanpassen en door de code scrollen met je cursor. + Het dataventer wordt gebruikt om data te bekijken in hex en ascii vorm. + Het registervenster bevat de verschillende registers met hun huidige (hex)waarden. Het flags-register staat als volgt uitgeschreven (rechtsboven in sice: o d i s z a p c | | | | | | | | | | | | | | | +------ Carry Flag (zelfde als overflow flag, maar met unsigned gehele getallen ) | | | | | | +-------- Parity Flag | | | | | +---------- Auxiliary Carry Flag | | | | +------------ Zero Flag ( wordt gezet als de uitkomst v/e bewerking nul is ) | | | +-------------- Sign Flag ( wordt gezet als de uitkomst v/e bewerking signed is ) | | +---------------- Interrupt Flag | +------------------ Direction Flag ( heeft iets met hardware te maken) +-------------------- Overflow Flag (bij wiskundige operaties zoals bv. add en sub) De belangrijkste bij cracking is de Zero flag, die gezet wordt door cmp's en test's enz. Is een flag gezet (of true, 1, on,...) dan wordt de kleine letter een (gekleurde) hoofdletter. vb: ... mov eax, FFFFFFFF add eax, 1 //FFFFFFFF+1 = 0, gevolg: de zero flag wordt gezet (z verandert in Z) //bovendien wordt de overflow ook gezet. jz C02D673 //jumpt als de zero flag gezet is ... + De prompt: het onderste deel van het sice scherm, waar je je commando's typt + Nog iets belangrijks: om het sice scherm over je desktop te bewegen: druk in B. Belangrijkste commando's - - - - - - - - - - - - - - - * SNELTOETSEN: F1 - Help F2 - toon/verberg het registervenster (net als wr) F5 - Ga terug naar windows (je kunt ook of F8 - voert de volgende instructie uit (gaat in alle calls) F10 - voert de volgende instructie uit (voert de calls uit zonder erin te gaan) F11 - Ga naar de caller F12 - Automatisch door code stappen tot net over een RET instructie (om uit een call te geraken) * BREAKPOINTS: Breakpoints zijn heel belangrijk bij het kraken met sice: de breakpoints zorgen ervoor dat sice binnenbreekt in de code v/h prog op een punt dat jij wilt. Daardoor kun je bv. de code van een programma doorlopen op het moment dat het prog een serial# inleest en vergelijkt met de correcte serial. De werkwijze is dus: -) In sice een breakpoint zetten op een bepaalde functie die het prog gebruikt -) terugkeren naar windows -) zorgen dat het prog de functie gebruikt zodat sice kan inbreken op het moment dat hij gebruikt wordt ->Breakpoint on execution<- De meeste gebruikte breakpoint is de BreakPoint on eXecution (bpx). Hiermee kun je sice laten inbreken op het moment dat een programma een bepaalde functie uitvoert of code op een bepaald adres doorloopt. De syntax van een breakpoint ziet er zo uit: BPX of BPX De werkwijze is: -) zet in sice een breakpoint op een bepaalde functie die het prog gebruikt -) keer terug naar windows -) zorg dat het prog de functie gebruikt zodat sice kan inbreken op het moment dat hij gebruikt wordt vb. van functies om tekst (en serial#s) in te lezen zijn: getwindowtexta en getdlgitemtexta je kunt dit meteen uittesten door in windows Start - uitvoeren te klikken, dan een beetje zever typen in de textbox, dan om naar sice te gaan, , terug naar windows, op ok klikken en *boem*, sice brengt je naar de code die de tekst inleest. Druk F5 om terug naar windows te gaan. Voor meer nuttige breakpoints, zie hieronder "C. nuttige breakpoints" ->geheugen doorzoeken<- Dit is geen breakpoint, maar het komt wel handig van pas als je een BPM (zie volgende) zetten. de syntax is: s l '' Om een ingegeven fake-serial te zoeken gebruik ik meestal: s 0 l ffffffff '123456789' Hierdoor wordt heel het geheugen doorzocht naar de serial '123456789' De plaats in het geheugen van de gevonden serial wordt dan op de prompt afgedrukt en het datavenster toont de gegevens op dat adres. Om verder te zoeken typ je gewoon: s. Gevonden strings op adressen 80000000+ en C0000000+ zijn meestal nutteloze kopiëen, die windows rondstrooit bij het uitvoeren v. api-stringfuncties en dergelijke. Ook zul je soms de string vinden zoals je hem aan de commanline getypt hebt (s 0 l ffff...), dat is de buffer van sice, dus ook nutteloos. ->BreakPoint on Memory acces<- Deze breakpoint 'breekt' als een prog leest of schrijft naar een bepaalde plaats in het geheugen. de syntax is: bpm r/w Addres is de plaats in het geheugen waarop sice breekt als er van gelezen/geschreven wordt. als je bpr rw typt treed sice op de voorgrond bij read en write acties, gebruik je gewoon "r" dan breekt sice bij een read actie, met "w" bij een write actie. Als adres zul je meestal het adres van je serial gebruiken (dat je met de vorige functie gevonden hebt). Zo kun je zien wat het programma met je ingevoerde serial of username doet. ->BreakPoint on memory Range<- Eigenlijk hetzelfde als bpm, maar hierbij kun je op een reeks adressen breakpointen, dus op verschillende bytes. Ik gebruik altijd bpr, want die is beter dan bpm omdat je zo je hele serial#/naam in de gaten kunt houden. De syntax is als volgt: bpr R/W je kunt ook: bpr +lengte_serial_in_hex R/W Stel dat ik in een prog mijn username "Phr0zeN [DuHo]" gevonden heb op het adres 0157:00643345. Om het geheugen ingenomen door mijn naam te breakpointen zou ik de volgende syntax gebruiken: BPR 0157:00643345 0157:00643345+E Omdat ik geen r/w achter de bpr getypt heb, wordt de standaardwaarde (RW) gebruikt. ->breakpoints weergeven<- Syntax: bl Geeft een lijstje met de ingestelde breakpoints en hun labels in de vorm van: <#label>) BPX C=<#COUNT> bv: 00) BPX #0028:09876543 C=01 Het label v/d breakpoint is hier nul. Dit wil zeggen dat soft-ice één keer zal breken als het prog de instructie op adres #0028:09876543 uitvoert. ->breakpoints wissen<- Als je een bepaalde breakpoint gezet hebt wil je die natuurlijk weer wissen, anders kom je uren later perongeluk misschien weer in sice terecht. Dit doe je dus zo: bc vb: bc 0 //wist de breakpoint met label 0 bc 1,4 //wist de breakpointen met label 1 en 4 bc * //wist alle breakpoints ->breakpoints *tijdelijk* uitschakelen<- Het is vaak handig om een breakpoint uit te schakelen als je hem tijdelijk niet nodig hebt, dit doe je als volgt: bd bd 1,2,3,5 // schakelt breakpoints met label 1,2,3,5 uit bd 1 // schakelt breakpoint 1 bd * // Disables alle breakpoints ->breakpoints *terug* inschakelen<- Als je een uitgeschakelde breakpoint terug wilt inschakelen doe je dit met: be be 1,4,7 schakel breakpoints met labels 1,4 en 7 weer in be * schakel alle uitgeschakelde breakpoints weer in * GEHEUGEN -EN REGISTERFUNCTIES -> Om de gegevens op een bepaald adres in het datavenster te kunnen bekijken gebruike je: d bv. d 300F5D89 d 0177:300F5D89 -> Om gegevens die zich op een adres in een register bevinden te bekijken gebruik je: d bv. d eax -> Om de inhoud v/e register te veranderen gebruik je: r = bv. r eax = 2A0 -> Om de flags te veranderen (on/off) gebruik je: r fl bv. r fl z //om de zero flag aan/af te zetten -> Om bytes op een bepaald geheugen addres te wijzigen gebruik je: e bv. e 400000 of e bv. e eax // je kunt nu de data op het adres in eax wijzigen Daarna kun je in het datavenster het geheugen op het desbetreffende addres aanpassen. C. Nuttige functies om op te bpx'en: - - - - - - - - - - - - - - - - - - - Alle apifuncties zijn met uitleg (over wat ze doen + hun parameters) gebundeld in een api-referentie. die kun je downloaden van bv. snakepage.cjb.net bij de "OUR BEST TOOLS" sectie. Vergeet niet, bij 32-bit functies (vanaf windoze '95) moet er een 'a' op het einde komen!! bij winNT/2000 is dat een 'W' dat heeft te maken met dat windows 95/98 Ansi strings gebruikt en NT Widechar. 1/ Serialnummers ----------------- bpx getdlgitemint (getallen) //leest een getal in een textbox in bpx getdlgitemtext //leest tekst in een textbox in bpx getwindowtext //leest tekst in een textbox in bpx hmemcpy //kopieert data van de ene locatie naar de andere // (deze lukt praktisch altijd om op te breakpointen) 2/ nag screens --------------- bpx messagebox bpx createwindow bpx createwindowex bpx dialogboxparam bpx showwindow bpx updatewindow 3/ Time-limit demo's ------------------ bpx getlocaltime bpx getfiletime bpx getsystemtime 4/ CD-ROM (vooral games) --------------------- bpx GetFileAttributesA bpx GetFileSize bpx GetDriveType bpx GetLastError bpx ReadFile ------------------------------- 4. Slot ------------------------------- -Eindwoord: Ik hoop dat je iets bijgeleerd hebt, ik weet dat deze tutor allesbehalve volledig is, maar ik wou het niet té geavanceerd maken, dit is tenslotte nog altijd bedoelt voor newbies. Als ik wat vrije tijd heb zal ik m'n tekstje proberen te vervolledigen. Heb je vragen, opmerkingen, of is er iets fout of onduidelijk, mail me dan op Phr0zen_one@yahoo.com Met vragen over DuHo kun je terecht op: duho@angelfire.com . -Groeten en bedankjes gaan naar: *De leden van DuHo, *RefleXion, *Mikl0, *ViBr80R, *CoRN2 (om zijn excellente tutor waar deze op gebaseerd is)