Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 03:42

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

Advertisement



klassen methode hooking problem

Discussion on klassen methode hooking problem within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
klassen methode hooking problem

hey leute,
ich versuche gerade einen eine klassen methode an eine adresse zu hooken, aber der compiler lässt den PBYTE cast auf die klassen methoden nicht zu :S
hier der code:
Code:
void packet::HookIt(){

	PacketRecv = (int(__stdcall *)(SOCKET, char *, int, int))DetourFunction((PBYTE)(RecvAddr), (PBYTE)MyPacketRecv);//der fehler bei Mypacketrecv
	PacketSendHook = (int(__stdcall *)(BYTE, LPCSTR, ...))DetourFunction((PBYTE)PacketSendHookOffset2, (PBYTE)MyPacketSendHook);//der fehler bei Mypacketsendhook
}
da diese beiden methoden auf die klassen attribute und methoden zugreifen kann ich die nicht staatisch machen, es sei denn ich mache die ganzen sachen global, aber dann wirds hässlig^^
gibt es irgendeine lösung wie ich diesen cast und somit den hook hinkriegen kann?
Viele grüße,
Slade
Slade100 is offline  
Old 12/22/2015, 17:53   #2


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Geht so nicht. Schon alleine wegen der Signatur bzw. Calling Convention. Deine nicht-statischen Memberfunktionen sind thiscalls, die in ecx den thisptr erwarten (über den sie dann auf Datenmember oder virtuelle Funktionen zugreifen). Die Funktion, die send / recv aufruft, ruft die Funktion allerdings als stdcall auf, wobei ecx ("this") unspezifiziert bleibt. Du brauchst eine Art Zwischenfunktion, die entweder eine statische Klassenfunktion ist oder halt zu keiner Klasse gehört und welche dann als Hookfunktion agiert und MyPacketRecv / MyPacketSendHook aufruft (das Objekt müsste es dann durch irgendeine globale / statische Variable bekommen).
Eventuell könnte man auch mit std::bind etwas machen, aber da liegen die Implementationsdetails nicht vor und sind nicht standardisiert.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 12/22/2015, 20:43   #3
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
wow danke dir durch deine antworten lerne ich wirklich immer was dazu
Slade100 is offline  
Old 12/23/2015, 18:19   #4
 
Logtetsch's Avatar
 
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
Quote:
Originally Posted by Slade100 View Post
da diese beiden methoden auf die klassen attribute und methoden zugreifen kann ich die nicht staatisch machen, es sei denn ich mache die ganzen sachen global, aber dann wirds hässlig^^
Slade
Du kannst auch einfach die Methoden als Statische deklarieren und die entsprechende Instanz als Parameter übergeben.

Code:
class MyClass {
private:
     bool attribute_1;
     bool attribute_2;

public:
     static void __stdcall doSomething(MyClass& obj, ...){
          obj.attribute_1 = true;
          obj.attribute_2 = true;
     }
};
Logtetsch is offline  
Thanks
1 User
Old 12/23/2015, 22:16   #5


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Quote:
Originally Posted by Logtetsch View Post
Du kannst auch einfach die Methoden als Statische deklarieren und die entsprechende Instanz als Parameter übergeben.

Code:
class MyClass {
private:
     bool attribute_1;
     bool attribute_2;

public:
     static void __stdcall doSomething(MyClass& obj, ...){
          obj.attribute_1 = true;
          obj.attribute_2 = true;
     }
};
Ergibt im Kontext wenig Sinn, weil die Funktion, die gebraucht wird, ja eine Hookfunktion ist. Entsprechend muss sie die gleiche Signatur haben, wie die Original-Funktion (hier halt send / recv). Immerhin wird die Funktion ja von externen Stellen (bei Gamehacks irgendwelche spielinternen Routinen) aufgerufen und die übergeben mit Sicherheit nicht einfach auf einmal die Objektreferenz, die man da gerne hätte, sondern halten sich halt an die Signatur von recv / send. Gleiches gilt auch für Callbackfunktionen.
Wenn man die Funktion nur selber aufrufen würde, bräuchte man den Workaround auch wieder nicht, weil man dann an der aufrufenden Stelle genauso einen thiscall vom Objekt aufrufen könnte.
Als Lösung könnte man mit std::bind arbeiten um bei einer solchen Funktion dann das erste Argument fest zu binden. Aber dann müsste man an den Funktionspointer vom std::bind-Ergebnis rankommen (was aufgrund der fehlenden standardisierung schon echt doof ist) und wenn das ginge, könnte man auch direkt eine thiscall-Funktion mit dem entsprechenden Objekt binden.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Old 12/23/2015, 22:19   #6
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
erstmal danke für die antwort logtetsch, nur ist das problem das diese funktion die funktion ja von ausserhalb aufgerufen wird und bestimmte parameter erwartet und das obj eh nicht kriegt, naja habe die funktion gestern einfach aus der klasse raus genommen und das objekt global gemacht, die normalen errors waren zwar raus aber da sind irgendwelche lnk 2005 errors aufgekommen xD
muss mal schauen woher die kommen^^
Slade100 is offline  
Old 12/23/2015, 23:41   #7
 
Logtetsch's Avatar
 
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
Ärgerlich, habe mir leider nicht alles durchgelesen! Verstehe leider immer noch nicht ganz das Problem. Was soll die Klasse denn darstellen? Generierst du zur Laufzeit mehrere Instanzen?
Logtetsch is offline  
Old 12/23/2015, 23:58   #8
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
eigentlich nicht xD die klasse dient einfach dazu das es übersichtlich bleibt.Das probelm habe ich aber wie gesagt schon gelöst, naja habe mittlerweile eh ein anderes problem, und zwar habe habe ich ein paar funktionen,welche von verschiedenen klassen und der main benötigt werden, habe diese in eine main.h gesteckt und dann main.h in den klassen included, naja mein problem ist das der compiler meckert(include guard ist drin) z.B.
1>packet.obj : error LNK2005: "void __cdecl SwitchOnOff(bool &)" (?SwitchOnOff@@YAXAA_N@Z) ist bereits in main.obj definiert.
iwas stimmt da doch nicht xD wieso sollte ich die selbe funtkion nicht in 2 verschiedenen cpp dateien benutzen können.
Slade100 is offline  
Old 12/24/2015, 01:35   #9
 
Logtetsch's Avatar
 
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
Liegt dadran, dass du die Funktion mehrfach definierst. Und das liegt wiederum dadran, dass du die Funktion in der main.h definierst, statt zu deklarieren. Das Definieren von Funktionen in Headerdateien würde ich dir streng abraten. Im Notfall kannst du die Funktion auch als inline definieren (Nur unter der Bedingung, dass die Funktion nicht mehr als 10 Zeilen auffasst).

Mit der Deklaration machst du dem Compiler klar, dass es diese Funktion gibt, jedoch nicht, wo die Funktion definiert wird bzw. was diese Funktion eigentlich macht.


Deklaration in der main.h
Code:
void __cdecl SwitchOnOff(bool&);
Definition in der main.cpp
Code:
void __cdecl SwitchOnOff(bool& value)
{ .... }
Logtetsch is offline  
Thanks
1 User
Old 12/24/2015, 03:13   #10
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
danke dir vielmals für die hilfe
Slade100 is offline  
Reply


Similar Threads Similar Threads
Problem mit IDirect3DDevice9 VTable Hooking
03/25/2014 - C/C++ - 3 Replies
Hallo, ich habe hier ein Problem mit der VTable, bei dem ich mir nicht ganz sicher bin, ob ich nicht einfach etwas übersehe. Ich erstelle mit IDirect3D9::CreateDevice() ein IDirect3DDevice9 und initialisiere damit meinen Pointer auf die VTable: m_device = CreateDevice(); m_vtable = *reinterpret_cast<SD3DDeviceVTable **>(m_device); SD3DDeviceVTable ist ein einfaches Struct, in dem die ganzen Memberfunktionen sind:
EasyHook (Easy Injection/Hooking for C# [and C++]) Problem
03/25/2013 - CO2 Programming - 1 Replies
So I'm having an error that says: And here is the EntryPoint class of my .dll (pastebin): FoxxyDefender EntryPoint.cs - Pastebin.com
VTable hooking Problem
07/03/2012 - C/C++ - 9 Replies
Hey, ich habe jetzt mal mit der Funktion von Heavyhacker versucht eine Funktion zu hooken. PBYTE HookVTable(DWORD** VTablePtr, int VTableIndex, PBYTE HookPtr) { DWORD oldProtect; VirtualProtect((void*)((*VTablePtr)+(VTableIndex *sizeof(DWORD))),sizeof(DWORD),PAGE_EXECUTE_READWR ITE,&oldProtect); PBYTE original=((BYTE*)(*VTablePtr)); (*VTablePtr)=(DWORD)HookPtr; VirtualProtect((void*)((*VTablePtr)+(VTableIndex *sizeof(DWORD))),sizeof(DWORD),oldProtect,&old Protect); return original; }
D3D Hooking Problem
03/01/2011 - General Coding - 1 Replies
Alloa, ich habe mir das Tutorial von D3D9 Hooking - Wie code ich D3D Hacks? durchgelesen und dementsprechend auch versucht was eigenes zu konstruieren. Ich habe eine eigene DLL Hook Datei programmiert und sie mit einem fremden Injector verbunden. Klappt bisher prima. Es ist mir gut gelungen, ein Rechteck zu zeichnen und ein bisschen Text darauf abzubilden. Sobald ich mein Spiel starte geht alles wie von Zauberhand. Allerdings ist mir vor kurzem aufgefallen, dass mein "Hook"...
d3d hooking problem
02/12/2011 - WarRock - 2 Replies
hey ich mach grad des d3d hooking tut von purple.d1amond und habe als erstes um zu testen obs geht den code kopiert und versucht zu testen. problem is nur, dass warrock crasht direkt nachdem ich beim patcher auf spiel starten geklickt habe. weis einer, warum es nicht geht? PS die endscene adresse habe ich die richtige reingemacht. code: -->



All times are GMT +1. The time now is 03:42.


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.