Einfach Debugger, Error: Privileged Instruction

Hancock

Captain
Registriert
Nov. 2007
Beiträge
3.928
Hallo,

ich wollte mir einen einfachen Debugger schreiben, scheitere aber schon an der ersten Hürde, ich kann die Debug-Register dr0-7 nicht beschreiben.
Das Programm kompiliert zwar, stürzt dann aber mit Error 0xc0000096 Privileged Instruction bei der ersten mov Operation ins Debugreister ab.

Auf verschiedenen Seiten hab ich gelesen, dass diese Register nur im Ring 0 angesprochen werden dürfen, also nur vom Kernel oder Treiber.

Allerdings kann das Visual Studio auch debuggen und nutzt wahrscheinlich auch diese Register, wie macht Microsoft das, oder gibt es eine (einfache) Lösung, mit der man auf diese Register zugreifen kann.

Ich nutze:
Windows 7 x64
Visual C++ 2008 Express Edition

Mein Quellcode für das Testprogramm:
Code:
[SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]#include [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4][COLOR=#a31515][SIZE=4][COLOR=#a31515]<iostream>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]using [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]name space[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4] std;[/SIZE]
[SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4] main([/SIZE][SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4] argc, [/SIZE][SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]char[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4]* argv[])[/SIZE]
[SIZE=4]{[/SIZE]
[SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]  int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4] zahl=0,zahl2=123;[/SIZE]
[SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff]  __asm[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=4] {[/SIZE]
[SIZE=4]     mov eax,[zahl][/SIZE]
[SIZE=4]     mov dr0,eax[/SIZE]
[SIZE=4]     mov ebx,dr0[/SIZE]
[SIZE=4]     mov [zahl2],ebx[/SIZE]
[SIZE=4] }[/SIZE]
[SIZE=4] cout<<zahl2;[/SIZE]
[SIZE=4] system([/SIZE][SIZE=4][COLOR=#a31515][SIZE=4][COLOR=#a31515]"PAUSE"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4]);[/SIZE]
[SIZE=4][COLOR=#0000ff][SIZE=4][COLOR=#0000ff] return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=4] 0;[/SIZE]
[SIZE=4]}[/SIZE]
 
Zuletzt bearbeitet:
Nee, den nicht, aber das sieht schon mal richtig gut aus, den werde ich jetzt ausprobieren.
Vielen Dank schonmal.

Der Code funzt net unter x64 miteinem 32 bit Programm, aber Visual C++ ist ein 32 bit Programm, wie macht es das?
 
Zuletzt bearbeitet:
Hmm, hab grad die Kommentare überflogen, das geht wohl nur unter XP32SP2 so. Ist wohl sehr betriebssystemabhängig das Ganze.
Unter Vista/Win7-x64 braucht man soweit ich weiss signierte Treiber für derartige Low-Level-Zugriffe, ich nehm mal an das Studio installiert so einen.

Wenn du nur ein bisschen rumspielen willst:
Im Usermode kann einen (structured) Exception Handler installieren: _set_se_translator() in der WIN32 API
Bei einer Exception(Access violation) hat man Zugriff auf den Prozessorzustand als struct.
 
Ich hab mal geschaut, es sind keine Treiber, die ich im Gerätemanager sehen kann.

Villeicht find ich ihn einfach auch net, sind ja nicht ganz wenig, die teilweise passende Namen haben könnten.
Also ich will ein Debugger schreiben, der wirklich den Code anhalten kann. Es geht mir darum, zu prüfen, ober der Code auch wirklich Code ist und nicht nur Daten. Also ausführen und drauf warten, dass der Debugger anspringt. Das heißt, auch ohne C/C++-Ausnahmen.
 
Zurück
Oben