Folgenes Szenario: Ich würde gerne via C/C++ ein geladenes Modul entladen. In diesem Fall ist es eine Mod die im Spiel (GTAIV) injected wurde (genauer gesagt ein Trainer).
Warum? Ich versuche im Moment einen neuen Multiplayer Modus für GTA IV zu entwickeln und da Trainer das Spielerlebnis für andere Spieler verschlechtern könnte, da man sich ja dann gewisse Dinge ercheaten könnte, würde ich diese gerne entladen.
Ich weiß leider nicht genau wie dieser Trainer aufgebaut ist, und wie er genau injected wird (Da der source code nicht öffentlich ist), aber ich denke das injecten funktioniert meistens immer gleich wenn ich mich da nicht irre?
Zum Glück hat diese Person die den Trainer entwickelt hat ein Plugin für GTA IV entwickelt, welches es anderen Moddern ermöglicht eigene Mods für GTA IV in C/C++ zu erstellen! Ich benutzte dieses Plugin um von meiner Mod aus zu versuchen diese Trainer-Mod zu entladen.
Die dllmain.cpp Datei von diesem Plugin sieht so aus
Anhand diesen Code könnte man ja meinen das der Ersteller des Trainers das selbe verfahren wie hier in seinem Trainer benutzt.
Spoiler anzeigen
Nun habe ich 2 nützlich Funktionen mit denen ich die Prozess und Modul Informationen erhalten kann
Spoiler anzeigen
Die auch ganz gut funktionieren wenn ich diese aufrufe
Mittels
Spoiler anzeigen
Welche mir (denke ich mal) sehr weiterhelfen könnten bei diesem Vorhaben.
Nun stelle ich mir aber die Fragen:
Ist dies überhaupt möglich?
Wenn dies möglich ist, wie würde der Code für das entladen aussehen?
Ich habe schon gelesen das es nicht empfohlen wird geladene Module von einem Prozess zu entladen da diese ja vom Prozess benötigt werden können, aber ich denke das Dinge die nachträglich in diesem Prozess injected wurden nicht unbedingt von diesem Prozess benötigt werden. Oder täusche ich mich da?
Ich bedanke mich für jegliche Hilfe!
Warum? Ich versuche im Moment einen neuen Multiplayer Modus für GTA IV zu entwickeln und da Trainer das Spielerlebnis für andere Spieler verschlechtern könnte, da man sich ja dann gewisse Dinge ercheaten könnte, würde ich diese gerne entladen.
Ich weiß leider nicht genau wie dieser Trainer aufgebaut ist, und wie er genau injected wird (Da der source code nicht öffentlich ist), aber ich denke das injecten funktioniert meistens immer gleich wenn ich mich da nicht irre?
Zum Glück hat diese Person die den Trainer entwickelt hat ein Plugin für GTA IV entwickelt, welches es anderen Moddern ermöglicht eigene Mods für GTA IV in C/C++ zu erstellen! Ich benutzte dieses Plugin um von meiner Mod aus zu versuchen diese Trainer-Mod zu entladen.
Die dllmain.cpp Datei von diesem Plugin sieht so aus
Anhand diesen Code könnte man ja meinen das der Ersteller des Trainers das selbe verfahren wie hier in seinem Trainer benutzt.
C-Quellcode
- namespace plugin
- {
- HMODULE GetCurrentModule()
- {
- HMODULE hModule = NULL;
- GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)GetCurrentModule, &hModule);
- return hModule;
- }
- DWORD WINAPI DummyThread(HMODULE hModule)
- {
- while (true)
- {
- Sleep(1000);
- }
- FreeLibraryAndExitThread(hModule, 0);
- return 0;
- }
- void Init()
- {
- CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)DummyThread, GetCurrentModule(), 0, nullptr);
- }
- }
- BOOL APIENTRY DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID lpReserved)
- {
- if (ul_reason_for_call == DLL_PROCESS_ATTACH) plugin::Init();
- return TRUE;
- }
Nun habe ich 2 nützlich Funktionen mit denen ich die Prozess und Modul Informationen erhalten kann
C-Quellcode
- inline PROCESSENTRY32 GetProcessInfo(const char* processName)
- {
- void* hSnap = nullptr;
- PROCESSENTRY32 Proc32 = { 0 };
- if ((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE)
- return Proc32;
- Proc32.dwSize = sizeof(PROCESSENTRY32);
- while (Process32Next(hSnap, &Proc32)) {
- if (!strcompare(processName, GetConstChar(Proc32.szExeFile), false)) {
- CloseHandle(hSnap);
- return Proc32;
- }
- }
- CloseHandle(hSnap);
- Proc32 = { 0 };
- return Proc32;
- }
- inline MODULEENTRY32 GetModuleInfo(std::uint32_t processID, const char* moduleName)
- {
- void* hSnap = nullptr;
- MODULEENTRY32 Mod32 = { 0 };
- if ((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID)) == INVALID_HANDLE_VALUE)
- return Mod32;
- Mod32.dwSize = sizeof(MODULEENTRY32);
- while (Module32Next(hSnap, &Mod32)) {
- if (!strcompare(moduleName, GetConstChar(Mod32.szModule), false)) {
- CloseHandle(hSnap);
- return Mod32;
- }
- }
- CloseHandle(hSnap);
- Mod32 = { 0 };
- return Mod32;
- }
Die auch ganz gut funktionieren wenn ich diese aufrufe
Mittels
MODULEENTRY32 mEntry
habe ich Zugriff auf solche Sachen:- DWORD dwSize
- DWORD GIbIcntUsage
- HMODULE hModule
- BYTE modBaseAddr
- DWORD modBaseSize
- DWORD ProccntUsage
- WCHAR szExePath
- WCHAR szModule
- DWORD th32ModuleID
- DWORD th32ProcessID
Welche mir (denke ich mal) sehr weiterhelfen könnten bei diesem Vorhaben.
Nun stelle ich mir aber die Fragen:
Ist dies überhaupt möglich?
Wenn dies möglich ist, wie würde der Code für das entladen aussehen?
Ich habe schon gelesen das es nicht empfohlen wird geladene Module von einem Prozess zu entladen da diese ja vom Prozess benötigt werden können, aber ich denke das Dinge die nachträglich in diesem Prozess injected wurden nicht unbedingt von diesem Prozess benötigt werden. Oder täusche ich mich da?
Ich bedanke mich für jegliche Hilfe!
Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button
Für VB.NET Entwickler: Option Strict On nicht vergessen!
Für VB.NET Entwickler: Option Strict On nicht vergessen!