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.


Anmelden zum Antworten