怎么让DLL中代码完全执行完,然后卸载DLL
如何让DLL中代码完全执行完,然后卸载DLL?
正在学习注入,有个问题,当DLL中线程还没执行完,DLL就被卸载了,导致被监控的目标程序崩溃,如何让DLL中代码完全执行完,然后卸载DLL.
以下是简化代码
------解决方案--------------------
尝试下Hook FreeLibrary
------解决方案--------------------
在远程线程中使用一个Named event.
在外部线程,wait这个Named event.
------解决方案--------------------
外部调用者需要通过一个标志位等,Event等事件来判断是否执行完,执行完了,才释放
------解决方案--------------------
正在学习注入,有个问题,当DLL中线程还没执行完,DLL就被卸载了,导致被监控的目标程序崩溃,如何让DLL中代码完全执行完,然后卸载DLL.
以下是简化代码
BOOL loadDLL()
{
......
if( (hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0,
pfnStartAddr,pszLibFileRemote,0,NULL))==NULL)
{
MessageBox(NULL,"注入失败","注入提示";MB_OK);
return FALSE;
}
WaitForSingleObject(hRemoteThread ,INFINITE);
return TRUE;
}
void UNLoadDLL()
{
卸载DLL,和loadLL方法一致........
}
int main()
{
while(1)
//连续监控if(loadDLL(...))
{
Sleep(...);//停顿一下,让DLL代码执行完
UnLoadDLL(...);
}
}
}
以下为DLL代码
OOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DWORD dwThreadId;
CreateThread(NULL,NULL,Thread,NULL,0,&dwThreadId);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
DWORD WINAPI Thread(LPVOID lpParam)
{
char PassWord[80]={0};
char UserName[80]={0};
............//获取取目标程序用户名和密码
MessageBox(NULL,UserName,"Username",MB_OK);
MessageBox(NULL,PassWord,"password",MB_OK);
return 0;
}
------解决方案--------------------
尝试下Hook FreeLibrary
------解决方案--------------------
在远程线程中使用一个Named event.
在外部线程,wait这个Named event.
------解决方案--------------------
外部调用者需要通过一个标志位等,Event等事件来判断是否执行完,执行完了,才释放
------解决方案--------------------
VOID WINAPI FreeLibraryAndExitThread(
__in HMODULE hModule,
__in DWORD dwExitCode
);