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.aspx

    Warnmeldungen 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.


Anmelden zum Antworten