|
You last visited: Today at 03:42
Advertisement
klassen methode hooking problem
Discussion on klassen methode hooking problem within the C/C++ forum part of the Coders Den category.
12/22/2015, 17:34
|
#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
|
|
|
12/22/2015, 17:53
|
#2
|
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
|
|
|
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
|
|
|
12/23/2015, 18:19
|
#4
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
Quote:
Originally Posted by Slade100
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;
}
};
|
|
|
12/23/2015, 22:16
|
#5
|
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
|
Quote:
Originally Posted by Logtetsch
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
|
|
|
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^^
|
|
|
12/23/2015, 23:41
|
#7
|
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?
|
|
|
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.
|
|
|
12/24/2015, 01:35
|
#9
|
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)
{ .... }
|
|
|
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
|
|
|
 |
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.
|
|