bin gerade dabei ein etwas älteres Spiel was DirectDraw (dx7) benutzt zu Hooken..Da ich mich mit DirectDraw nicht gut auskenne und nicht wie bei dx9 wüsste wie ich an eine EndScene käme versuche ich die Blt Funktion zu detouren und dort das BackSurface abzugreifen, welches schließlich auf das FrontSurface gezeichnet werden müsste.. (falls ich Unrecht habe bitte korrigieren)
Um nun an die Blt Methode zu gelangen, besorg ich mir zunächst das DirectDraw7-Interface.
Anschließend über die CreateSurface Methode das DirectDrawSurface7-Interface und damit auch die Blt Funktion (hier):
Code:
HRESULT WINAPI hkCreateSurface(LPDIRECTDRAW7 poi, PVOID self, IUnknown** directDrawSurface, IUnknown FAR * unkOuter)
{
add_log("Create Surface Methode wurde aufgerufen");
HRESULT result = pCreateSurface(poi, self, directDrawSurface, unkOuter);
IUnknown* dxSurfaceInterface;
if ( !result )
{
if (!SetCooperativeLevelNext || !CreateDevice7Next)
{
if (!(*directDrawSurface)->QueryInterface(IID_IDirectDrawSurface7, (PVOID*) &dxSurfaceInterface))
{
int i = 5;
add_log("BltFunction( %i InterfaceMethod) : %x",i,GetInterfaceMethod(dxSurfaceInterface, i));
pBlt = (Blt_t) DetourFunc((PBYTE)GetInterfaceMethod(dxSurfaceInterface, i), (PBYTE)hkBlt, 10);
dxSurfaceInterface->Release();
}
}
}
add_log("Got out of here!");
return result;
}
Klappt alles wunderbar bis hierhin.
GetInterfaceMethod(dxSurfaceInterface, i)
gibt mir auch nen wunderschönen Pointer auf die vermeintliche Blt-Function, allerdings stürzt das Spiel beim Aufrufen der originalen Blt-Function ab und wirft mir ne Access-Violation vor die Füße. :/
Verwundert mich ziemlich, da ich im Prinzip genau wie bei der CreateSurface-Methode vorgegangen bin..
Hier nochmal ein paar Code-Schnippsel zur Blt-Function:
Würde mich freuen wenn jemand mir helfen könnte, oder Ideen hat.
Byteanzahl die beim detouren gesaved werden sollte stimmen.
Liege ich vielleicht Falsch bei der Annahme, dass die Blt-Methode sich an Stelle 5 im Interface befindet? Laut "DDraw.h" müsste ich richtig liegen..
grundsätzlich sehe ich da keinen fehler.
die 3 möglichkeiten die ich da in betracht ziehe sind:
1) falscher vtable index
2) funktion wird falsch gehookt (was ich nicht glaube)
3) parameter fail?
was vtable hooks angeht, verweise ich gerne auf methode -> der funktions pointer wird direkt in der vtable umgeschrieben, wodurch nur ein pointer zur alten funktion zu speichern ist (werden also garantiert keine instructions zerhackt)
allerdings hab ich bisher nicht viel mit dx7 gemacht
1) Vtable index muss wie gesagt laut header richtig sein..
2) glaube ich auch nicht.. sonst dürften die anderen Funktionen eigtl auch nicht Funktionieren..
3) würde ich auch am ehesten denken, aber ich weiß einfach nicht was falsch sein könnte.. habe auch schon verschiedenes ausprobiert..
Was mir merkwürdig erscheint dass sich mir kein gewohnter Vtable offenbart wenn ich die xrefs zurückverfolge sondern dies:
Beschäftige mich noch nicht lange mit dem Thema.. ist das richtig? wenn ich auf die dword Adresse klicke sieht das ganze schon eher aus wie ein vtable aber immernoch nich so wie ich es aus den Tutorials kenne.. liegt das daran dass ich eine Objekt::Methode hooke?
seh jetzt so auch nichts, hab mit directdraw aber auch noch nix gemacht.
versuch mal mit nem statischen offset zur exported function.
DirectDrawCreate ist bei mir @ 0x7102859D, Blt @ 0x7106B0E1, offset ist also +0x42B44.
holst dir mit GetProcAddress die adresse von DirectDrawCreate, addierst 0x42B44 rauf und hast die adresse von Blt.
ist dann aber dll spezifisch, wenn jemand ne andere dll version hat gehts bei ihm nicht, aber die funktion wird ja im code referenziert, solltest also nen pattern machen können - extra für die funktion...
Wenn ich mit deinem Offset die Adresse berechne stürzt er direkt ab.. IDA sagt dass er erst gar nicht an die berechnete Adresse springen kann.. Merkwürdig.
Darf ich fragen wie du mal eben an deine Blt Adresse gekommen bist? Wenn ich im IDA bei den Funktionen suche findet der nichts.. deswegen bin ich ja erst den oben beschriebenen Umweg gegangen.. :/
ida->functions->string search...
hab ich aber schon mehrmals gehört, dass bei anderen nicht die funktionsnamen gezeigt werden, weiß ehrlich gesagt nicht, woran das liegt.
ka. woher der die bei mir holt.
EDIT:
hier haste nochn screen von der funktion, kannst ja mal selber in ida/olly gucken ob du die so findest:
EDIT2:
Quote:
Wenn ich mit deinem Offset die Adresse berechne stürzt er direkt ab.. IDA sagt dass er erst gar nicht an die berechnete Adresse springen kann.. Merkwürdig.
Mensch das ist echt merkwürdig.. Vorallem dass er mit deinem Offset bei mir nichts anfangen will..
Edit: K. Mach ich
Die Funktion ist gleich. (was mich beruhigt =) ) Lediglich der letzte compare und jump Befehl fehlt bei mir.
Vielleicht haben wir unterschiedliche Versionen.. wie ich sehe hast du auch Vista. Ich hab XP.. das würde dann auch das mit dem Offset erklären.
Er lädt ja auch ständig Informationen aus ner DataBase.. Meine Theorie wäre, dass er für deine dll Version einfach mehr Informationen in der Database hat.. Aber wayne.
Zudem hab ich mal STRG + F5 gedrückt spuckt jetzt auf einmal mehr Parameterinformationen aus was mir auch bestätigt dass ich die Blt Methode erwischt habe..
Sieht jetzt so aus :O
aber findet sich ja eigtl alles wieder von meinen Parametern her.. hilft mir also auch nicht weiter :/
Edit2: Nunja aber schonmal vielen dank Coxxy. Jetzt weiß ich wenigstens dass ich die richtige Adresse hab. Muss jetzt erstmal ne Mütze schlaf nehmen. Gn8
wenn du die funktion jetzt hast, kannste dir doch den statischen offset selber ausrechnen.
einfach add der blt funktion - add der create funktion.
dann haste nen offset der bei dir gehen sollte.
(hab btw win7 64 bit. )
EDIT:
kannst ja auch mal in olly/ce gucken ob sich dein hook korrekt reinsetzt.
ansonsten kann ich empfehlen zu debugging zwecken in der gehookten funktion ganz am anfang zu loggen, ob die überhaupt gecalled wird -> wenn nicht, dann ist der fehler garantiert der hook. so findet man das ganze meiner meinung nach leichter heraus als direkt mit olly drüber zu schauen, die parameter könnte man evtl. auch mit loggen um dann zu schauen, ob die pointer überhaupt valide sind
Account Hooking 03/30/2010 - AutoIt - 4 Replies Hi,
I would like to know how to hook an account with my bot,
Example i play conquer online.I open my bot and it show my char name and i click hook,and then bot is connected to my account,how to hook the bot to the character,
Thank you
C++ D3D Hooking 08/24/2009 - C/C++ - 12 Replies Hallo zusammen,
ich stehe gerade vor folgendem Problem:
ich habe eine DLL und einen Loader gecoded, jedoch will ich anstelle des Loader einen Injecter haben, sprich: das spiel, in das injected werden soll, soll schon laufen. Natürlich hab ich das ganze schon probiert, jedoch werden die D3D-funktionen nicht wirklich gehookt, da die DLL auf ein Direct3DCreate9 wartet. Da diese Funktion aber wahrscheinlich direkt beim Starten des "Opfer-Spiels" ausgeführt wird, werden deswegen die anderen...
with what program can I save a picture on (DirectDraw Surface-afbeelding) 04/17/2009 - Conquer Online 2 - 2 Replies can someone help me ? I need to save my picture in (mapitemicon), but I dont have any program that can save it in this type: DirectDraw Surface-afbeelding.
If someone knows a program that can save it on that type pls tell me.. or can you do it for me. Here are the pictures.
thanks:handsdown:
Quick DirectDraw Question 09/08/2005 - General Coding - 1 Replies does anyone know wich function directdraw uses to do alot of work with text?