Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 14:01

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

Advertisement



VTable Problem. Lösung gesucht.

Discussion on VTable Problem. Lösung gesucht. within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Crack-wtf's Avatar
 
elite*gold: 256
Join Date: Feb 2012
Posts: 1,370
Received Thanks: 2,917
VTable Problem. Lösung gesucht.

Ich habe ein "Problem" und brauche eine saubere Lösung.
Ich habe eine VTable eines Spiels und möchte nun:

1. Die VTable kopieren und das Spiel auf meine VTable zeigen lassen.
2. Bestimmte funktionen mit eigenen ersetzen.
3. In den veränderten funktionen die echte funktion callen können.

Wie regel ich das nun sauber?
Im moment mache ich es SEEHR unsauber so:

Char array in größe der VTable bereitstellen.
Memcpy auf mein Char array, mit der echten VTable.
Offsets manuell angeben und addresse mit der meiner funktion ersetzen.
Typedef der gewählten funktion erstellen, und die addresse der echten funktion nutzen um die echte zu callen.

Ich denke mal das Stichwort lautet "Wrapper", aber wie das funktioniert und ob das das ich was ich brauche weiß ich nicht.

Hoffe jemand hier hat eine gute idee.
Crack-wtf is offline  
Old 10/09/2013, 22:58   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
benutz die klasse hier oder lass dich davon inspirieren:
Dr. Coxxy is offline  
Thanks
1 User
Old 10/09/2013, 23:01   #3
 
Crack-wtf's Avatar
 
elite*gold: 256
Join Date: Feb 2012
Posts: 1,370
Received Thanks: 2,917
Edit: Ok leider für mein vorhaben nicht zu gebrauchen
1. Zuviel kram das ich nicht brauche. (Source zugemüllt und anfällig für Patternscans.)
2. Keine Möglichkeit gegeben die echte funktion zu callen.
Crack-wtf is offline  
Old 10/10/2013, 01:06   #4
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Es gibt das Problem, dass Compiler versuchen, den tatsächlichen Typ eines Objekts zu ermitteln so den Umweg über die Tabelle virtueller Methoden zu vermeiden.

Prinzipiell lässt sich eine Methode über Methodenzeiger standardkonform so aufrufen:
Code:
#include <iostream>
#include <functional>

int main () {
	typedef std::multiplies <int> class_type;
	class_type m;
	typedef decltype (class_type::operator ()) method_type;
	auto method (& class_type::operator ());		// Kopierkonstruktor
	auto this_ptr (& m);
	int i = std::mem_fn (method) (this_ptr, 2, 3);
	std::cout << i << '\n';
	std::cin.get ();
}
Jetzt musst du noch die entsprechende Klasse mit virtuellen Methoden soweit nachstellen, damit der Compiler dir die Arbeit mit der Tabelle virtueller Funktionen abnimmt, und eine Zahl in einen Methodenzeiger konvertieren. Für letzteres bieten sich Suchmaschine und reinterpret_cast<method_type*> an.
Der letzte Schritt wäre dann, die Orginaltabelle umzuschreiben.

Da böte sich eine passende TMP-Bibliothek wirklich an, vielleicht mit Wrapper-Klasse?
Tasiro is offline  
Old 10/10/2013, 01:11   #5
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by Crack-wtf View Post
Edit: Ok leider für mein vorhaben nicht zu gebrauchen
1. Zuviel kram das ich nicht brauche. (Source zugemüllt und anfällig für Patternscans.)
2. Keine Möglichkeit gegeben die echte funktion zu callen.
1. Deswegen sagte ich, du kannst dich davon inspirieren lassen und es selber nachbauen, hab ich auch, bzw. schon bevor ichs kannte.
2. doch, soweit ich weiß schon, zwar noch nie benutzt das teil, aber in dem thread steht:
Quote:
template< typename Fn > Fn VMTManager::GetMethod( size_t index ) const;
Get the original function. I highly suggest this over unhooking.
Use a function prototype for the template argument to make it very easy to call this function. Example syntax: hook.GetMethod<bool (__thiscall*)( void*, int )>( 12 )( inst, arg );
Dr. Coxxy is offline  
Old 10/10/2013, 03:25   #6
 
Raz9r's Avatar
 
elite*gold: 297
Join Date: Dec 2010
Posts: 1,129
Received Thanks: 1,687
Ich benutze dafür immer std::tuple. Da das allerdings meistens so implementiert ist, dass im Speicher die Objekte in umgekehrter Reihenfolge stehen, muss man die Reihenfolge meistens umkehren (in VS2013 RC ist das so). Dann kann man mit memcpy in das reverse_tuple (s. unten) kopieren.

Code:
namespace detail {
	template <typename, typename>
	struct append_to_type_seq { };

	template <typename T, typename... Ts>
	struct append_to_type_seq<T, std::tuple<Ts...>> {
		using type = std::tuple<Ts..., T>;
	};

	template <typename... Ts>
	struct revert_type_seq {
		using type = std::tuple<>;
	};

	template <typename T, typename... Ts>
	struct revert_type_seq<T, Ts...> {
		using type = typename append_to_type_seq<T, typename revert_type_seq<Ts...>::type>::type;
	};


}

template <typename... Ts>
using reverse_tuple = typename detail::revert_type_seq<Ts...>::type;
Beispielsanwendung:
Code:
// VMT für my_class
using my_class_vmt = reverse_tuple<
/*00*/ void (__stdcall *)(void *),
/*01*/ int (__thiscall *)(my_class *, double)
>;

// vtable kopieren (geht natürlich auch in die andere Richtung)
my_class_vmt vmt;
memcpy(&vmt, vptr, sizeof(vmt));

// einzelnen eintrag modifizieren:
auto pvmt = reinterpret_cast<my_class_vmt *>(vptr);
std::get<Index>(*pvmt) = some_other_function_pointer;
Ist IMHO eine flexible Lösung des Problems.
Raz9r is offline  
Old 10/10/2013, 03:53   #7
 
Crack-wtf's Avatar
 
elite*gold: 256
Join Date: Feb 2012
Posts: 1,370
Received Thanks: 2,917
Quote:
Originally Posted by Raz9r View Post
Ich benutze dafür immer std::tuple. Da das allerdings meistens so implementiert ist, dass im Speicher die Objekte in umgekehrter Reihenfolge stehen, muss man die Reihenfolge meistens umkehren (in VS2013 RC ist das so). Dann kann man mit memcpy in das reverse_tuple (s. unten) kopieren.

Code:
namespace detail {
	template <typename, typename>
	struct append_to_type_seq { };

	template <typename T, typename... Ts>
	struct append_to_type_seq<T, std::tuple<Ts...>> {
		using type = std::tuple<Ts..., T>;
	};

	template <typename... Ts>
	struct revert_type_seq {
		using type = std::tuple<>;
	};

	template <typename T, typename... Ts>
	struct revert_type_seq<T, Ts...> {
		using type = typename append_to_type_seq<T, typename revert_type_seq<Ts...>::type>::type;
	};


}

template <typename... Ts>
using reverse_tuple = typename detail::revert_type_seq<Ts...>::type;
Beispielsanwendung:
Code:
// VMT für my_class
using my_class_vmt = reverse_tuple<
/*00*/ void (__stdcall *)(void *),
/*01*/ int (__thiscall *)(my_class *, double)
>;

// vtable kopieren (geht natürlich auch in die andere Richtung)
my_class_vmt vmt;
memcpy(&vmt, vptr, sizeof(vmt));

// einzelnen eintrag modifizieren:
auto pvmt = reinterpret_cast<my_class_vmt *>(vptr);
std::get<Index>(*pvmt) = some_other_function_pointer;
Ist IMHO eine flexible Lösung des Problems.
Ok das muss ich mir noch paarmal ansehen.
Crack-wtf is offline  
Reply


Similar Threads Similar Threads
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; }
[LÖSUNG]Id Manager 1.0 Problem GER [LÖSUNG]
12/20/2011 - S4 League Hacks, Bots, Cheats & Exploits - 18 Replies
Hallo leute. Hier kommt ein tutorial auf deutsch zum Id manager 1.0 von Neku, http://www.elitepvpers.com/forum/s4-league-hacks- bots-cheats-exploits/1396636-release-id-manager-1- 0-a.html Also . ich habe lange zeit versucht zu checken waas der neku geschrieben hat. Bin niccht der beste in engllish. Fangen wir mal an.
Lösung zum Problem für MilianLZ, (Hänger nach Teleport -34444 Gold)Hier die Lösung
05/29/2011 - Dragonica Private Server - 14 Replies
Hallo, da mehrere Leute diesesn Fehler haben habe ich hier mal ein neuen Thread gemacht der das Problem Lösen sollte. Du hast Recht es Liegt an deiner Version. Hier habe ich mal denn Link für die Neuste ( Für alle die das Problem wie Russia1996 haben.) ftp://61.160.207.131/Gameflier0.2.43.rar Da der Download über 4 Std dauern kann, habe ich hier ein Programm für euch der das Schneller macht nämlich Xunlei Thunder (Chinesisch) http://dl.xunlei.com/wxl.html Wenn ihr es Installiert...



All times are GMT +2. The time now is 14:01.


Powered by vBulletin®
Copyright ©2000 - 2024, 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 ©2024 elitepvpers All Rights Reserved.