Kann sich eine DLL auch selbst löschen?
-
moin moin

kann sich eine DLL Datei selbst löschen?
Ich habe z. B. diesen Code hier:#include <windows.h> extern "C" void __declspec(dllexport) Funktion() { Beep(1000, 1000); } BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { return TRUE; }diese wird in einen anderen Prozess gemappt.
Wenn der Prozess beendet, soll sich diese selbst löschen. Ich befürchte aber selber schon, dass es nicht möglich ist, außer mit einem fießen hack oder irre ich mich da?
-
Die kann sich nicht direkt selbst löschen, nö. Da musst du schon in die Trickkiste greifen.
-
Vom Filesystem löschen oder wie?
-
Genausowenig wie sich EXE löschen lassen, lassen sich auch nicht DLLs löschen...
Aber der Vollständigkeit halber:
http://www.catch22.net/tuts/selfdel
-
@Icematrix einfach die .dll Datei halt löschen die injeziert wurde.
Danke Jochen Kalmbach! Hoffentlich klappt es
und noch ne Frage dazu, gibt es in ner DLL irgendwas das aufgerufen wird wenn der Zielprocess crashed oder wenn der Prozess über den Task manager beendet wird, denn dann sollte die Datei ja auch gelöscht werden.
-
vllt mit nem SEH exception handler
-
ah ne geht wohl doch nich
If a process is terminated by TerminateProcess, all threads of the process are terminated immediately with no chance to run additional code. This means that the thread does not execute code in termination handler blocks. In addition, no attached DLLs are notified that the process is detaching.
-
QuickCoder schrieb:
und noch ne Frage dazu, gibt es in ner DLL irgendwas das aufgerufen wird wenn der Zielprocess crashed oder wenn der Prozess über den Task manager beendet wird, denn dann sollte die Datei ja auch gelöscht werden.
Nein. Der Prozess bekommt keine Benachrichtigung, wenn er abgeschossen wird und wenn er abstürzt, kann er so wie so nichts mehr machen.
-
schade dann bringts nix.
Meine erste Idee war ja die DLL aus der Resource zu injecten, aber dafür reicht mein wissen über Windows und die API nicht. Dann dacht ich, immer löschen wenn der andere Prozess nicht da ist, aber wenn es einfach über den Task Manager dann geht bringt es auch nix. Dann muss ich die DLL wohl wirklich ins system32 System stecken und von dort immer laden, ist zwar auch nicht das was ich will aber mir bleibt keine wahl.
-
wieso entpackst du sie nicht einfach nach C:\WINDOOF\Temp? Wieso musst du diese DLL überhaupt löschen? Was ist das für ne DLL bitte schön, die immer gelöscht werden muss? IIst das schadcode oder wie?
-
QuickCoder schrieb:
das aufgerufen wird wenn der Zielprocess crashed oder wenn der Prozess über den Task manager beendet wird, denn dann sollte die Datei ja auch gelöscht werden.
Nein. Die einzige Möglichkeit ist, dass Du die Datei schon mit "Delete on Close" erstellst. Damit wird die Datei gelöscht sobald die letzte Referenz darauf geschlosen wird.
Das ist vermutlich bei Dir die *beste* Lösung!
-
hört sich gut an! Wie mache ich das?
hack0r: ne aber ich würde auch nicht wollen, dass eine Anwendung meine "Windoof" Ordner vollmüllt
-
ja herrschaftszeiten aber gerade dafür ist der TEMP ordner doch da!
-
mir ist klar was "Temp" bedeutet aber trotzdem würde mir Delete on Close besser gefallen, aber die MSDN zeigt das beim WDK an

-
Wenn Du die DLL-Datei auf die Festplatte schreibst (ja, das musst Du dann selber machen; oder von mir aus auch kopieren):
http://msdn.microsoft.com/en-us/library/aa363858
mit dwFlagsAndAttributes = FILE_FLAG_DELETE_ON_CLOSE
-
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.