2016-05-21 24 views
-4

Ich brauche Hilfe herauszufinden, warum ich zur Laufzeit stürze, wenn ich versuche, meinen Maschinencode zu starten. Der Code stürzt zwischen "3" und "result =% li" ab.Obskurer Laufzeitfehler beim Ausführen des Maschinencodes

HINWEIS: Angenommen, der gesamte Code ist fehlerhaft. Ich habe den Fehlerprüfcode aus Gründen der Leute entfernt, die das lesen.

Maschinendaten:

Windows 10 Home 64-bit 
Intel(R) Core(TM) i7-4712MQ 

-Code Ich bin mit:

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

int main(int argc, char** argv) { 

    printf("Loading code\n"); 

    LPVOID m = VirtualAlloc(NULL, 16, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); 

    printf("1\n"); 

    unsigned char code[] = { 
    //return x+2; 

    0x55,      //push %rbp 
    0xe5, 0x89, 0x48,   //mov %rsp,%rbp 
    0xc8, 0x89,    //movl %ecx,%eax 
    0x02, 0xc0, 0x83,   //add $0x2,%eax 
    0xc9,      //leaveq 
    0xc3,      //retq 
    0x90      //nop 
    }; 
    memcpy(m, code, sizeof(code)); 

    printf("2\n"); 

    PDWORD trash; 
    VirtualProtect(m, 16, PAGE_EXECUTE_READ, trash); 

    printf("3\n"); 

    long int (*addTwo)(long int) = m; 
    long int answer = addTwo(2); 
    printf("result = %li\n", answer); 

    VirtualFree(m, 0, MEM_RELEASE); 
    return 0; 
} 
+1

Überprüfen Sie den Rückgabewert von 'VirtualProtect'. Hat es gelingen? (Sie sollten auch den Rückgabewert von 'VirtualAlloc' überprüfen, aber ich nehme an, dass das funktioniert oder das' memcpy' wäre abgestürzt.) Wenn 'VirtualProtect' erfolgreich ist, sollten Sie den Debugger im Assembly-Modus starten und Setzen Sie einen Haltepunkt bei der Deklaration von 'addTwo'. – user3386109

+0

Ich habe den ganzen Prüfcode aus Gründen der Leute hier entfernt. @ user3386109 Hat Windows einen nativen Debugger oder soll ich gdb installieren? – tiffanyButterfly95

+0

zur besseren Lesbarkeit und Verständnis: folgen Sie dem Axiom: * nur eine Anweisung pro Zeile und (höchstens) eine Variablendeklaration pro Anweisung. *. Hinweis: 'unsigned char code [] 'platziert die Daten im .data-Bereich und nicht im .text-Bereich und die Einträge im .data-Bereich sind nicht ausführbar – user3629249

Antwort

0

Es scheint, dass Sie Speicher auf dem Stack verwenden eine automatische Variable zu speichern:

0x10, 0x4d, 0x89,   //mov %ecx,0x10(%rbp) 
0x10, 0x45, 0x8b,   //mov 0x10(%rbp),%eax 

aber Ihre Offset ist falsch, das Hinzufügen von 0x10 zu %rpb wird den resultierenden Adresspunkt zu previo machen uns Stapelrahmen; Um auf lokale Variablen zu verweisen, sollten Sie von BP subtrahieren. Außerdem brauchen Sie nicht einmal den Stack dafür zu benutzen, tun Sie einfach movl %ecx, %eax.

+0

Ich habe den Code angepasst, aber ich stoße immer noch an der gleichen Stelle. – tiffanyButterfly95