Ich habe an einem (C++) Projekt gearbeitet, das erfordert vollständig dynamisch zugewiesene Funktionen, die malloc/new und mprotect bedeutet und dann den Puffer manuell ändern Assemblercode. Aus diesem Grund habe ich mich genau gefragt, was in diesem "Puffer" von mir erforderlich ist, denn es ist ein Replikat irgendeiner anderen _cdecl-Funktion. Zum Beispiel:Verwendung von C++ mit Assembly zum Zuweisen und Erstellen neuer Funktionen zur Laufzeit
int ImAcDeclFunc(int a, int b)
{
return a + b;
}
Wenn ich möchte buchstäblich ein Duplikat dieser Funktion erstellen, aber völlig dynamisch, was würde erforderlich machen (und denken Sie daran, es ist C++ mit Inline Montag)? Für den Anfang, ich denke, ich würde so etwas zu tun habe (oder eine ähnliche Lösung):
// My main....
byte * ImAcDeclFunc = new byte[memory];
mprotect(Align(ImAcDeclFunc), pageSize, PROT_EXEC | PROT_READ | PROT_WRITE);
Danach würde ich den Assembler-Code für die ImAcDeclFunc(int a, int b);
herauszufinden muß. Jetzt bin ich immer noch mies bei der Montage, also wie wäre diese Funktion in AT & T Syntax? Hier ist mein kühner Versuch:
push %ebp
movl %%ebp, %%esp
movl 8(%ebp), %%eax
movl 12(%ebp), %%edx
addl edx, eax
pop ebp
ret
Nun, wenn dieser Code korrekt ist (was ich sehr Zweifel, bitte korrigieren Sie mich) würde ich muss nur diesen Code Wert in Hex finden (zum Beispiel ‚JMP‘ ist 0xE9 und ' inc 'ist 0xFE), und verwenden Sie diese Werte direkt in C++? Wenn ich meinen früheren C++ Code weiter:
*ImAcDeclFunc = 'hex value for push'; // This is 'push' from the first line
*(uint)(ImAcDeclFunc + 1) = 'address to push'; // This is %ebp from the first line
*(ImAcDeclFunc + 5) = 'hex value for movl' // This is movl from the second line
// and so on...
Nachdem ich dies für den gesamten Code/Puffer getan haben, wäre das für eine völlig dynamische _cdecl Funktion genug sein (dh konnte ich warf es einfach auf einen Funktionszeiger und tun int result = ((int (*)(int, int))ImAcDeclFunc)(firstArg, secondArg)
?). Und ich bin nicht daran interessiert, mit boost :: function oder etwas ähnlich, ich die Funktion muß vollständig dynamisch, daher mein Interesse sein :)
HINWEIS: Diese Frage ist eine Fortsetzung auf meinem previous one, aber mit viel mehr Details.
Warum sollten Sie eine Funktion kopieren? Das Original ist genauso gut. Möchten Sie aus einer übergeordneten Darstellung eine völlig neue Funktion generieren? –
@ n.m. Ja, das war alles nur ein Beispiel für mich, um alles zu verstehen und zu präsentieren. Ich werde ungefähr zwanzig davon brauchen. Wenn Sie meinen Link lesen (zu meiner anderen Frage), würden Sie genau verstehen warum :) –
Ich habe versucht, diese Frage beim ersten Mal zu verstehen, ohne Erfolg. –