Lite-C Funktion hooken.

Der Code wird minimal modifiziert, um eine Lite-C Funktion "blab" zu hooken.


Code der lite-c funktion:
Code:
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"
Code:
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)
Code:
__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


Last edited by TechMuc; 08/15/11 02:51.