Lite-C Funktion hooken.Der Code wird minimal modifiziert, um eine Lite-C Funktion "blab" zu hooken.
Code der lite-c funktion:
int blab() {
int ac = 0;
return 0;
}
function main() {
while(1) {
blab();
wait(1);
}
}
Folgender Screenshot zeigt den Assembler Aufruf der Funktion blab OHNE hooking (man beachte die merkwürdige CALL Anweisung)
Nach dem Hooking sieht die Funktion wie folgt aus:
Der Assembler in der Trampoline Funktion ==> klappt bis ausführen des Calls
Der Call springt zurück zur Lite-C Funktion
Hier wird es nun richtig merkwürdig.. Wie schon vorher ersichtlich, arbeitet die lite-C Funktion mit den Stack, der durch den CALL verändert wurde (s. Screneshot oben: "call 05861A8e ==> pop eax. EAX wird hier nun auf den wert 05861a8e gesetzt).
Durch das hooken, ist der Stack an dieser stelle logischerweise leicht modifiziert. Dies führt zu einen Fehler in den Folgeberechnungen und zu einen dump in der letzten Zeile des letzten Screenshots.
Nun zu den eigentlichen Fragen:
1) Haben Sie irgendeine Idee, was man dagegen machen kann / wie man die liteC Funktion richtig hookt?
2) Wieso erzeugt der liteC Compiler so unglaublich merkwürdigen Code? Ein CALL auf die nächste Zeile? Was bringt/soll das?
3) Eine sehr wichtige Frage: Ist es
garantiert, dass der start Code von JEDER User Funktion in Lite-C immer so aufgebaut ist? Also jede liteC Funktion beginnt mit folgenden "Preamble"
push ebp
push ebx
push esi
push edi
call NEXT_LINE
In diesem Fall könnte ich hooken und schlicht ergreifend in der Hooking Funktion, den Stack selber beschreiben...
Folgender Code funktioniert also: (getestet. ABER: Wie gesagt, ich brauche hier eine garantie, dass jede Engine Funktion so beginnt)
__inline __declspec(naked) void hooking_function()
{
__asm {
push ebp
push ebx
push esi
push edi
mov eax, test_me ; test_me = pointer to orginal function
add eax, 9 ;9 = 4*push + 5 for jump
push eax
jmp eax
}
}
4) Welche Calling-Convention wird vom LiteC Compiler verwendet?
Gruß,
Timo