VTable hooking Problem

07/01/2012 00:49 Zwawo#1
Hey, ich habe jetzt mal mit der Funktion von Heavyhacker versucht eine Funktion zu hooken.
Code:
PBYTE HookVTable(DWORD** VTablePtr, int VTableIndex, PBYTE HookPtr) 
{
	DWORD oldProtect;
	VirtualProtect((void*)((*VTablePtr)+(VTableIndex*sizeof(DWORD))),sizeof(DWORD),PAGE_EXECUTE_READWRITE,&oldProtect);
	PBYTE original=((BYTE*)(*VTablePtr)[VTableIndex]);
	(*VTablePtr)[VTableIndex]=(DWORD)HookPtr;
	VirtualProtect((void*)((*VTablePtr)+(VTableIndex*sizeof(DWORD))),sizeof(DWORD),oldProtect,&oldProtect);
	return original;
}
In meinem Code so umgesetzt:
Code:
pEndScene = (EndScene_a)HookVTable(&ViTableStart, index, (PBYTE)hkEndScenea);
Die Zeiger der 2 vtable's zeigen anschließend auf meine Funktion, statt auf die original Funktion. Trotzdem wird noch die originalfunktion ausgeführt.
Was habe ich schwerwiegendes übersehen?
07/01/2012 10:16 Dr. Coxxy#2
1. wieso "2 vtables"?
2. vllt wird die vtable garnicht benutzt? CS:S benutzt z.b. nicht die aus der d3d9.dll.
3. index == 42? (bei dx9)
4. vergiss diese funktion und schreib dir selber etwas, was du auch verstehst.

Tipp:
hook eine dx funktion mit einem normalem hook, fang das übergebene objekt ab, in dem ersten dword vom objekt ist (normalerweise - muss nicht) ein pointer auf die vtable des objekts, dann noch einen statischen pointer auf das objekt suchen und du kommst ganz ohne den d3d9 mist aus.
07/01/2012 13:36 MrSm!th#3
und wie willst du ohne die vtable eine andere funktion hooken? Doch wohl nicht etwa mit ner statischen adresse?!
07/01/2012 13:40 Dr. Coxxy#4
Quote:
Originally Posted by MrSm!th View Post
und wie willst du ohne die vtable eine andere funktion hooken? Doch wohl nicht etwa mit ner statischen adresse?!
war das an mich?
nö, ganz normal über nen code patch, 0xe9 zu nem eigenen hook.
adresse von ner funktion kriegste entweder über nen searchpattern von ner vtable ref, direkt auf ne funktion, oder über nen statischen offset zu ner exportierten funktion.
07/01/2012 15:32 Zwawo#5
Ich hatte das ja schon mit nem Detour gemacht, also search pattern auf die Referenz der vtable und darüber halt zur funktion und diese gehooked. Aber ich wollte es halt mal anders machen, meinen Horizont erweitern.
2 vtables weil 2 auf die Funktion gezeigt haben.

Quote:
vllt wird die vtable garnicht benutzt? CS:S benutzt z.b. nicht die aus der d3d9.dll.
Daran wird es wohl liegen.

Zu dem sind Detours ja die leichtesten Hooks und werden somit auch von AC Systemen leicht erkannt.
Soweit ich weiß wird die d3d9.dll zwar nicht von VAC2 gescannt (korrigiert mich wenn ich falsch liege),
trotzdem wird der Detour für spätere Zwecke nicht ausreichen.
07/01/2012 15:42 tnd0#6
dann einfach mal den callstack überprüfen und nachschauen wo er sich die call adresse herzieht. WC3TFT hat eine minorrelease version lang mit einer ganz eigenen vtable gearbeitet, die war dazu auch noch völlig anders aufgebaut. Da musste man auch via callstack mühsam jeden schritt verfolgen um an die funktionen zu kommen, die eigentlich benutzt wurden.
07/01/2012 16:54 Dr. Coxxy#7
ich habe immer noch deine frage beantwortet:
Quote:
hook eine dx funktion mit einem normalem hook, fang das übergebene objekt ab, in dem ersten dword vom objekt ist (normalerweise - muss nicht) ein pointer auf die vtable des objekts, dann noch einen statischen pointer auf das objekt suchen und du kommst ganz ohne den d3d9 mist aus.
der normale hook ist nur einmalig um überhaupt an das objekt heranzukommen, danach hookst du die vtable dieses objektes.
ansonsten kannst du auch mit nem debugger hingehen und gucken, wo CreateDevice aufgerufen wird und wo das objekt gespeichert wird, oder, oder, oder...

wenn du einmal das objekt hast, und eine statischen pointer von diesem objekt hast, kannst du dir immer wieder das objekt holen und dessen vtable hooken.
07/02/2012 11:53 MrSm!th#8
Quote:
Originally Posted by Dr. Coxxy View Post
war das an mich?
nö, ganz normal über nen code patch, 0xe9 zu nem eigenen hook.
adresse von ner funktion kriegste entweder über nen searchpattern von ner vtable ref, direkt auf ne funktion, oder über nen statischen offset zu ner exportierten funktion.
Wie man hookt ist mir klar, ich meinte das Finden der Adresse.
Du meintest ja er solle erst normal detouren, um das Objekt abzufangen, um dann auf die Vtable schließen zu können.
Und ich frage mich, welchen Sinn es hat, dann noch die Vtable abzufangen, wenn man ohnehin schon die Adresse für den ersten Hook über Pattern Search der Vtable gefunden hat (was du ja auch als Möglichkeit aufgelistet hast).
07/02/2012 19:45 Zwawo#9
Wäre es denn eine gute Idee die Adresse von der original Funktion in die gehookte zu ändern also da von wo sie aufgerufen wurde. D.h das Program holt sich ja bevor er die Funktion aufruft die Adresse, verschiebt sie in eax und callt sie dann. Wäre es möglich per Code die Adresse zu ändern? Sollte man dann wenn, dass von der Funktion aus machen oder eine statische Adresse nehmen?
Über Olly funktioniert das Ändern ja.

(Ich glaube das meinte auch tnd0)
07/03/2012 13:44 tnd0#10
das ist an sich eine gute idee, leider weiß das auch jeder spieleentwickler der sich ein kleinwenig um anticheat maßnahmen bemüht.