Diskussion:Trampolin (Informatik)

Letzter Kommentar: vor 11 Jahren von Henrik Haftmann in Abschnitt Eine mögliche Implementierung

Eine mögliche Implementierung Bearbeiten

Interessant ist ja jetzt nur noch, wie so ein Trampolin entsteht! Dies geht (nur) mit maschinenspezifischen Kode und nur wenn der Heap auch ausführbar (executeable) ist. Dieses Code-Beispiel ist in Microsoft C erstellt.

#ifdef _M_IX86
# define TRAMPOLIN_CODESIZE 12	// Code-Größe ist plattformabhängig!
#else
# error Nicht unterstützte Plattform! Ggf. Kode hier einfügen!
#endif

class CTrampStdcall{
public:
 CTrampStdcall(LPVOID FuncPtr,PVOID Arg);
private:
 BYTE code[TRAMPOLIN_CODESIZE];
};

CTrampStdcall::CTrampStdcall(LPVOID FuncPtr, PVOID Arg) {
#ifdef _M_IX86
 code[0] = 0x59;	// pop ecx		; Returnadresse vom Stack
 code[1] = 0x68;	// push Arg		; Objekt-Zeiger vorn hinzufügen
 *(PDWORD)(code+2) = (DWORD)Arg;
 code[6] = 0x51;	// push ecx		; Returnadresse auf Stack
 code[7] = 0xE9;	// jmp FuncPtr	; Fkt. mit 1 Parameter mehr anspringen
 *(PDWORD)(code+8) = (DWORD)FuncPtr - (DWORD)(code+12);
#else
# error Nicht unterstützte Plattform! Ggf. Kode hier einfügen!
#endif
}

Mit dem Konstruktor wird das CTrampStdcall-Objekt mit Kode gefüllt, welches eine _stdcall-Funktion mit der gleichen Signatur aufruft wie ohne Trampolin, mit einem zusätzlichen Parameter am Anfang:

  1. Parameter = übergebener Parameter

An Stelle des normalen Funktionszeigers wird das Objekt als Adresse übergeben.

Für _cdecl-Funktionen muss das Trampolin anders aussehen, und man benötigt eine andere Klasse.

Hier ist der ursprüngliche, getestete Kode (etwas altbacken). --Henrik Haftmann (Diskussion) 11:31, 2. Apr. 2013 (CEST)Beantworten

Ich danke Ihnen für die Mühe, ein Beispiel zu erstellen; dieses halte ich aber für ungeeignet, da es relativ viel Overhead enthält und der eigentliche Kern des Codes durch die Darstellung als Bytefolge unter Umständen etwas schwer zu erkennen ist. Ich versuche mal, ein Codebeispiel komplett in Assembler zu schreiben. Dabei ist darauf zu achten, dass dieses möglichst nicht von einem Betriebssystem abhängt; ich schlage vor, ARM-Assembler zu nutzen, da dieser im Gegensatz zu x86 eine einheitliche Syntax hat.