Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 22:54

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

Advertisement



[C++]Detour - Register Adressen

Discussion on [C++]Detour - Register Adressen within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,832
Received Thanks: 4,152
[C++]Detour - Register Adressen

Hallo,
und zwar möchte ich für ein Spiel einen Packet Logger schreiben.
Jedenfalls hab ich nun ein Problem.

Die Werte werden vor dem Aufruf in's Register geschrieben. (ganz normal eben)
Dann greift meine Funktion per detour ein und überschreibt natürlich jetzt wieder den kompletten Register.
Jetzt springt die Funktion wieder zur Ur-Funktion, allerdings mit den falschen Werten im Register. (D.h. -> Crash).

So, jetzt hab ich versucht bevor meine Funktion aufgerufen wird per inline asm die Register Werte in eine Codecave zu schreiben und nach dem meine Funktion ausgeführt wurde (also vor dem jump zur Ur-Funktion) das ganze wieder per inline asm reinzuschreiben.

Gibt es keine einfacherere Lösung? (Die Werte haben keinen Basepointer, schon versucht... :/ )
Vorallem crasht der Scheiss und klappt noch nicht so ganz (Register Werte bringens zum crashen - habs schon im debugger angeschaut)

Totaler Käse...
Elektrochemie is offline  
Old 08/08/2010, 13:39   #2
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
Am Anfang des Detours:

pushad
pushfd

Und am Ende:

popfd
popad

Das sichert die Register und Flags auf dem Stack und lädt sie am Ende wieder zurück.
ms​ is offline  
Old 08/08/2010, 13:39   #3
 
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
Push die register am anfahng deiner funktion auf den stack und Am ende deiner funktion holst du sie wieder runter.
Akorn is offline  
Old 08/08/2010, 16:50   #4
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,832
Received Thanks: 4,152
Hmm irgendwie will es nicht klappen...

Hier mal den Anfang meiner Funktion:

Code:
005A34D4  /$  55            PUSH EBP
005A34D5  |.  8BEC          MOV EBP,ESP
005A34D7  |.  83C4 F8       ADD ESP,-8
005A34DA  |.  53            PUSH EBX
005A34DB  |.  56            PUSH ESI
005A34DC  |.  57            PUSH EDI
005A34DD  |.  33C9          XOR ECX,ECX
005A34DF  |.  894D F8       MOV DWORD PTR SS:[LOCAL.2],ECX
005A34E2  |.  8955 FC       MOV DWORD PTR SS:[LOCAL.1],EDX
005A34E5  |.  8BD8          MOV EBX,EAX
005A34E7  |.  8B45 FC       MOV EAX,DWORD PTR SS:[LOCAL.1]
005A34EA  |.  E8 3D1CE6FF   CALL 0040512C
Dann hier mein detour Aufruf

Code:
DetourFunc( ( BYTE* )0x005A34D4, ( BYTE* )&MyFunction, 14);
(14 bytes bis nach dem ersten MOV?)

Und noch die Detour Func

Code:
bool DetourFunc( BYTE* oldFunc, BYTE* newFunc, DWORD len )
{
	BYTE* newMem4base = NULL;
	DWORD dwOld;

	newMem4base = ( BYTE* )malloc( 5+len );

	if( newMem4base == NULL )
		return false;

	for( DWORD i = 0; i < ( len+5 ); i++ )
		newMem4base[i] = 0x90;

	VirtualProtect( oldFunc, len, PAGE_READWRITE, &dwOld );

	memcpy( newMem4base, oldFunc, len );

	//pushad
	oldFunc[0] = 0x60;

	//pushfd
	oldFunc[1] = 0x9C;

	//call
	oldFunc[2] = 0xE8;
	*( DWORD* )( oldFunc+0x03 ) = DWORD( newFunc-oldFunc-5 );

	//popfd
	oldFunc[7] = 0x9D;

	//popad
	oldFunc[8] = 0x61;
	//jump
	oldFunc[9] = 0xE9;
	*( DWORD* )( oldFunc+0x0A ) = DWORD( newMem4base-( oldFunc+0x5 )-5 );
	newMem4base += len;
	newMem4base[0] = 0xE9;
	*( DWORD* )( newMem4base+0x01 ) = DWORD( ( oldFunc+10 )-newMem4base-5 );

	for( DWORD i = 14; i <len; i++ )
		oldFunc[i] = 0x90;

	return true;
}
So, das Problem is nun er ersetzt die ersten 14 bytes dann durch

pushad
pushfd
<CALL Meine Funktion>
popfd
popad
<JMP Ur Funktion>

Soweit so gut. Nur ist der Call und der JMP leider totaler Mist.
Sieht zufällig jemand warum?
Elektrochemie is offline  
Old 08/08/2010, 17:26   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Problem ist nur bei pushad und popad, dass man dann nicht mehr richtig auf die parameter zugreifen kann, wenn es sich nicht gerade um ne __stdcall Funktion handelt
MrSm!th is offline  
Old 08/08/2010, 20:07   #6
 
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
Was soll das denn werden wenn's fertig ist? Du schreibst das pushad etc. in die Funktion die du detouren willst. Auch verstehe ich dein Problem nicht ganz, wenn du in deine Funktion callst/jumpst verändern sich die Register überhaupt nicht (von der Return Adresse auf dem Stack beim Call mal abgesehen).

Wie soll dein Detour denn Register überschreiben?
SmackJew is offline  
Old 08/08/2010, 21:30   #7

 
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
Mach den detour ganz normal das heisst, einfach nur ein
Jump zu deiner Funktion. In deiner Funktion machst du dann als
erstes pushad und pushfd. Wenn du dann fertig bist,
popfd und popad und dann der Sprung zurück.
wurstbrot123 is offline  
Old 08/10/2010, 21:56   #8
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,832
Received Thanks: 4,152
Quote:
Originally Posted by wurstbrot123 View Post
Mach den detour ganz normal das heisst, einfach nur ein
Jump zu deiner Funktion. In deiner Funktion machst du dann als
erstes pushad und pushfd. Wenn du dann fertig bist,
popfd und popad und dann der Sprung zurück.
Das funktioniert.
Aber sobald ich irgendetwas richtung c++ in meine funktion mach, funktionierts nichtmehr.
Elektrochemie is offline  
Old 08/10/2010, 22:27   #9
 
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
Leute, wenn ihr auch nur in irgendeiner Form Hilfe erwartet, postet Code. Keiner kann hier hellsehen.
SmackJew is offline  
Old 08/10/2010, 23:01   #10
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
Quote:
Originally Posted by Elektrochemie View Post
Das funktioniert.
Aber sobald ich irgendetwas richtung c++ in meine funktion mach, funktionierts nichtmehr.
Das dürfte daran liegen, dass pushad und pushfd wie Smith schon gesagt hat den Stack "durcheinanderbringen", also dass die Parameter sich nicht da im Stack befinden wo sie erwartet werden. Außerdem solltest du ESP in EBP laden, damit lokale Variablen benutzt werden können.
ms​ is offline  
Old 08/11/2010, 07:13   #11

 
elite*gold: 150
Join Date: Apr 2007
Posts: 2,394
Received Thanks: 6,644
Desweiteren würde ich dir empfehlen bei solchen Problemen einen Debugger
wie Olly zu benutzen und das ganze einfach mal zu steppen um zu sehen was da falsch läuft.
wurstbrot123 is offline  
Old 08/11/2010, 21:55   #12
 
elite*gold: 0
Join Date: Apr 2006
Posts: 164
Received Thanks: 210
You could also use something like this:
jM3 is offline  
Reply


Similar Threads Similar Threads
ip adressen
07/01/2010 - WarRock - 14 Replies
hi ich suche mal ein paar ip adressen also wen ihr welche kennt nennt sie mir bitte
[HELP] Detour connections Client 5250.
06/29/2010 - CO2 Private Server - 18 Replies
Okay, so I want the client to connect to any IP I want. I can't edit the server.dat, it's encrypted. (Do not send me DatCryptor, I know this isn't working.) I've tried Nullable's ConquerLoader as well, but it simply freezes the client, it's very strange. So does anyone have a solution? Its Client patch 5250.
Adressen?
05/05/2010 - S4 League - 6 Replies
Kann mir einer die derzeitigen adressen von: -Dmg(Critical) -PushBack -FumbiSize -CaracterSize -CutSpeed Wen ihr eine oder mehrere adrssen habt bitte an mich per pn(plz) Ich danke schon mal im vorhaus.
[ C++ / Reversing | Tutorial ] Detour + Code Cave mit WPM
01/03/2010 - Coding Tutorials - 4 Replies
Moin leute, habe hier ein kleines Tutorial geschrieben wie man Funktionen auf seinen eigenen Code umleitet mit WriteProcessMemory. Ihr solltet jedoch schon wissen wie man WriteProcessMemory verwendet. Als Beispiel habe ich das Spiel Counterstrike genommen und Whitewalls gemacht. Das Tutorial ist NICHT dazu da um zu zeigen wie man Hacks schreibt und wie diese Funktionieren. Programme die benutzt werden: OllyDBG Credits für den White Walls code: b2k5
adressen
12/11/2007 - WarRock - 1 Replies
so hab ma die addies gefunden: o Recoil: 00AE4A70 (freeze at 0) No Spread: 00AE4A68 (Freeze at 0) Stamina: 008E2AFC (freeze at 1120403456) Instant Spawn: 00D1A110 and 0103012C (freeze both to 0) Scope: 00AE4A26 (set to 0)



All times are GMT +1. The time now is 22:55.


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.