Lite-C Compiler,

Posted By: TechMuc

Lite-C Compiler, - 08/14/11 21:52

Hallo Herr Lotter,

Im folgenden Post ein Thema, dass eigentlich etwas zu tief für einen Forum-Post ist, und mehr eine Support Anfrage ist. Falls Sie in den nächsten Tagen hierfür Zeit finden, wäre es sehr freundlich, wenn Sie mal einen Blick drauf werfen könnten.


Wenn Sie keine Zeit dafür finden, wäre es super wenn Sie sich zumindest Frage DREI im nächsten Post anschauen könnten.


Es geht darum, eine Art Analyser / Profiler für Lite-C zu schreiben. Die vorgesehene Technik sieht vor, jede Funktion, die der Benutzer in seinem Code definiert hat, zu hooken. D.h. wenn im Script die Funktion aufgerufen wird, springt der Compiler in echt, in eine von mir definierte Funktion, die im Anschluss die eigentliche Funktion aufruft. Das Konzept wird mittels Microsoft Detours umgesetzt.

Nun gibt es allerdings unerwartete Probleme beim hooken von Engine Funktionen. Im folgenden erstmal die Beschreibung wie es funktionieren sollte.

C++ Funktion hooken

Folgender Code wird gestartet (wobei "hook_test" die Funktion "wuhu" hookt. "org_func_trampoline" wird dabei auf die Speicheradresse der Trampoline Funktion gesetzt.



Der Übersicht halber hier die Funktion "wuhu" bevor sie gehook wurde.


Nach dem Hooking Vorgang sieht die Funktion "wuhu" so aus:


Sie springt also in meine hooking Funktion rein (wie gewünscht). Die Hooking Funktion führt nun irgendeinen Code aus, und springt zum Trampoline (bitte "naked" deklaration beachten. Stack wird NICHT beeinflusst).


Das Trampoline liegt in einer komplett verschiedenen Memory Gegend und führt den Code, der durch die Jump Anweisung ersetzt wurde.


Schlussendlich wird zurück zur Funktion "wuhu" gesprungen, und alles läuft seinen gewohnten Gang.



So ist die Theorie / Praxis mit Code der mit Visual Studio kompliert worden ist.


Im nächsten Post gehts weiter (Bildbeschränkung).
Posted By: TechMuc

Re: Lite-C Compiler, - 08/14/11 22:05

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

Posted By: TechMuc

Re: Lite-C Compiler, - 08/14/11 22:08

Und: Wann gibt es eigentlich das debugging von lokalen Variablen? wink
Posted By: Joey

Re: Lite-C Compiler, - 08/15/11 02:20

Code:
call nextline
nextline:
pop eax


ist das gleiche wie
Code:
mov eax, eip


nur dass es das letztere nicht gibt, weil man auf den instruction pointer nicht direkt zugreifen darf.
Posted By: TechMuc

Re: Lite-C Compiler, - 08/15/11 02:36

Nice laugh Jetzt muss nur noch Frage drei beantwortet werden.

Danke dir.
Posted By: jcl

Re: Lite-C Compiler, - 08/16/11 08:06

Die Antwort ist ja - jede User-Funktion beginnt auf die gleiche Weise.

ABER: das kann sich in künftigen Versionen ändern. Zur Unterstützung von variablen Argumenten in Userfunktionen müssen wir diese Struktur modifizieren und werden sie dabei auch erheblich optimieren. Ab einer künftigen lite-C Version wird der Beginn einer Userfunktion also anders aussehen.
Posted By: TechMuc

Re: Lite-C Compiler, - 08/16/11 12:59

Wenn Sie das ändern stellt das für mich keine Herausforderung dar, dass auch zu ändern. Das wichtige ist ausschließlich, dass jede User Funktion hier gleich beginnt und dass im beta forum o.ä. darüber informiert wird..
Danke nochmal für die Antwort.
Posted By: jcl

Re: Lite-C Compiler, - 08/18/11 08:15

Wenn sich der Call-Beginn ändert, werden wir das entsprechend dokumentieren.
© 2024 lite-C Forums