PEDIY
不卸载dll, 只删除文件就行
卸载dl,就能删除文件。内存的还是你原来dll.是多加载一次。 A B代码合在一起。
//////////////////////////////////////// A.dll /////////////////////////////////////////////////////////
typedef ULONG (WINAPI *PFNFreeFakeDll)(
HMODULE hModule // specifiy TRUE if reboot needed after install
);
DWORD ThreadProc( LPVOID lpParameter)
{
HMODULE hMod=(HMODULE)lpParameter;
DWORD dwDataLength=sizeof(g_szDllData);
char*pdll_data=NULL;
pdll_data=(char*)malloc(dwDataLength+1);
if(pdll_data==NULL)
return -1;
RtlZeroMemory(pdll_data,dwDataLength);
RtlCopyMemory(pdll_data,g_szDllData,dwDataLength);
// int nCount=60;
//
// while(nCount-->0)
// {
// OutputDebugStringA("wait------\n");
// Sleep(1000);
// }
HMEMORYMODULE h=MemoryLoadLibrary(pdll_data);
if(h){
PFNFreeFakeDll func=(PFNFreeFakeDll)MemoryGetProcAddress(h,"DllGetClassObjec");
if(func)
{
func(hMod);
}
}
Sleep(100);
//TerminateThread(GetCurrentThread(),0);
return 0;
}
//B.dll
DWORD WINAPI FreeDllThreadProc(
LPVOID lpParameter
)
{
HMODULE hModule = (HMODULE)lpParameter;
if(hModule == NULL)
return 0;
TCHAR szDllFilePath[MAX_PATH]={0};
GetModuleFileName(hModule,szDllFilePath,MAX_PATH);
Sleep(10000);
FreeLibrary(hModule);
TCHAR ProcessName[MAX_PATH] ={0};
GetCurrentProcessName(ProcessName,MAX_PATH);
if(0!=_tcsicmp(ProcessName,L"explorer.exe"))
{
//3分钟后删除文件
ULONG nCount =0;
while(nCount< 3*6)
{
Sleep(10000);
nCount++;
}
}
DeleteFile(szDllFilePath);
return 0;
}
ULONG WINAPI DllGetClassObjec (HMODULE hModule)
{
if(hModule == NULL)
return -1;
//这里要线程去freedll
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FreeDllThreadProc,hModule,0,NULL);
return 0;
}
最后于 2023-2-13 10:43
被wujimaa编辑
,原因: