Gamestudio Links
Zorro Links
Newest Posts
Help with plotting multiple ZigZag
by degenerate_762. 04/30/24 23:23
M1 Oversampling
by 11honza11. 04/30/24 08:16
Trading Journey
by howardR. 04/28/24 09:55
Zorro Trader GPT
by TipmyPip. 04/27/24 13:50
Data from CSV not parsed correctly
by jcl. 04/26/24 11:18
Why Zorro supports up to 72 cores?
by jcl. 04/26/24 11:09
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
4 registered members (AndrewAMD, SBGuy, TipmyPip, ozgur), 923 guests, and 6 spiders.
Key: Admin, Global Mod, Mod
Newest Members
firatv, wandaluciaia, Mega_Rod, EternallyCurious, howardR
19050 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Lite-C Compiler, #380233
08/14/11 21:52
08/14/11 21:52
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
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).

Last edited by TechMuc; 08/15/11 20:48.
Re: Lite-C Compiler, [Re: TechMuc] #380234
08/14/11 22:05
08/14/11 22:05
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
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.
Re: Lite-C Compiler, [Re: TechMuc] #380235
08/14/11 22:08
08/14/11 22:08
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
Und: Wann gibt es eigentlich das debugging von lokalen Variablen? wink

Re: Lite-C Compiler, [Re: TechMuc] #380240
08/15/11 02:20
08/15/11 02:20
Joined: Jan 2003
Posts: 4,615
Cambridge
Joey Offline
Expert
Joey  Offline
Expert

Joined: Jan 2003
Posts: 4,615
Cambridge
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.

Re: Lite-C Compiler, [Re: Joey] #380241
08/15/11 02:36
08/15/11 02:36
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
Nice laugh Jetzt muss nur noch Frage drei beantwortet werden.

Danke dir.

Re: Lite-C Compiler, [Re: TechMuc] #380352
08/16/11 08:06
08/16/11 08:06
Joined: Jul 2000
Posts: 27,986
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 27,986
Frankfurt
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.

Re: Lite-C Compiler, [Re: jcl] #380368
08/16/11 12:59
08/16/11 12:59
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
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.

Re: Lite-C Compiler, [Re: TechMuc] #380480
08/18/11 08:15
08/18/11 08:15
Joined: Jul 2000
Posts: 27,986
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 27,986
Frankfurt
Wenn sich der Call-Beginn ändert, werden wir das entsprechend dokumentieren.


Moderated by  old_bill, Tobias 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1