Wie arbeitet ein Debugger? |
|
Debugger wurden in erster Linie dazu entwickelt, um einem Softwareentwickler bei der Fehlersuche behilflich zu sein. Ein Debugger ist jedoch auch ein sehr nützliches Werkzeug, wenn es um das Hacken von Programmen geht. Mittels Anti-Debugging Mechanismen kann jedoch einem Hacker das Debuggen erschwert werden. Um Anti-Debugging Methoden besser verstehen zu können, werden im Nachfolgenden die Gründzuge gezeigt, wie ein Debugger arbeitet.
Ein Debugger bietet die Möglichkeit, ein Programm zur Laufzeit beobachten und an bestimmten Stellen im Code anhalten zu können. Das Anhalten erfolgt mittels eines Haltepunkts (Breakpoint). Wenn ein Breakpoint erreicht wird, wird das Programm angehalten und es wird dem Benutzer der momentane Zustand (z.B. Speicherinhalte und Registerinhalte) des Programms angezeigt. Nachdem das Programm angehalten wurde, kann es wird fortgeführt oder im Einzelschritt (Single Stepping) durchlaufen werden. Single Stepping bedeutet, dass das Programm nach jedem Befehl (Quellcode oder Assemblercode) anhält und den momentanen Zustand des Programms anzeigt. Ein Hacker verfügt im Normalfall nicht über den Quellcode, somit erfolgt das Debuggen auf Assemblerebene. Mittels Breakpoints und Single Stepping ist ein Hacker in der Lage, interessante Stellen im Code genauer untersuchen zu können.
Wie arbeitet ein Debugger?
Bei Debuggern unterscheidet man zwei Arten: User-Mode Debugger und Kernel-Mode Debugger. User-Mode Debugger laufen als normale Anwendung, d.h. es können nur normale Anwendungen gedebuggt werden, jedoch keine Treiber, da diese sich auf Kernel-Ebene befinden. Weiter sind User-Mode Debugger nur in der Lage, während der Laufzeit nur einen Prozess zu überwachen. Startet der überwachte Prozess einen Weiteren, so muss dieser erneut durch eine weitere Instanz des Debuggers überwacht werden. Ein weit verbreiteter User-Mode Debugger unter Hackern ist Ollydbg.
Kernel-Mode Debugger laufen auf Kernel-Ebene und ermöglichen das Debuggen von normalen Anwendungen und Treibern. Des Weiteren bieten Kernel-Moder Debugger die Möglichkeit, dass Betriebsystem zu einem beliebigen Zeitpunkt anhalten und das System als Ganzes betrachten zu können. Ein weit verbreiteter Vertreter ist Softice von Compuware.
Man unterscheidet zwei Arten von Breakpoints: Software-Breakpoint und Hardware-Breakpoint. Wenn ein Benutzer einen Software-Breakpoint an einer Adresse setzt, ersetzt der Debugger das erste Byte der Instruktion mit einer INT3 (0xCC, Interrupt Nummer 3) Instruktion. Sobald der Prozessor die Stelle mit der INT3 Instruktion erreicht, wir ein Interrupt ausgelöst. Der Debugger ersetzt die INT3 Instruktion mit dem Originalwert und friert den Zustand des Programms an der Stelle ein, so dass der Benutzer das Programm untersuchen kann.
Bei einem Hardware-Breakpoint werden spezielle Prozessor Debug-Register (DR) verwendet. Anders als bei Software-Breakpoints, erfolgt bei Hardware-Breakpoints keine Modifikation in dem zu überwachenden Programm. Anhand der Adresse in dem Debug-Register weiss der Prozessor, an welcher Stelle im Programm ein Breakpoint Interrupt (Interrupt Nummer 1) ausgeführt werden muss, um das Programm anhalten zu können. Die Debug-Register bieten auch die Möglichkeit, um an Speicheradressen auf Schreib- oder Lesezugriffe triggern zu können.
Wird das Programm durch einen Software- oder Hardware Breakpoint angehalten, so kann mittels Single Stepping das Programm weiter analysiert werden. Bei Single Stepping wird jede Instruktion einzeln ausgeführt und nach dem Ausführen, wird dem Benutzer sofort der Zustand des Programms angezeigt. Das Unterbrechen des Programms erfolgt mittels Interrupt (Interrupt Nummer 1). Der Interrupt wird dadurch ausgelöst, dass im EFLAGS-Register das Trap-Flag (TP) gesetzt wird.
|