Ein geladenes Modul entladen welches in einen Prozess injected wurde

  • C++

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von GerhardW.

    Ein geladenes Modul entladen welches in einen Prozess injected wurde

    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

    C-Quellcode

    1. namespace plugin
    2. {
    3. HMODULE GetCurrentModule()
    4. {
    5. HMODULE hModule = NULL;
    6. GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)GetCurrentModule, &hModule);
    7. return hModule;
    8. }
    9. DWORD WINAPI DummyThread(HMODULE hModule)
    10. {
    11. while (true)
    12. {
    13. Sleep(1000);
    14. }
    15. FreeLibraryAndExitThread(hModule, 0);
    16. return 0;
    17. }
    18. void Init()
    19. {
    20. CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)DummyThread, GetCurrentModule(), 0, nullptr);
    21. }
    22. }
    23. BOOL APIENTRY DllMain(HMODULE, DWORD ul_reason_for_call, LPVOID lpReserved)
    24. {
    25. if (ul_reason_for_call == DLL_PROCESS_ATTACH) plugin::Init();
    26. return TRUE;
    27. }



    Nun habe ich 2 nützlich Funktionen mit denen ich die Prozess und Modul Informationen erhalten kann
    Spoiler anzeigen

    C-Quellcode

    1. inline PROCESSENTRY32 GetProcessInfo(const char* processName)
    2. {
    3. void* hSnap = nullptr;
    4. PROCESSENTRY32 Proc32 = { 0 };
    5. if ((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE)
    6. return Proc32;
    7. Proc32.dwSize = sizeof(PROCESSENTRY32);
    8. while (Process32Next(hSnap, &Proc32)) {
    9. if (!strcompare(processName, GetConstChar(Proc32.szExeFile), false)) {
    10. CloseHandle(hSnap);
    11. return Proc32;
    12. }
    13. }
    14. CloseHandle(hSnap);
    15. Proc32 = { 0 };
    16. return Proc32;
    17. }
    18. inline MODULEENTRY32 GetModuleInfo(std::uint32_t processID, const char* moduleName)
    19. {
    20. void* hSnap = nullptr;
    21. MODULEENTRY32 Mod32 = { 0 };
    22. if ((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID)) == INVALID_HANDLE_VALUE)
    23. return Mod32;
    24. Mod32.dwSize = sizeof(MODULEENTRY32);
    25. while (Module32Next(hSnap, &Mod32)) {
    26. if (!strcompare(moduleName, GetConstChar(Mod32.szModule), false)) {
    27. CloseHandle(hSnap);
    28. return Mod32;
    29. }
    30. }
    31. CloseHandle(hSnap);
    32. Mod32 = { 0 };
    33. return Mod32;
    34. }



    Die auch ganz gut funktionieren wenn ich diese aufrufe

    C-Quellcode

    1. PROCESSENTRY32 info = GetProcessInfo("GTAIV.exe");
    2. MODULEENTRY32 mEntry = GetModuleInfo(info.th32ProcessID, "Trainer.asi"); // .asi Dateien sind umbenannte .dll Dateien


    Mittels MODULEENTRY32 mEntry habe ich Zugriff auf solche Sachen:
    Spoiler anzeigen

    • 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 :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Also ich denke, wenn ein Programm "Dinge" zur Laufzeit nachlädt und diese verwalten will, gibt es sicher ein "Handle" davon, was sich das Programm merkt. Wenn du jetzt die nachgeladenen "Dinge" einfach entfernst, dann hat das Programm zwar die Info vom "Handle", aber die Dinge sind nicht mehr da. Sollte nun das Programm über diesen "Handle" auf diese entfernten "Dinge" zugreifen möchte, was passiert dann? Es wird abstürzen...
    Aber warum sollte denn das Programm auf diese entfernten und vor allem fremden "Dinge" zugreifen wollen? Ist das "Ding" hier nicht eher das was auf das Programm mit Memory Reading und Writing zugreifen möchte? Das "Ding" was injected wird ist ja völlig fremd für das Programm.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!