Frage

Stellen Sie sich vor mir so etwas wie dies tue:

void *p = malloc (1000);
*((char*)p) = some_opcode;
*((char*)p+1) = another_opcode; // for the sake of the example: the opcodes are ok

....
etc...

Wie kann ich einen Funktionszeiger definieren p zu nennen, als ob es eine Funktion war? (Ich verwende VC ++ 2008 Express).

Danke

War es hilfreich?

Lösung

Ein Kommentar war nicht genug Platz. Joe_Muc ist richtig. Sie sollten nicht Code in den Speicher durch malloc oder new erhalten stopfen. Sie werden auf Probleme stoßen, wenn Sie die Seite Eigenschaften von Seiten ändern, auf dem Windows zuordnet.

Dies ist kein Problem, becuase mit VirtualAlloc () und die damit verbundenen Win32-APIs ist jeder einfach: Rufen Sie VirtualAlloc () und die flProtect auf [PAGE_EXECUTE_READWRITE][2]

Beachten Sie, sollten Sie wahrscheinlich tun drei Zuweisungen, eine Schutzseite, die Seiten, die Sie für Ihren Code benötigen, dann noch eine Schutzseite. Dies wird Ihnen ein wenig Schutz vor fehlerhaftem Code.

Auch wickeln Anrufe auf Ihren generierten Code mit strukturierter Ausnahmebehandlung .

Als nächstes werden das Windows-X86 ABI (Aufrufkonventionen) sind nicht gut dokumentiert (ich weiß, ich habe aussehen). Es gibt einige Informationen hier , hier , hier der beste Weg, um zu sehen, wie die Dinge Arbeit an Code durch den Compiler erzeugt zu suchen. Dies ist einfach, mit dem \FA schaltet ( es gibt vier von ihnen).

Hier finden Sie die 64-Bit-Aufrufkonventionen hier .

Sie können aber auch nach wie vor Microsoft Macro Assembler MASM hier . Ich empfehle Ihre Maschinencode in MASM Schreiben und an seinem Ausgang zu suchen, dann ist Ihr Maschinencode-Generator tun ähnliche Dinge haben.

Intel und AMDs Prozessor Handbücher sind gute Referenzen - sie erhalten, wenn Sie diese nicht haben <. / p>

Andere Tipps

Eigentlich malloc wahrscheinlich wird es nicht schneiden. Unter Windows müssen Sie wahrscheinlich so etwas wie [VirtualAlloc] ( http://msdn.microsoft.com/en-us/library/aa366887 (VS.85) .aspx) um eine ausführbare Speicherseite zu erhalten.

Starten klein:

void main(void)
{
    char* p = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    p[0] = (char)0xC3;  // ret

    typedef void (*functype)();
    functype func = (functype)p;
    (*func)();
}

Der nächste Schritt für mit Ihrem Code schön zu spielen, ist das EBP-Register zu bewahren. Dies wird als Übung. : -)

Nach diesem Schreiben, lief ich es mit malloc und es funktionierte auch. Das kann sein, weil ich bin ein Admin-Konto auf Windows 2000 Server ausgeführt wird. Andere Versionen von Windows können tatsächlich den VirtualAlloc Anruf benötigen. Wer weiß.

Wenn Sie die richtigen OP-Codes an der richtigen Stelle, nennen kann so einfach sein wie auf einen Funktionszeiger Gießen und nannte es.

typedef void (*voidFunc)();

char *p = malloc (1000);
p[0] = some_opcode;
p[1] = another_opcode; // for the sake of the example: the opcodes are ok
p[n] = // return opcode...

((voidFunc)p)();

Beachten Sie aber, dass, wenn Sie die Seite als ausführbare Datei, Ihren Prozessor markieren können Sie Code auf dem Heap erzeugt ausführen nicht lassen.

Ich bin auch gerade in der Ausführung generierten Code, und während die Antworten hier nicht mir gerade gegeben hat, was ich brauchte, Leute schickte mich auf dem richtigen Weg.

Wenn Sie eine Seite als ausführbare Datei auf POSIX-Systeme markieren (Linux, BSD etc.), besuchen Sie das mmap (2) Funktion .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top