Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 20:45

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Hilfe]Hooking überschreibt register

Discussion on [Hilfe]Hooking überschreibt register within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
[Hilfe]Hooking überschreibt register

Hey leute,
ich bin gerade dabei einen kleinen PacketLogger zu schreiben und stoße da auf ein Problem. Ich möchte nicht groß drum reden und fange am besten gleich mit meinem Problem an:

Also ich möchte gerne diese Funktion hooken:
Aufruf:
Code:
005DBD68     53                PUSH EBX
005DBD69     56                PUSH ESI
005DBD6A     8BF2              MOV ESI,EDX
005DBD6C     8BD8              MOV EBX,EAX
005DBD6E     EB 04             JMP SHORT NostaleX.005DBD74
005DBD70     EB 05             JMP SHORT NostaleX.005DBD77
005DBD72     3919              CMP DWORD PTR DS:[ECX],EBX
005DBD74     8BD6              MOV EDX,ESI
005DBD76     8BC3              MOV EAX,EBX
005DBD78     E8 E7FDFFFF       CALL NostaleX.005DBB64
Anfang der Funktion:
Code:
005DBB64     55                PUSH EBP                                             ; ENCRYPT PACKET
005DBB65     8BEC              MOV EBP,ESP
005DBB67     6A 00             PUSH 0
005DBB69     6A 00             PUSH 0
005DBB6B     6A 00             PUSH 0
005DBB6D     53                PUSH EBX
005DBB6E     56                PUSH ESI
005DBB6F     57                PUSH EDI
005DBB70     8955 FC           MOV DWORD PTR SS:[EBP-4],EDX
005DBB73     8BD8              MOV EBX,EAX
005DBB75     8B45 FC           MOV EAX,DWORD PTR SS:[EBP-4]
005DBB78     E8 C395E2FF       CALL NostaleX.00405140
005DBB7D     33C0              XOR EAX,EAX
005DBB7F     55                PUSH EBP
005DBB80     68 40BD5D00       PUSH NostaleX.005DBD40
005DBB85     64:FF30           PUSH DWORD PTR FS:[EAX]
005DBB88     64:8920           MOV DWORD PTR FS:[EAX],ESP
005DBB8B     807B 31 00        CMP BYTE PTR DS:[EBX+31],0
so hooke ich:
Code:
typedef void (__fastcall *tSend)(DWORD, char *, DWORD);
tSend oSend;

oSend = (tSend)DetourFunc((PBYTE)SendHookAdr, (PBYTE)SendHook, 
5);

void __fastcall SendHook (DWORD ecx, char *edx, DWORD esp4)
{
	MessageBox(0,edx,0,0);
	oSend(ecx, edx, esp4);
}
Da es aus meiner Sicht eine __fastcall funktion ist und das Paramter in edx übergeben wird lese ich mit meinem 2. Parameter das Packet aus. Die MessageBox gibt mir auch das komplette Packet aus. Das Problem entsteht wenn ich die orginale funktion aufrufen möchte :
005DBB73 8BD8 MOV EBX,EAX -> hier wird das Register EBX verändert und dadurch ensteht her:
CMP BYTE PTR DS:[EBX+31],0
der Crash.


das Problem ist halt das mein hook irgendwie das eax register verändert und nicht sichert.
Kann mir vlt jemand sagen wie ich das verhindern kann.
mfg Lazeboy
Lazeboy is offline  
Old 03/03/2012, 14:55   #2
 
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
1. Register sind physisch auf der CPU. Außer an den Werten der Register wirst du da nichts verändern.

2. Microsoft fastcall nutzt ECX und EDX, nicht EAX.

3. Poste bitte den kompletten Code und ein Disassemble der Funktion während sie gehookt ist, sowie ein Disassemble der SendHook Funktion.
SmackJew is offline  
Old 03/03/2012, 15:36   #3
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
Danke für die schnelle Rückmeldung

also mein kompletter Code:


die Funktion im Client mit Jmp Hook:


die SendHook Funktion:


das ecx und edx genutzt wird weiß ich ja nur wird halt vor dem funktion aufruf eax gesetzt und auf eax habe ich ja keinen zugriff drauf wenn ich keine naked funktion schreibe.
Lazeboy is offline  
Old 03/03/2012, 15:47   #4
 
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
Dein SendHook überschreibt hier

Code:
100116F8    B8 CCCCCCCC     MOV EAX,CCCCCCCC
eax, speichert es aber vorher nicht.

Versuch's mal hiermit:

Code:
void __fastcall SendHook (DWORD ecx, char *edx, DWORD esp4)
{
        __asm pushad
        __asm pushfd
	MessageBox(0,edx,0,0);
        __asm popfd
        __asm popad
	return oSend(ecx, edx, esp4);
}
Generell immer eine gute Idee alle Register und Flags zu speichern und sie bevor du zurück in die originale Funktion gehst wieder vom Stack zu holen.
SmackJew is offline  
Old 03/03/2012, 15:56   #5
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
also da überschreibe ich zwar nur irgendwie gehört das zur Calling Convention denn die beiden push kommen erst danach. Das ist zwar ein problem aber das richtige problem ist eig. das oSend mit einem veränderten paramter eax aufgerufen wird. Habe ich gerade dank dir bemerkt


Code:
100116E0    55              PUSH EBP
100116E1    8BEC            MOV EBP,ESP
100116E3    81EC D8000000   SUB ESP,0D8
100116E9    53              PUSH EBX
100116EA    56              PUSH ESI
100116EB    57              PUSH EDI
100116EC    51              PUSH ECX
100116ED    8DBD 28FFFFFF   LEA EDI,DWORD PTR SS:[EBP-D8]
100116F3    B9 36000000     MOV ECX,36
100116F8    B8 CCCCCCCC     MOV EAX,CCCCCCCC
100116FD    F3:AB           REP STOS DWORD PTR ES:[EDI]
100116FF    59              POP ECX
10011700    8955 EC         MOV DWORD PTR SS:[EBP-14],EDX
10011703    894D F8         MOV DWORD PTR SS:[EBP-8],ECX
10011706    60              PUSHAD
10011707    9C              PUSHFD
10011708    8BF4            MOV ESI,ESP
1001170A    6A 00           PUSH 0
1001170C    6A 00           PUSH 0
1001170E    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
10011711    50              PUSH EAX
10011712    6A 00           PUSH 0
10011714    FF15 B4930110   CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; user32.MessageBoxA
1001171A    3BF4            CMP ESI,ESP
1001171C    E8 6FFAFFFF     CALL NostaleP.10011190
10011721    9D              POPFD
10011722    61              POPAD
10011723    8BF4            MOV ESI,ESP
10011725    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
10011728    50              PUSH EAX
10011729    8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]
1001172C    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]
1001172F    FF15 3C810110   CALL DWORD PTR DS:[1001813C]
10011735    3BF4            CMP ESI,ESP
10011737    E8 54FAFFFF     CALL NostaleP.10011190
1001173C    5F              POP EDI
1001173D    5E              POP ESI
1001173E    5B              POP EBX
1001173F    81C4 D8000000   ADD ESP,0D8
10011745    3BEC            CMP EBP,ESP
10011747    E8 44FAFFFF     CALL NostaleP.10011190
1001174C    8BE5            MOV ESP,EBP
1001174E    5D              POP EBP
1001174F    C2 0400         RETN 4
Code:
10011725    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
10011728    50              PUSH EAX
10011729    8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]
1001172C    8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]
1001172F    FF15 3C810110   CALL DWORD PTR DS:[1001813C]
Lazeboy is offline  
Old 03/03/2012, 16:33   #6
 
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
Quote:
Originally Posted by Lazeboy View Post
also da überschreibe ich zwar nur irgendwie gehört das zur Calling Convention denn die beiden push kommen erst danach. Das ist zwar ein problem aber das richtige problem ist eig. das oSend mit einem veränderten paramter eax aufgerufen wird. Habe ich gerade dank dir bemerkt
Hm, verstehe auch nicht ganz wo der ganze Code in SendHook herkommt. Ich würde das Ding ausziehen und dann sollte da auch nicht viel mehr drin sein als 'ne Calling Convention, dein MB Call und ein jump zurück.
SmackJew is offline  
Thanks
1 User
Old 03/03/2012, 16:50   #7
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
jo wollte ich zwar vermeiden aber führt wohl kein weg dran vorbei danke für die Hilfe läuft jetzt wunderbar
Lazeboy is offline  
Old 03/04/2012, 03:28   #8


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Ansonsten wäre ein Weg in die Compiler Optionen gegangen.
Etwaige Einstellungen wie Optimierung, standardmäßige Calling Conventions und andere Spielereien verfälschen gerne mal den Code.
MrSm!th is offline  
Thanks
1 User
Old 03/04/2012, 12:43   #9
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
wie wärs beim msvc mit __declspec(naked)?
kannst dann komplett kontrollieren wie die funktion aussieht
Tyrar is offline  
Old 03/04/2012, 18:16   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Er sagte doch bereits, dass es als naked funktioniert.
MrSm!th is offline  
Old 03/05/2012, 22:27   #11
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
könntest du mir sagen welchen genauen einstellungen ich verändern muss um jegliche optimierung zu entfernen. Denn ich habe das problem das wenn ich eine Funktion per dll Calle und die dll in embacadero c++ builder erstelle funktioniert das ganze jedoch in Vc++ nicht gehört jetzt nicht ganz zu dieser topic aber wegen jeden problem ne neue topic aufmachen ist auch nicht das wahre

also ich habs mir nochmal angeguckt das problem ist das man in c++ builder AnsiString benutzen kann und das ist nötig ich wüsste aber nichts was man dem AnsiString in visual c++ gleichstellen kann.
Lazeboy is offline  
Old 03/06/2012, 09:26   #12
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Quote:
Also ich habs mir nochmal angeguckt das problem ist das man in c++ builder AnsiString benutzen kann und das ist nötig ich wüsste aber nichts was man dem AnsiString in visual c++ gleichstellen kann.
Da gibts wohl nix, was dem zu 100% entspricht. Musst du entweder selbst nachbaun oder du versuchst es mit std::string
xNopex is offline  
Thanks
1 User
Old 03/06/2012, 13:33   #13
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
Quote:
Originally Posted by xNopex View Post
Da gibts wohl nix, was dem zu 100% entspricht. Musst du entweder selbst nachbaun oder du versuchst es mit std::string
C++ BUILDER -> Funktioniert
Code:
AnsiString tmp = "say test";
			const char *Packet = tmp.c_str();
			DWORD Func = 0x005DBD68;

			__asm
			{
				MOV EDX,Packet
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}

C++ BUILDER -> Funktioniert nicht
Code:
const char *Packet = "say test";
			DWORD Func = 0x005DBD68;

			__asm
			{
				MOV EDX,Packet
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}
Visual C++-> Funktioniert nicht
Code:
string Pack =   "/blabla test";
			char *Packet = (char*)Pack.c_str();

			DWORD Func = 0x005DBD68;

			__asm 
			{
				MOV EDX,Packet
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}
Visual C++ -> Funktioniert nicht
Code:
char *Packet = "/blabla test";

			DWORD Func = 0x005DBD68;

			__asm 
			{
				MOV EDX,Packet
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}
Visual c++ -> verzweiflungs versuch -> funktioniert auch nicht
Code:
char cAsciiStr[1024];
			string Pack =   "/blabla test";
			char *Packet = (char*)Pack.c_str();
			WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)Packet, -1, cAsciiStr, 1024, NULL, NULL);
			DWORD adr = (DWORD)&cAsciiStr;
			

			DWORD Func = 0x005DBD68;

			__asm 
			{
				MOV EDX,adr
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}

Ich hab auch schon versucht in den Projektoptionen: Charset oder c/c++ language umzustellen aber das führt alles nicht zum gewünschten ergebnis.
Lazeboy is offline  
Old 03/06/2012, 15:21   #14
 
link's Avatar
 
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
Soweit ich weiß, besteht ein AnsiString aus jeweils einem Dword für den Referencecounter und die Länge und aus einem null-terminiertem Char-Array.
Eine AnsiString-Variable zeigt allerdings nicht auf solch eine Struktur, sondern direkt auf das Array, wobei die beiden anderen Members über ein negatives Offset angesprochen werden. Heißt es lässt sich wie ein normales Char-Array bzw. wie einen Pointer auf einen null-terminierten String benutzen.

Code:
const char *Packet = "say test";
MOV EDX,Packet
kann schlecht funktionieren, da EDX ' yas' als Wert erhält.

Wieso genau benötigst du denn einen AnsiString? Anscheinend übergibst du doch lediglich einen normalen null-terminierten String. Oder erwartet die Funktion tatsächlich einen AnsiString? Statt des .c_str() würde auch ein mov edx,offset Packet bzw. lea edx,[Packet] reichen.

Edit:
Btw. es gibt keine x86/x64 Calling Convention von MS, die EAX für Parameter verwendet. Von Borland gibt es register, die EAX, EDX und ECX verwendet und standardmäßig in Delphi benutzt wird. Das Pendant dazu in Borland C++ wird wohl fastcall sein.
link is offline  
Thanks
1 User
Old 03/06/2012, 21:00   #15
 
Lazeboy's Avatar
 
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
so wen es interessiert habe jetzt mal nach den unterschieden zwischen AnsiString und char* geguckt.

Code:
int _tmain(int argc, _TCHAR* argv[])
{
	AnsiString a = "/blabla test";
	char *a2 = a.c_str();
	string b = "/blabla test";
	const char *b2 = b.c_str();

	char c[1024] = {0};
	strcpy(c,"/blabla test");

	for(int i = 0; i < a.Length()+10; i++)
	{
		printf("%02X,", (BYTE)a2[i]);
	}

	printf("\n\n");

	for(int i = 0; i < a.Length()+10; i++)
	{
		printf("%02X,", (BYTE)b[i]);
	}

	printf("\n\n");

	for(int i = 0; i < a.Length()+10; i++)
	{
		printf("%02X,", (BYTE)c[i]);
	}

	cin.get();
	return 0;
}

AUSGABE
Code:
2F,62,6C,61,62,6C,61,20,74,65,73,74,00,00,00,00,00,00,00,00,00,00

2F,62,6C,61,62,6C,61,20,74,65,73,74,00,8D,BC,32,0C,00,00,00,0F,00

2F,62,6C,61,62,6C,61,20,74,65,73,74,00,00,00,00,00,00,00,00,00,00
sowohl bei string als auch bei char* oder char[](ohne length) gibts nach der "NULL terminierung" noch irgendwelche sinnlosen werte. Bei AnsiString fällt dies weg und was dem enstpricht ist char[length].

so funktioniert derr code jetzt
Code:
char cAsciiStr[1024] = {0};
			strcpy(cAsciiStr,"/blabla test");
			

			DWORD Func = 0x005DBD68;

			__asm 
			{
				LEA EDX, [cAsciiStr]
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}

EDIT:
habe mich wohl geirrt und die falsche dll injeziert oder so... das problem besteht immer noch und ich weiß ehrlich gesagt nicht mehr weiter und auch nicht wie ich sowas nach programmieren sollte das würde den rahmen von meinem packet logger ein wenig sprengen XD

EDIT2:
ohh man....
schon fast als ob ich hier nen protokoll halte. Ich bin ein wenig verwirrt denn das wiederspricht ja allen Regeln.
das funktioniert:
Code:
char cAsciiStr[1024] = {0};
			string Pack =   "/blabla test";
			char *Packet = (char*)Pack.c_str();
			
			strcpy(cAsciiStr,"/blabla test");
			

			DWORD Func = 0x005DBD68;

			__asm 
			{
				LEA EDX, [cAsciiStr]
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}
das nicht:
Code:
char cAsciiStr[1024] = {0};

			
			strcpy(cAsciiStr,"/blabla test");
			

			DWORD Func = 0x005DBD68;

			__asm 
			{
				LEA EDX, [cAsciiStr]
				MOV EAX,DWORD PTR DS:[0x649AB8]
				MOV EAX,DWORD PTR DS:[EAX]
				CALL [Func]
			}
aber das
Code:
string Pack =   "/blabla test";
char *Packet = (char*)Pack.c_str();
hat doch gar nix mit dem senden zu tun lol
Lazeboy is offline  
Reply


Similar Threads Similar Threads
Register Hilfe pls
09/24/2011 - CrossFire - 1 Replies
Hay Leute habe Da so ein Probelm Das Nervt also habe einen acc aber mein freund hatt sich Registriert und auch Aktiviert in der Email aber da steht Wenn er sich in Crossfire einloggen iwas mit Aviable in der region oder so was :( und bei mir das selbe wenn ich sein acc teste warum? wie kann er sich anmelden
[Cracking & Hooking] Suche Hilfe bei Engine von LC
05/21/2011 - Last Chaos - 13 Replies
Da ich ja nun Anfangen möchte Last Chaos Tools zuschreiben (vorzugsweise mit c# oder c++ oder auch notfallsweise .net) suche ich eine hilfe die mir ggf ein wenig die Last Chaos Engine näher bringt auf gut deutsch gesagt die materie der Engine. Gefragt sind leute wie Falo, KD, Wursti und ggf andere. Da die Aktive & Erfahrene Scripter/Progger ein wenig die Lust verloren haben bzw auch keine Zeit mehr haben möchte ich gerne anbieten sofern wie möglich die Aufgaben zu übernehmen zumindestens...
[HILFE]HP Register...
06/30/2010 - Metin2 Private Server - 1 Replies
Hallo, ich habe eine Homepage aber indiese will ich mein Register Script rein machen ... aber es geht nicht so ganz.. kann mir einer Helfen via Teamviewer? lg Marci
SW-sro register hilfe!!!
02/19/2010 - SRO Private Server - 1 Replies
könnte mir jemand ein kleines tut zeigen. . kann mich auf der seite nicht registrieren . ist voll schwer!
Ressourcen Tool überschreibt andere Datein.
12/31/2009 - S4 League - 6 Replies
Ich hab seit kurzem erst, dass das Ressourcen Tool anderen Datein überschreibt, als die die er sollte. z.B: Ich expotiere die Datei default_item.x4 und änder dort die Werte. Nun impotiere ich die Datei wieder. Jetzt expotiere ich die Item_info.x4 Datei und veränder etwas, speicher sie ab und impotiere sie. Wenn ich nun S4 starte, bleibt es beim Laden hängen und wird beendet. Nun öffne ich wieder das Ressourcen Tool und expotiere z.B default_item.x4 und öffne sie.



All times are GMT +1. The time now is 20:47.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.