Frage an Profis über Hooken

06/16/2013 01:48 Terrat#1
Deleted✔
06/16/2013 02:17 snow#2
using ExitProcess_t = VOID (WINAPI *)(UINT);
ExitProcess_t hkExitProcess = [](UINT) { return; };
ExitProcess_t pExisProcess_orig = reinterpret_cast<ExitProcess_t>(DetourFunction(rei nterpret_cast<PBYTE>(GetProcAddress(GetModuleHandl eA("kernel32.dll"), "ExitProcess")), reinterpret_cast<PBYTE>(hkExitProcess)));

sollte funktionieren, erfordert aber einen guten C++11 Compiler und die detours 1.5 lib.

Das wird dir aber wenig bringen, XTrap wird den Detour sofort erkennen.
06/16/2013 02:34 Terrat#3
Quote:
Originally Posted by snow911 View Post
using ExitProcess_t = VOID (WINAPI *)(UINT);
ExitProcess_t hkExitProcess = [](UINT) { return; };
ExitProcess_t pExisProcess_orig = reinterpret_cast<ExitProcess_t>(DetourFunction(rei nterpret_cast<PBYTE>(GetProcAddress(GetModuleHandl eA("kernel32.dll"), "ExitProcess")), reinterpret_cast<PBYTE>(hkExitProcess)));

sollte funktionieren, erfordert aber einen guten C++11 Compiler und die detours 1.5 lib.

Das wird dir aber wenig bringen, XTrap wird den Detour sofort erkennen.
hab ich net :(
kanst du mir bei einen helfen also einen zu erstellen ?
06/16/2013 02:42 snow#4
Nein, das musst du schon selber machen.

Hier ein Tutorial zu den Detours: [Only registered and activated users can see links. Click Here To Register...]
und für C++11 kannst du z.B. VS2012 nutzen, das hat eine gute Unterstützung.

Ohne C++11 musst du statt der Lambda-Funktion eine richtige Funktion schreiben (VOID WINAPI hkExitProcess { }) und statt des using brauchst du einen Prototypen mit Hilfe von typedef (typedef VOID (WINAPI *ExitProcess_t)(UINT);), dann sollte es funktionieren.
06/16/2013 17:58 MrSm!th#5
^Lambda-Funktionen wurden von einigen Compilern auch schon vor C++11 unterstützt, wie z.B. MSVC 10. Allerdings wird da deine Verwendung der using-Direktive Probleme machen.

Mal so nebenbei: Selbst wenn der Hook nicht erkannt wird, wird es nichts nützen. Du willst ein Symptom bekämpfen, allerdings musst du die Ursache in Angriff nehmen. Wenn das Anticheat-System ExitProcess aufruft, ist bereits alles entschieden. Das Spiel fährt herunter, Resourcen werden freigegeben und der Prozess wartet nur noch auf das Beenden des Prozesses. Ein Hook von ExitProcess wird nur Letzteres verhindern. Damit hängt sich dann dein Spiel auf. Im besten Fall läuft es weiter, aber du wirst irgendwann disconnected, weil jedes gute Anticheat seine Aktivität über das Netzwerk an den Server meldet und bleibt das aus, wirst du nunmal gekickt. Und das wird passieren, denn zumindest das Anticheat wird nichts mehr tun, selbst wenn das Spiel davon nichts mitbekommt und nichts freigibt o.Ä. (was dann aber für eine schlechte Integration sprechen würde), denn das Anticheat geht ja davon aus, dass der Prozess danach beendet ist.
So ein ExitProcess Hook kann ganz nett sein, wenn man das Spiel genau in diesem Fall analysieren will und ein Prozessschutz o.Ä. das normalerweise sofort unterbindet. Bzw. wenn man die Detection-Routine finden will, kann es natürlich ganz hilfreich sein, das bewusst zu provozieren und den Prozess bei ExitProcess dann einfrieren zu lassen.
Für dein Ziel ist der Hook aber unnütz.
06/16/2013 19:09 snow#6
Gerade mal getestet: Selbst mit VS12 macht using Probleme. :<
using für Funktionsprototypen und delete für Konstruktoren geht nicht. :/

Clang kann beides.. :(
06/17/2013 20:09 Raz9r#7
ExitProcess ist häufig mit dem Attribut __declspec(noreturn) oder [[noreturn]] (je nach C++11 Support) gekennzeichnet, weswegen solche Hooks sehr häufig fehlschlagen. Nur so als Randinfo.