Kann sich eine DLL auch selbst löschen?



  • danke! Verstehe ich aber noch nicht 100%. Theoretisch müsste sich die Datei dann doch schon löschen wenn ich das Handle zu CreateFile schließe? Ich würde sie dann nämlich erst aus der Resource auf die disk schreiben und dann injecten aber dann darf ich das Handle nicht schließen beim schreiben der Resource damit es geht richtig und dann gleich injecten. Dann kann ich mein Handle schließen und sobald die exe in die injected wurde irgendwie geschlossen wird, löscht sich die Datei. Hab ich das so richtig verstanden? Und was ist wenn man den PC einfach ausschaltet? Da kann es auch nix ausrichten oder? Ist aber auch nicht so schlimm.



  • und wenn die DLL da ist, kann der User sie ja einfach kopieren und die Löschung wäre umgangen?



  • was machtn die dll? bist du der typ der sie ausm speicher laden wollte? wsa macht die denn?



  • Hallo, ich habe gebastelt diese Funktion: :xmas1:

    // dll deleting itself
    // use DebugView to trace messages: http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
    // CL options: /GR- /EHs-c- /GS- /D _DLL
    // no RTTI, no security checks, no exceptions
    #include <windows.h>
    #include <tchar.h>
    
    typedef BOOL (__stdcall *SETEVENT)(HANDLE);
    typedef void (__stdcall *SLEEP)   (DWORD);
    typedef BOOL (__stdcall *DELFILE) (LPCTSTR);
    typedef void (__stdcall *PRINT)   (LPCTSTR);
    
    HINSTANCE g_hinstance;
    
    #define info1 TEXT("MemoryFunction: waiting for unload")
    #define info2 TEXT("MemoryFunction: dll deleted")
    
    struct UNLOADDATA
    {
    	SETEVENT setevent;
    	HANDLE   hEvent;
    	SLEEP    sleep;
    	DELFILE  deletefile;
    	PRINT    print;
    	TCHAR    path[MAX_PATH];
    	TCHAR    szInfo1[sizeof(info1)];
    	TCHAR    szInfo2[sizeof(info2)];
    	char     code[1];
    };
    
    DWORD __stdcall MemoryFunction(UNLOADDATA *data)
    {
    	// this function MUST fit in memory block (4096-sizeof(UNLOADDATA))
    	// before data->setevent() we can use static strings
    	OutputDebugString(TEXT("MemoryFunction: sending ACK"));
    	data->setevent(data->hEvent);
    	// loop until FreeLibraryAndExitThread not finished
    	while (!data->deletefile(data->path))
    	{
    		data->print(data->szInfo1);
    		data->sleep(1000);
    	}
    	data->print(data->szInfo2);
    	return 0;
    }
    
    DWORD __stdcall SleepAndUnloadThread(void*)
    {
    	OutputDebugString(TEXT("SleepAndUnloadThread: entered"));
    	Sleep(1000);
    	UNLOADDATA *data = (UNLOADDATA*)VirtualAlloc(0, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    	data->setevent   = &SetEvent;
    	data->hEvent     = CreateEvent(0,0,0,0);
    	data->sleep      = &Sleep;
    	data->deletefile = &DeleteFile;
    	data->print      = &OutputDebugString;
    	// copy dll path
    	GetModuleFileName(g_hinstance, data->path, MAX_PATH);
    	// copy debug strings
    	_tcscpy(data->szInfo1, info1);
    	_tcscpy(data->szInfo2, info2);
    
    	CopyMemory(&data->code, &MemoryFunction, 4096-sizeof(UNLOADDATA));
    	DWORD ThreadID;
    	OutputDebugString(TEXT("SleepAndUnloadThread: creating thread"));
    	HANDLE hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)(&data->code), data, 0, &ThreadID);
    
    	// wait for data->setevent(data->hEvent);
    	OutputDebugString(TEXT("SleepAndUnloadThread: waiting for ACK from thread"));
    	if (!WaitForSingleObject(data->hEvent, 10000))
    		OutputDebugString(TEXT("SleepAndUnloadThread: ACK received"));
    	else
    		OutputDebugString(TEXT("SleepAndUnloadThread: timeout"));
    
    	CloseHandle(hThread);
    	CloseHandle(data->hEvent);
    	// unload dll and quit thread
    	OutputDebugString(TEXT("SleepAndUnloadThread: unloading"));
    	FreeLibraryAndExitThread(g_hinstance, 0);
    }
    
    BOOL __stdcall DllMain(HINSTANCE hinst, DWORD reason, DWORD)
    {
    	switch (reason)
    	{
    		case DLL_PROCESS_ATTACH:
    			g_hinstance = hinst;
    			OutputDebugString(TEXT("DLL_PROCESS_ATTACH"));
    			// unload automatically
    			CloseHandle(CreateThread(0,0,SleepAndUnloadThread,0,0,&reason));
    	}
    	return TRUE;
    }
    


  • ich kann dir sonst meinen dll loader code geben, er lädt eine dll direkt aus dem speicher heraus. ist aber experimentell, und TLS geht nicht.



  • QuickCoder schrieb:

    danke! Verstehe ich aber noch nicht 100%. Theoretisch müsste sich die Datei dann doch schon löschen wenn ich das Handle zu CreateFile schließe?

    Ja klar! Deshalb darfst Du das "CloseHandle" natürlich *erst* aufrufen, wenn die DLL in den Fremdprozess schon injected wurde!

    QuickCoder schrieb:

    Hab ich das so richtig verstanden?

    Und was ist wenn man den PC einfach ausschaltet? Da kann es auch nix ausrichten oder? Ist aber auch nicht so schlimm.[/quote]Keine Ahnung probier es aus 😉



  • sapero der Code bringt mir leider nix, da die DLL dann noch da wäre wenn der Prozess crashed.
    hack0r jo wäre super, da ich nicht mal weiß was ein TLS ist und es noch nie verwendet habe, wäre das egal.
    Und am schluss noch ein dickes Danke an Jochen Kalmbach. Ich teste das heute gleich mal aus.



  • yo kein ding ich poste den code nachher



  • der code is zu lang um alles hier zu posten. hier: http://www.devfull.de/?page_id=8

    ist wie gesagt eher was für hack0r, musste also evtl bisschen mit frickeln, wenn was nicht funzt. unter wind00f vista oder 7 hab ich das noch nicht getestet, ich weiss nicht ob da ASLR etc. probleme machen könnte. ansonsten ist es ziemlich selbsterklärend.



  • geil danke, sowas hab ich gesucht! Habs aber noch nicht getestet, hoffentlich klappt es 🙂


Anmelden zum Antworten