Virtual Query
-
Durch Inline Assembler hatteich vor ein kleines Mini Programm zu schreiben welches einen MemoryDump des eigenen Prozesses erstellt. Nun scheitere ich schon am Anfang(C++ mit Assembler vermischt) C++ als Hauptprogramm:
SYSTEM_INFO sys; GetSystemInfo(&sys); const void *startaddr=sys.lpMinimumApplicationAddress; MEMORY_BASIC_INFORMATION mbi; unsigned long mbisize=sizeof(MEMORY_BASIC_INFORMATION); _asm { [asm] push mbisize ; Parameter falschrum auf den Stack legen lea eax,mbi push mbi ;Addresse von mbi auf den Stack legen push startaddr ; Anfangsaddresse auf den Stack legen call VirtualQuery ; Funktion aufrufen [/asm] } cout<<mbi.lpMinimumApplicationAddress<<endl;//egal was ich nach dem Funktionsaufruf von VirtualQuery mache ergibt es eine privilege instruction
Da es meiner Meinung mehr darum geht WINAPI Funktionen in asm aufzurufen schreibe ich dieses Thema ins asm Forum
-
SpR schrieb:
out<<mbi.lpMinimumApplicationAddress<<endl;//egal was ich nach dem Funktionsaufruf von VirtualQuery mache ergibt es eine privilege instruction
Was soll das den heißen?
Mal davon abgesehen, wirst du das nicht Kompiliert bekommen (RTFM).BTW: schon mal drüber nachgedacht, den Rückgabewert auszuwerten?
-
SpR schrieb:
call VirtualQuery ; Funktion aufrufen
WinAPI-Funktionen ruft man so auf:
call dword ptr [VirtualQuery]
cout<<mbi.lpMinimumApplicationAddress<<endl;
Ich konnte das Element "lpMinimumApplicationAddress" in der Struktur mbi (MEMORY_BASIC_INFORMATION: (http://msdn.microsoft.com/library/windows/desktop/aa366775) nicht finden. Der Compiler auch nicht.
viele grüße
ralph
-
Sorry in dem Fall habe ich was verwechselt vielen Dank so jz zeige ich es nochmal letzte Zeile:
cout<<mbi.AllocationBase<<endl;
Tut mir leid habe an SYSTEM_INFO structure beim schreiben gedacht und ich bekomme das sehr gute kompiliert, problem ist halt der Fehler während der Laufzeit , dass jeder Befehl welcher auf meinen call Befehl folgt eine private instruction birgt
Versuche deine möglichkeit gleich aus rkhb
-
Vielen vielen dank rkhb wegen dem hier
call dword ptr[VirtualQuery]
das wusste ich noch nicht^^.Danke dir auch masm, nur noch eine Frage woher soll ich wissen wann ich das hier benutze
call dword ptr[VirtualQuery]
und wann das hier
call VirtualQuery
-
SpR schrieb:
nur noch eine Frage woher soll ich wissen wann ich das hier benutze
call dword ptr[VirtualQuery]
und wann das hier
call VirtualQuery
Na dann aus dem Nähkästchen:
Ich habe die COUT-Zeile auskommentiert, vor den Assembler-Block den WinAPI-Aufruf noch einmal in C/C++ hingeschrieben:
VirtualQuery (startaddr, &mbi, mbisize);
und dann (u.a.) mit folgenden Parametern über Kommandozeile kompiliert:
/FAcs /Zi /Od /W4 /Wall
Die Beschreibung der Compiler-Optionen findest Du hier:
http://msdn.microsoft.com/en-us/library/9s7c9wdw.aspxWarnmeldungen solltest Du beachten, ganz besonders wenn Du mit Inline-Assembler den Compiler überlistest.
Es entsteht zusätzlich eine .COD-Textdatei, die ein Disassembler-Listing mit Quellcode enthält. Der interessante Teil beginnt bei der Zeile, die mit "_main" beginnt. Dann habe ich das verglichen, was der Compiler aus VirtualAlloc() und aus dem Assembler-Block gemacht hat. Normalerweise hat man sich mit den Zeigern vertan (King LEA: Reason in madness). Hier aber waren die CALL-Befehle zu unterschiedlich, um zu stimmen.
Also habe ich noch ein "_asm {int 3}" in den Quelltext gebastelt, um mit OllyDbg ab der gewünschten Stelle zu debuggen. OllyDbg verriet mir dann, dass das eine ein indirekter Sprung und das andere ein direkter Sprung war. Damit war die Sache klar. Ich wusste das übrigens vorher auch noch nicht - wer kommt denn schon auf die Idee, per Inline-Assembler des Microsoft-Compilers eine Microsoft-WinAPI-Funktion aufrufen zu wollen.
viele grüße
ralph
-
xD ich komme auf die geniale idee es geht darum eine Funktion komplett aus geschwindigkeitsgründen in asm zu schreiben, und da ich diese Funktion mehrmals brauche dachte ich das es ganz lustig wäre ne WINAPI Funktion in asm aufzurufen^^ schönen Abend noch.