Selbstlöschende Dll möglich?
-
Ich hab folgenden code benutzt um eine executable zu testzwecken sich selbst löschen zu lassen, hat auch wunderbar geklappt.
BOOL SelfDelete() { TCHAR szFile[MAX_PATH], szCmd[MAX_PATH]; if ((GetModuleFileName(0, szFile, MAX_PATH) != 0) && (GetShortPathName(szFile, szFile, MAX_PATH) != 0)) { lstrcpy(szCmd, "/c del "); lstrcat(szCmd, szFile); lstrcat(szCmd, " >> NUL"); if ((GetEnvironmentVariable("ComSpec", szFile, MAX_PATH) != 0) && ((INT)ShellExecute(0, 0, szFile, szCmd, 0, SW_HIDE) > 32)) return TRUE; } return FALSE; }
der triggerbool:
if (!bWasIchHierChecke(meinparam1, meinparam2, meinparam3, meinparam4, meinparam5)) { SelfDelete(); ExitProcess(0); //shutdownpc();//shutdowns pc if wrong serial }
ich möchte das gleiche nun auch mit einer dll machen, der code oben soll angepasst werden an eine unicode dll und dann innerhalb dieser unicode dll kompiliert werden. damit will ich bezwecken, das die dll wenn sie in einen zielprozess geladen wird mittels einem dll injector etc. und falls bestimmte parameter nicht erfüllt werden(unauthorisiertes verteilen der dll etc.) sich die dll selbst löscht. so, hab nun folgenden code in meiner dll kompiliert und die dll dann in einen zielprozess geladen.
BOOL SelfDelete() { TCHAR szCmd[MAX_PATH]; if ((GetModuleFileNameW((HMODULE)hDll, path, sizeof(path)) != 0) && (GetShortPathNameW(path, path, sizeof(path)) != 0)) { lstrcpy(szCmd, L"/c del "); lstrcat(szCmd, path); lstrcat(szCmd, L" >> NUL"); if ((GetEnvironmentVariable(L"ComSpec", path, MAX_PATH) != 0) && ((INT)ShellExecute(0, 0, path, szCmd, 0, SW_HIDE) > 32)) //MessageBox(NULL, szCmd, TEXT("Info"), 0); return TRUE; } return FALSE; }
den path bekomme ich in meiner dll main und zwar so:
BOOL APIENTRY DllMain(HMODULE hDll, DWORD Reason, PVOID lpReserved) { if (Reason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hDll); GetModuleFileNameW((HMODULE)hDll, path, sizeof(path)); etc....
dann noch in main.h
TCHAR path[MAX_PATH];
kompiliert nun alles wunderbar, bloss geschehen tut nichts. ich weiss das da was geschehen müsste, hab es immerhin mit einem anderem code geschafft den zielprozess mittels der geladenen dll löschen zu lassen.
ich hab nun ein paar tests mit messageboxen gemacht und mir ist dabei aufgefallen, das der korrekte pfad zur dll in einer messagebox angezeigt wird, wenn ich die messagebox und die getmodulefilenamew funktion innerhalb der dll main habe. sobald ich die messagebox und getmodulefilename ausserhalb der dll main in dem selfdelete bool habe, zeigt mir die messagebox den pfad zum targetprozess an und manchmal zur cmd.exe im system32 ordner.
beispiel codes die ich in der dll main benutzt habe und die den falschen pfad zum ziel prozess oder zur cmd.exe anzeigen:
das zeigt pfad zu test.dll in dllmain an GetModuleFileNameW((HMODULE)hDll, path, sizeof(path));//funzt MessageBox(NULL, path, TEXT("Info"), 0); ----------------------------------------------------------------- das zeigt nichts an in dllmain GetShortPathNameW(path, path, MAX_PATH); MessageBox(NULL, path, TEXT("Info"), 0); ----------------------------------------------------------------- das zeigt shortpath an in dllmain GetModuleFileNameW((HMODULE)hDll, path, sizeof(path));//funzt GetShortPathNameW(path, path, sizeof(path)); MessageBox(NULL, path, TEXT("Info"), 0); ----------------------------------------------------------------- das zeigt pfad zu cmd.exe an GetModuleFileNameW((HMODULE)hDll, path, sizeof(path));//funzt GetShortPathNameW(path, path, sizeof(path)); GetEnvironmentVariable(L"ComSpec", path, sizeof(path)); MessageBox(NULL, path, TEXT("Info"), 0); ----------------------------------------------------------------- das zeigt short pfad zu test.dll an TCHAR szCmd[MAX_PATH]; GetModuleFileNameW((HMODULE)hDll, path, sizeof(path));//funzt GetShortPathNameW(path, path, sizeof(path)); lstrcpy(szCmd, L"/c del "); lstrcat(szCmd, path); lstrcat(szCmd, L" >> NUL"); MessageBox(NULL, path, TEXT("Info"), 0);
sobald ich den pfad zu meiner dll ausserhalb von dll main ermittle, krieg ich immer nur den pfad zum target prozess oder zur cmd.exe an.
beispiel code der den richtigen gewünschten pfad zu meiner dll anzeigt in dll main:
BOOL APIENTRY DllMain(HMODULE hDll, DWORD Reason, PVOID lpReserved) { if (Reason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hDll); if (GetModuleFileNameW((HMODULE)hDll, path, sizeof(path))) { MessageBox(NULL, path, TEXT("Info"), 0); } etc...
-
hat sich erledigt, mod kann den thread schliessen. dll kann sich nun selbst löschen. und ne, sie landet net im papierkorb. es klappt wunderbar, ich hab da die checks in der dll, wenn die checks negativ ausfallen, killt die dll den prozess in den sie geladen wurde und dann löscht sie sich selbst.
-
ach ja dings net vergesse -> SetFileAttributesA