Dll Injection blockieren, mit einer art Whitelist?
-
Hi.
In Google habe ich folgendes Script gefunden:void AntiInject () { HANDLE hProc = GetCurrentProcess(); while (TRUE) { BlockAPI(hProc, "NTDLL.DLL", "LdrLoadDll"); Sleep (100); } } BOOLEAN BlockAPI (HANDLE hProcess, CHAR *libName, CHAR *apiName) { CHAR pRet[]={0xC3}; HINSTANCE hLib = NULL; VOID *pAddr = NULL; BOOL bRet = FALSE; DWORD dwRet = 0; hLib = LoadLibrary (libName); if (hLib) { pAddr = (VOID*)GetProcAddress (hLib, apiName); if (pAddr) { if (WriteProcessMemory (hProcess, (LPVOID)pAddr, (LPVOID)pRet, sizeof (pRet), &dwRet )) { if (dwRet) { bRet = TRUE; } } } FreeLibrary (hLib); } return bRet; }Dieser Blockiert ALLE Dll Injections, jetzt möchte ich aber eine art Whitelist erstellen, dass man zB test.dll Injecten darf, den Rest aber nicht. Wie Funktioniert das?
Lg
-
Du hast ne 3 vergessen.
-
Du musst ganz einfach auf einer Whitelist nach dem entsprechenden Schlüssel suchen.
Pseocode:
if (!whitelist.find(apiName)) BlockAPI(hProcess, libName, apiName);Allerings frage ich mich auch, was du mit deinem Code bezwecken willst.
Dieser überschreibt nämlich den Code einer Funktion mit diesem hier:void function(...) { }Es wird kein Wert zurückgegeben. Oft macht das nichts, aber kann auch echt schlimme Auswirkungen haben, wenn z.B. ein uninitialisierter Pointer zurückgegeben wird.
Funktionen mit stdcall werden auch nicht funktionieren.
-
Man könnte die DLL immer noch manuell injeccten. Mit VirtualAllocEx Speicher anfordern, sich um Relocations un den ganzen Mist kümmern, den fertigen Code/Data mit WriteProcessMemory rüberschaufeln und mit CreateRemoteThread die DLL-Main aufrufen.
Du kannst praktisch nichts dagegen tun.Man muss halt LoadLibrary nachprogrammieren. Macht nicht viel Spaß aber machbar. Und gegen Dll-Injections BEVOR dein Code ausgeführt wird (mit dem passenden Flag bei CreateProcess kein Problem) kannst du auch nichts tun.
-
Wie kriege ich denn jetzt den apiNamen in der Funktion heraus? Dort steht nicht deklarierter Bezeichner..
BOOLEAN BlockAPI (HANDLE hProcess, CHAR *libName, CHAR *apiName) { CHAR pRet[]={0xC3}; HINSTANCE hLib = NULL; VOID *pAddr = NULL; BOOL bRet = FALSE; DWORD dwRet = 0; hLib = LoadLibraryA(libName); if (hLib) { pAddr = (VOID*)GetProcAddress (hLib, apiName); if (pAddr) { if (WriteProcessMemory (hProcess, (LPVOID)pAddr, (LPVOID)pRet, sizeof (pRet), &dwRet )) { if (dwRet) { bRet = TRUE; } } } FreeLibrary (hLib); } return bRet; } void AntiInject () { HANDLE hProc = GetCurrentProcess(); while (true) { if (apiName != "test.dll") { BlockAPI(hProc, "NTDLL.DLL", "LdrLoadDll"); } Sleep(100); } }
-
Lern erst mal die Grundlagen von C++.
apiName ist der dritte Parameter der Funktion BlockAPI.
Du kannst char* nicht mit == vergleichen, also nutze std::string.
-
Und lies meinen Beitrag. Dein Vorgehen ist Murks wenn dein "Gegner" jemand ist, der halbwegs Ahnung hat. (Was beim Reverse Engineering und Cheats schreiben fast eine Voraussetzung ist)
-
Was könnte man denn sonst gegen die Dlls machen?
-
Eine gängige Taktik ist es bestimmte Speicherbereiche auf Veränderungen zu prüfen um so einige Hacks auszuschließen.
if(!Collision()) Move(); else Stop();Könnte jemand im Speicher so umfrickeln dass immer Move() aufgerufen wird. Überprüfst du den Code deines Spiels weißt du ob da jemand herumgespielt hat.
Geht aber nur bei Online-Games gut.