小弟利用远程线程注入DLL,DLL内创建新的线程,新的线程内创建了一个窗口,有消息循环并响应WM_TIMER消息,代码如下:
case WM_TIMER:
Nwnd = FindWindow("D3D Window", "Target");
if(Nwnd == NULL )
{ //停止投递WM_TIMER消息
::KillTimer(hwnd,1);
dwHandle = GetModuleHandle(NULL);
// 使目标进程调用FreeLibrary,卸载DLL
hModule=GetModuleHandle("kernel32.dll");
pFunc = GetProcAddress(hModule, "FreeLibrary");
hThread = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)dwHandle, 0, &dwID );
if(hThread == NULL)
MessageBox( NULL, _T("返回值有错误"), _T("信息"), MB_ICONINFORMATION );
// 等待FreeLibrary卸载完毕
WaitForSingleObject( hThread, INFINITE );
CloseHandle( hThread ); }
如果没有发现Target窗口就撤消一个已经安装的定时器1并创建一个线程用于释放自身DLL.
测试DLL运行后发现不能释放自身DLL,系统也没有提示什么错误,我感到摸不着头脑,希望大牛们给个建议怎么做可以让DLL内释放自身DLL,帮忙啊,我实在想不出方法,深感自己知识不够深入,希望大牛们不要吝惜给建议和批评.
case WM_TIMER:
Nwnd = FindWindow("D3D Window", "Target");
if(Nwnd == NULL )
{ //停止投递WM_TIMER消息
::KillTimer(hwnd,1);
dwHandle = GetModuleHandle(NULL);
// 使目标进程调用FreeLibrary,卸载DLL
hModule=GetModuleHandle("kernel32.dll");
pFunc = GetProcAddress(hModule, "FreeLibrary");
hThread = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)dwHandle, 0, &dwID );
if(hThread == NULL)
MessageBox( NULL, _T("返回值有错误"), _T("信息"), MB_ICONINFORMATION );
// 等待FreeLibrary卸载完毕
WaitForSingleObject( hThread, INFINITE );
CloseHandle( hThread ); }
如果没有发现Target窗口就撤消一个已经安装的定时器1并创建一个线程用于释放自身DLL.
测试DLL运行后发现不能释放自身DLL,系统也没有提示什么错误,我感到摸不着头脑,希望大牛们给个建议怎么做可以让DLL内释放自身DLL,帮忙啊,我实在想不出方法,深感自己知识不够深入,希望大牛们不要吝惜给建议和批评.
解决方案 »
- 为什么ADsGetObject调用不成功?
- VC2008调用水晶报表后,内存增加40M不释放
- delphi VC 混合编程 图像显示
- 查询..插入..查询...??
- CFile生成的TXT文件如何处理"\n"
- 旋转按钮控件在设置Set buddy integer后出现Debug Assertion Failed!错误!
- 菜鸟求助:如果在一个对话框里加一个 HTTP 的超连接?
- 当点击某控件,如何阻止该控件获得焦点,但是该控件要响应消息?
- 高分,请大家帮忙测试一下这个检查一字符串是否为IP地址的函数
- 谢谢, 可以帮我解决这个难题吗?!!!Emergency!!!!
- 请问下怎么实现工具栏的下拉三角箭头呢?
- DLL怎么让EXE释放自己呢?
对于远程线程,可以在DllMain最后return FALSE,这样会自动卸载。
而是GetModuleHandle("dll名字"),
最好直接用全局变量将DllMain的第一个参数(DLL的句柄)保存起来
既然是卸载了,后面就不要执行DLL里的代码了DLL创建的窗口一直运行在线程中吧
如果没有发现Target窗口就KillTimer(hwnd,1)
然后发消息或之类操作去关闭DLL创建的窗口
在执行到线程的return前
__asm
{
mov eax, offset lparam
mov eax, [eax - 4]
push hInstDLL
push eax
push FreeLibrary
retn
}
一种思路而已,没测试过,看情况修改MS是外挂,没什么好隐瞒的,好好学,不要干坏事
发消息关闭窗口后代码可以执行到线程的return处,我把DLL的句柄保存了下来后,在return前把汇编代码复制上后提示label 'lparam' was undefined,请这位大牛给看下.
怎么做可以释放DLL自身?
用FreeLibraryAndExitThread这个函数
恩,我查了下FreeLibraryAndExitThread这个函数的用法,可以结束自身的DLL,我试下下...你先不要走开...
果然简单实用