d3d hook extern

08/29/2011 17:03 bammes#1
tag,

weiß einer von euch, wie man die endscenefunction eines anderen programms hookt?
also ohne benutzung DLLs.


MFG Dominik
08/29/2011 17:33 ms​#2
Mit OpenProcess Handle des Prozesses finden, mit VirtualAllocEx genug Speicher für deine Detourfunktion reservieren, mit WriteProcessMemory die Funktion reinkopieren, Adresse von EndScene rausfinden, mit WriteProcessMemory EndScene auf die Adresse deiner Funktion (wurde von VirtualAllocEx zurückgegeben) detouren, fertig. ;O
08/29/2011 18:13 bammes#3
haha lol dacht es wird jetzt ewig schwer
thx
08/29/2011 21:51 SmackJew#4
Quote:
Originally Posted by bammes View Post
haha lol dacht es wird jetzt ewig schwer
thx
Ist dem Injecten einer .dll sehr ähnlich. Nicht wirklich komplizierter.
08/30/2011 01:32 bammes#5
ok is für mich wohl doch bissle schwer.

hab den prozess (hProcess) und will jetzt den speicher reservieren.

lpBaseAdress = VirtualAllocEx(hProcess, NULL, NULL, MEM_LARGE_PAGES, PAGE_EXECUTE_READWRITE);

durch msdn is mir aber nicht ganz klar geworden, wofür parameter 2u.3 stehen.

und mit writeprocessmemory hab ich bis jetzt nur variabel geändert. wie kann ich ne funktion einfügen?
08/30/2011 04:24 link#6
Extern zu hooken geht nicht, du musst schon im Speicherbereich sein.
Wie Metin2Spieler97 bereits geschrieben hat, musst du dafür halt deine Funktion in den anderen Prozess reinbringen und dann über Read-/WriteProcessMemory hooken, was sich allerdings nur lohnt, wenn der Hook nicht zu komplex ist, andererseits würde man dann nämlich besser eine Dll benutzen

Ich kann dir später mal einen kleinen Beispielcode schreiben, wobei es für dich wohl am einfachsten wäre, einfach eine Dll zu schreiben und die Detours Library zu benutzen.
Nämlich selbst, wenn du den Code des Zielprozesses über WriteProcessMemory praktisch von außen bearbeitest, lässt sich die Veränderung wie auch bei einer injizierten Dll, die einen Hook installiert, vom Zielprozess erkennen, falls es dir um so etwas gehen sollte.

Zu VirtualAllocEx:
"If lpAddress is NULL, the function determines where to allocate the region."
also einfach Null verwenden, irgendwo alloziieren lassen und dann über den Rückgabewert den alloziierten Speicher ansprechen.
dwSize ist die Anzahl der Bytes, die alloziiert werden sollen, sprich die Größe deiner Funktion, die du über die Subtraktion von Labels herausfinden kannst (teilweise inakurrat wegen Padding, ob 10 Bytes mehr oder weniger macht aber eigentlich keinen Unterschied)

Code:
int x()
{
  int a=2,b=3;
  return a*b;
}

__declspec(naked) void y()
{
}

int sizeofx=@y-@x
irgendwie so
08/30/2011 05:51 bammes#7
thx eine gute beschreibung meine fragen :-)

Ich habe vor trainer für games zu machen mit nem d3d menü (auch für multiplayergames). Dann ist es glaub ich echt sinnvoll, wenn das zielprogramm diesen eingriff net bemerkt.

wenn es dir keinen zu großen aufwand macht, werde ich mich über einen beispielcode freuen (mit erklärungskommentaren).
08/30/2011 06:07 link#8
Quote:
Ich habe vor trainer für games zu machen mit nem d3d menü (auch für multiplayergames). Dann ist es glaub ich echt sinnvoll, wenn das zielprogramm diesen eingriff net bemerkt.
Quote:
Nämlich selbst wenn du den Code des Zielprozesses über WriteProcessMemory praktisch von außen bearbeitest, lässt sich die Veränderung wie auch bei einer injizierten Dll, die einen Hook installiert, vom Zielprozess erkennen, falls es dir um so etwas gehen sollte.
Joa, aber ich meinte ja gerade, dass es keinen Unterschied macht, ob du intern über eine Dll hookst oder extern via WriteProcessMemory, wenn die Art zu Hooken die gleiche ist.
Und ein Hack inkl. D3D Menü.. von außen zu hooken macht eigentlich nur Sinn, wenn du ohne viel Drumherum 'nen kleinen Codecave in den Zielprozess bringen willst
Ein ganzer Hack wäre da viel zu komplex für..
Dafür müsstest du schon eine Dll benutzen und dich dann darum bemühen, deine Hooks vor dem Spiel zu verbergen, z.B. durch verschiedene Arten zu hooken (VTable, HWBPs, Page Faults) oder indem den Anti-Cheat Code umgehst/überschreibst