DOOM - Tutorial: Grundwissen ber SoftIce


Programm: 	SoftIce v3.24
Beschreibung: 	Debugger
Firma: 		(c)199x Nu-Mega Technologies

Tool: - SoftIce
          
1. Was ist SoftIce und warum brauchen wir es ???

   "SoftIce" ist ein Software-Debugger fr DOS und Windows-Programme.

2. Was kann SoftIce und was ist neu ???

   "SoftIce" untersttzt in der Version v3.24 	: Windows 98
                                                 AMD 3D Now Funktionen
						 universeller Video-Treiber                                                 						 

3. SoftIce konfigurieren (Winice.dat)

PENTIUM=ON   		; wenn Du einen Pentium PC hast, dann lasse diese Option auf 'ON' ansonsten =OFF 
NMI=ON			; trap Non-Maskable Interrupt--ntzlich mit einem Hardware Breakout Schalter 
ECHOKEYS=OFF 
NOLEDS=OFF		; deaktiviere/aktiviere Capslock und Numlock Programmierung 
NOPAGE=OFF		; deaktiviere/aktiviere Mapping von nichtvorhandenen Memoryseiten 
SIWVIDRANGE=ON  
THREADP=ON		; aktiviere/deaktiviere thread-spezifische Stufenabarbeitung 
LOWERCASE=OFF		; aktiviere/deaktiviere Kleinschreibung 
WDMEXPORTS=OFF 
MONITOR=0 

; ************************************************************************* 
; Wenn Du mehr als 32MB Speicher installiert hast, ndere die Zeile PHYSMB 
; auf den richtigen Wert Deiner # Megabytes. 
; Wenn Du weniger als 32MB hast, kannst Du ein bichen Speicher sichern 
; indem Du die korrekten Wert Deiner # Megabytes angibts 
; Example: PHYSMB=32 
; ************************************************************************* 

PHYSMB=32   			; ndere diesen Wert auf den korrekten MB-Wert RAM in Deinem PC 
SYM=1024       			; Reserviert 1MB des Speichers um Symbole vom Source Code abzulegen 
HST=256          		; Reserviert 256K des Speichers fr den History Buffer 
TRA=8				; Gre des Trace Buffers 
MACROS=32 
DRAWSIZE=2048			; Gre des Videospeichers in K 

; ************************************************************************* 
; Die nchste Zeilen konfiguriert Softice nach jedem Neustart Deines PC's. 
; Die folgenden Einstellungen empfehlen wir fr Neulinge. Du solltest also 
; Deine Standardeinstellungen mit diesen Werten ersetzen. 
; *************************************************************************
 
X;         			; Verlasse Softice und das Semicolon hat die gleiche Funktion, wie die Enter  
             		  	  Taste
wl;        			; Schaltet das Variablen Window in SoftIce ein und aus  
             		  	  
code on;   			; In der Grundeinstellung ist diese Funktion aus, wir wollen sie aber einschalten. 
             		  	  Es werden die Hexadezimalen Zahlen (Adressen) neben unserem disassemblierten
				  Code angezeigt. 
altscr off; 			; Wir wollen nicht, da SoftIce verschiedene Screens nutzt, um irgendwelche Ausgaben 
             		  	  auf diesen zu machen. 
Lines 57;  			; Setzt die gesamte Window Gre von Softice so, da SoftIce auf dem gesamten Screen   
             		  	  zu sehen ist. Die Grundeinstellung ist zu klein. 
wc;        			; Softice Code Window, diese Funktion legt die Gre dieses internen Window fest. 
wd;        			; Softice Hexadezimal Window Gre 
wr;        			; Zeigt Dir alle Register am oberen Bildschirmrand. Sehr ntzlich fr's Cracken ;) 
faults off; 			; Damit SoftIce nicht bei jedem Windowsfehler anspringt, schalten wir diese Funktion
				  aus.

Ein Beispiel fr eine INIT-Zeile:

INIT="X;" 
INIT="wl;code on; altscr off; lines 57; wc 32; wd 8; wr; faults off;" 

F1="h;"       			
F2="^wr;"			; Aktiviere/Deaktiviere Register Window 
F3="^src;" 
F4="^rs;" 
F5="^x;"			; Verlasse Softice und gehe zu Windows zurck 
F6="^ec;" 
F7="^here;" 
F8="^t;"			; Trace zum nchsten Befehl (bei dieser Variante werden alle CALLS aufgerufen) 
F9="^bpx;" 
F10="^p;"   			; Gehe zum nchsten Befehl (fhrt alle Befehle auer die CALLS aus)
F11="^G @SS:ESP;"  		; erlaubt es uns eine Call-Routine zu verlassen 
F12="^p ret;"			; Gehe bis zum nchsten RETurn Befehl 
SF3="^format;" 
CF8="^XT;" 
CF9="TRACE OFF;" 
CF10="^XP;" 
CF11="SHOW B;" 
CF12="TRACE B;" 
AF1="^wr;" 
AF2="^wd;" 
AF3="^wc;" 
AF4="^ww;" 
AF5="CLS;" 
AF8="^XT R;" 
AF11="^dd dataaddr->0;" 
AF12="^dd dataaddr->4;" 
CF1="code on; altscr off; lines 57; wc 32; wd 8; wr; wl; ww 2; faults off" 
CF2="^wr;^wd;^wc;" 

; ndere den Pfad auf das entsprechende Laufwerk und Verzeichnis 
  
EXP=c:\windows\system\kernel32.dll      ; Diese Zeilen lassen Softice automatisch die 
EXP=c:\windows\system\user32.dll        ; hier eingetragenen System DLL's laden. Diese
EXP=c:\windows\system\gdi32.dll         ; Eintragungen sind sehr wichtig, damit SoftIce 
EXP=c:\windows\system\comdlg32.dll      ; auch wirklich ein Programm unterbricht, wenn 
EXP=c:\windows\system\shell32.dll       ; Du ein Breakpoint auf eine API-Funktion setzt. 
EXP=c:\windows\system\shell232.dll      ; Es gibt auerdem kaum Programme, die nicht eine
EXP=c:\windows\system\advapi32.dll	  ; dieser DLL's nutzt.
EXP=c:\windows\system\comctl32.dll

Alle nderungen die Du in der WinIce.dat machst, erfordern einen Neustart des PC's damit die Einstellungen aktiv werden. 

   

4. Die wichtigsten Breakpoints 

 Merke: CreateFile = 16 Bit -> CreateFileA = 32 Bit

   Der wichtigste Breakpoint	 	 : bpx hmemcpy -> er funktioniert zu 99.9 % bei allen prog's

   Read/Write Files (Keyfiles ...) 	 : bpx ReadFile
                                   	   bpx WriteFile
                                     	   bpx CreateFileA
					   bpx GetFileAttributesA 
					   bpx GetFileSize 
					   bpx GetDriveType 
					   bpx GetLastError

   Read/Write interne Daten		 : bpx GetPrivateProfileStringA
                                    	   bpx GetPrivateProfileIntA
                                    	   bpx WritePrivateStringA
                                    	   bpx WritePrivateProfileIntA

   Registry Access (Key in Registry)	 : bpx RegCreateKeyA
                                    	   bpx RegDeleteKeyA
					   bpx RegSetValueA
                                    	   bpx RegQueryValueA
                                    	   bpx RegOpenKeyA
                                    	   bpx RegCloseKeyA

   Message Boxes (Serial Num falsch)	 : bpx MessageBox
                                    	   bpx MessageBoxA
                                    	   bpx MessageBoxExA
                                    	   bpx MessageBeep
					   bpx DialogBoxParamA
					   bpx ShowWindow

   Receive Dialog/Userdata (Serial Num): bpx GetWindowTextA
                                    	   bpx GetDlgItemTextA
                                    	   bpx GetDlgItemInt

   Time and Date (Trial versions)  	 : bpx GetLocalTime
                                    	   bpx GetSystemTime
                                    	   bpx GetFileTime

   Create Windows (NAG-Screen) 	 	 : bpx CreateWindowExA
                                    	   bpx ShowWindow

   Buttons enable/disable (z.B.Winamp) 	 : bpx EnableWindow
   
   

5. Grundlage fr das Arbeiten mit SoftIce 

Um in SoftIce zu gelangen mut Du einfach die 'Control' Taste zusammen mit de Taste 'D' drcken, alle
Programme werden gestoppt und SoftIce hat 1. Prioritt. In einigen Tutorials siehst Du oft "Ctrl-D", da
nichts anderes bedeutet als "Drcke Control zusammen mit der D Taste". Einmal in SoftIce drin, siehst Du 
mehrere 'Windows' unterschiedlicher Gre, alle diese Fenster zeigen unterschiedliche Funktionen an.
Das unterste Window ist immer Dein Eingabefenster (Befehlszeile). In diesem Window kannst Du die verschiedenen
SoftIce-Befehle eingeben. Dann gibt es noch ein Code Window, ein Data Window und ein Register Window.   

Zuerst ein paar Worte ber die Breakpoints:

 BREAKPOINTS ALLGEMEIN
----------------------

Breakpoints sind fr die Arbeit eines Crackers sehr ntzlich. Ohne sie, wird es ein wenig schwieriger 
fr uns, und erheblich leichter fr die Leute, die die Kopierschutz-/Serialroutinen schreiben. Breakpoints sind gewollte 
Punkte, bei denen unser Programm stoppen soll, wenn eine bestimmte Bedingung erfllt ist. 

BREAKPOINT ON EXECUTE
---------------------

SYNTAX: bpx <api function name>

Das Hauptproblem beim Cracken, ist das Finden eines bestimmten Einsprunges bei dem ein Programm stoppen soll. Der einfachste und effektivste Weg dorthin beginnt mit Breakpoints.

Das einfachste was Du SoftIce sagen mut ist, wann es ein Programm unterbrechen soll so da Du sehen kannst was passiert.
Der Breakpoint-Typ hngt oft von dem Programm ab, welches Du debuggen/cracken willst.

Um das zu zeigens, hier ein Beispiel:

Eine andere Funktion um Breakpoints aufzurufen wird fr uns ntzlich sein, wenn es um das Cracken von Serialabfragen geht. Diese sehr ntzliche Funktion ist 'GetWindowTextA' oder 'GetDlgItemTextA'. Die beiden API-Funktionen arbeiten ungefhr gleich. 

1. Klick auf das StartButton (Windows) und klick auf 'Ausfhren' 
2. Gebe irgendetwas ein, z.B. 'DOOM' ABER DRCKE NICHT ENTER
3. Geh in SoftIce rein ( CTRL-D ), und gebe dort 'bpx GetWindowTextA' ein
4. Gehe zurck zu Windows ( CTRL-D oder F5 ) und drcke ENTER

SoftIce springt am Anfang der Routine 'GetWindowTextA' an, also drcke F11 um den Call zu verlassen. 

SPEICHER DURCHSUCHEN
--------------------

SYNTAX: s <-cu> <start> l <finish or length> '<string>'

Du kannst 2 Optionen setzen:

-c (Beachte bei der Suche Gro- und Kleinschreibung) 
-u (suche nach einem Unicode-String) 

Ein einfaches Beispiel. Nehmen wir an Du hast Deine Registrationsdaten eingegeben und den RegCode des Programms verloren. Dann kannst Du Dir, indem Du im Speicher nach Deinem Code durchsuchst, helfen.

Wenn Du danach suchen willst, so ist es besser berall im Speicher nachzuschauen. Dafr ein Beispiel:

   s 0 l ffffffff 'DOOM'
       
Einmal gefunden, wird Dir die Adresse ausgegeben an der sich der String im Speicher befindet. Das Data Window springt 
automatisch zu dieser Adresse hin.
Um jetzt weiter suchen zu lassen, mut Du einfach wieder ein s eingeben.

Denke daran, da einige Strings die in der Nhe der 80000000+ und C0000000+ Bereiche gefunden werden, nur Duplikate oder Bit's vom beschissenen Win95/98 Speichermanagement sind. 

BREAKPOINT AUF EINE SPEICHERADRESSE
-----------------------------------

SYNTAX: BPM[B/W/DW] <address> [R/W/RW/X]

Diese Funktion wird gewhnlich im Zusammenhang mit der oberen Funktion SPEICHER DURCHSUCHEN genutzt.

Nehmen wir mal an, da wir durch das Suchen folgende Ausgabe erhalten haben:

Pattern Found at 0167:0065BE44

Ok, das sagt uns, da unser String an der Adresse 0167:0065BE44 gefunden wurde. Um SoftIce anzuweisen diese Adresse "im
Auge" zu behalten. Nutzen wir:

BPM 0167:0065BE44

Das R/W weist SoftIce an, bei jedem Lese- oder Schreibzugriff auf diese Adresse das Programm anzuhalten. Die Grundeinstellung ist auch RW ( Read & Write )


BREAKPOINT AUF EINEN SPEICHERBEREICH
------------------------------------

SYNTAX: BPR <start address> <end address> [R/W/RW/T/TW] [expression]

Diese Funktion wird oft genutzt um einen ganzen Speicherbereich im Auge zu behalten, z.B. einen Usernamen, oder einen Serial Code.

Als Grundlage nehmen wir wieder unsere Suchfunktion. Wir haben also nach unserem Crewnamen 'DOOM' gesucht und uns wurde die Adresse 0167:006ABC22 als Fundort bermittelt. Um nun ein Auge darauf zu werfen, was mit dem gesamten Namen passiert, nutzen wir folgenden Befehl:

BPR 0167:006ABC22 0167:006ABC22+4 (Lnge des Strings in hex)

Das veranlasst SoftIce das Programm anzuhalten, wenn irgendein Byte an dieser Adresse gelesen oder dahin geschrieben wird.

Hier noch weitere Breakpoint Funktionen.

BREAKPOINTS AUFLISTEN
---------------------

SYNTAX: bl

Listet alle zur Zeit gesetzten (aktivierte/deaktivierte) Breakpoints auf, ihren Status, und ihre Breakpoint Nummer.

NUM) BREAKPOINT_TYPE PARAMETERS COUNT

Ein Beispiel knnte sein:

00) BPX #0167:006ABC22 C=01

Das zeigt uns, da SoftIce immer anhalten wird wenn die Adresse 0167:006ABC22 aufgerufen wird und wie oft das passiert.
In diesem Beispiel, wurde das Programm erst einmal (C=01) durch SoftIce angehalten.


BREAKPOINTS LSCHEN
-------------------

SYNTAX: bc <breakpoint(s)>

Mit dieser Funktion kannst Du in SoftIce gesetzte Breakpoints lschen. Du mut die Nummer des Breakpoints kennen oder Du lscht eben alle, Beispiel:

BC 0      <-- Lscht den Breakpoint 0
BC 1,2    <-- Lscht die Breakpoints 1 und 2
BC * 	  <-- Lscht alle Breakpoints


BREAKPOINT DEAKTIVIEREN
-----------------------

SYNTAX: bd <breakpoint(s)>

Manchmal ist es besser und ntzlicher die Breakpoints zu deaktivieren anstatt sie komplett zu lschen, Beispiel:

BD 1,2,3,4    <-- Deaktiviert die Breakpoints 1,2,3,4
BD 1	      <-- Deaktiviert den Breakpoint 1
BD *	      <-- Deaktiviert alle Breakpoints


BREAKPOINTS AKTIVIEREN
----------------------

SYNTAX: be <breakpoint(s)>

Natrlich, wenn Du Breakpoints deaktivieren kannst, dann willst Du sie auch wieder aktivieren , Beispiel:

BE 1,2,3,4    <-- Aktiviert die Breakpoints 1,2,3,4
BE 1	      <-- Aktiviert den Breakpoint 1
BE *	      <-- Aktiviert alle Breakpoints


Jetzt wirst Du einige Dinge ber das Anzeigen und Editieren von Speicherinhalten lernen:

ANZEIGEN & EDITIEREN VON SPEICHERINHALTEN - ALLGEMEIN
-----------------------------------------------------

Wenn Du durch den Code tracen wirst, mut Du oft die Registerinhalte/Speicherinhalte ansehen, damit Du einen berblick ber die Variablen, Pointer und Interrupts hast. Auerdem knnen die Inhalte der SoftIce Windows editiert werden, indem Du das Window mit Hilfe von der Alt Taste aktivierst (Alt-R fr Register, Alt-D fr Data, Alt-C fr Code, etc.) oder Du klickst mit dem Mousepointer in das Window hinein und nderst direkt die Daten. 

ANZEIGEN VON SPEICHERINHALTEN
-----------------------------

SYNTAX: d<size> <address> L <length>

Size (Gre) kann ein: B (byte), W (word), D (double word), S (short real), L (long real), oder T (10-byte real) sein.
Address ist die Speicheradresse die angezeigt werden soll(eine Adresse die durch den Inhalt eines Registers (z.B.EAX) 
oder einem Registeroffset (z.B.[ebp-04]) angegeben wird, kann durch die Eingabe des Registernamens und des Offset 
anstatt der Adresse angezeigt werden., z.B:

D eax oder d [ebp-04]

Durch das L werden die Daten im Command window (die Grundeinstellung ist das Data window - Wir empfehlen die Grundeinstellung beizubehalten), mit length (Lnge) wird festgelegt wieviel Reihen des Speichers angezeigt werden. 
Merke, da es 4 Data Windows gibt, die durch die Eingabe von "DATA" in der Befehlszeile angezeigt werden knnen.

EDITIEREN VON SPEICHERINHALTEN
------------------------------

SYNTAX: e<size> <address> <data-list>

Size (Gre) kann ein: B (byte), W (word), D (double word), S (short real), L (long real), oder T (10-byte real) sein.  Address ist die Speicheradresse die editiert werden soll.
Data-List -> Die entpsrechenden Daten in der richtigen Gre(bytes, words, double words, short reals, long reals, oder
10-byte reals) oder Strings in Anfhrungsstriche, getrennt durch Kommas oder Leerzeichen. Es knnen die einfachen sowie
die doppelten Anfhrungsstriche genutzt werden.
Wenn Du keine Daten angibt's springt der Cursor direkt in das Data Window wo Du den Speicher editieren kannst.
Um zwischen dem ASCII und dem HEX Display zu wechseln, benutze die TAB Taste. 

EB ds:1000 'My String',0

Dieser Befehl kopiert den null-terminierten ASCII string 'My String' in die Speicherposition ds:1000 .


NDERN VON REGISTERWERTEN
-------------------------

SYNTAX: r <register-name> = <value>

Register-Name kann eines der folgenden Register sein: AL, AH, AX, EAX, BL, BH, BX, EBX, CL, CH, CX, ECX, DL, DH, DX, EDX,
DI, EDI, SI, ESI, BP, EBP, SP, ESP, DS, CS, SS, CS FS, GS
Value ist ein hexadezimaler Wert oder ein Ausdruck.
Wenn kein Parameter angegeben wird, springt der Cursor automatisch in das Register window, und die Register knnen 
dort direkt editiert werden. 
Dieser Befehl ist sehr ntzlich um Registerinhalte zu ndern, bevor sie durch Vergleichsroutinen(meistens Serialschutz) verglichen werden und irgendwelche Sprnge erfolgen.
Ein Beispiel:

R eax=5 		; setzt das Register eax gleich 5


6. Grundlegende Literatur

- SoftIce Command reference - hier sind alle SoftIce Befehler ausfhrlich beschrieben
- SoftIce UserGuide
- WinIce Doc
- Tutors, Tutors ....


7. Nachwort

Wir hoffen, da dieses Tutorial einige Hilfen im Umgang mit SoftIce geben wird. Um das Cracken komplett zu lernen,
mut Du noch sehr viel andere Tutorials und Anleitungen lesen und Du wirst nie genug lernen knnen.

8. Gre

Danke an Mammon, The Sandman und CoRN2 fr ihre groartigen Tutorials.


Ich hoffe, da Dir dieses Tutorial helfen wird einige Programme zu "debuggen" ;)
Vanor [DOOM]
22.04.1999


