首页
社区
课程
招聘
[求助]CreateRemoteThread卸载DLL在DEBUG下可以,但Release下失败
发表于: 2009-9-4 11:17 5978

[求助]CreateRemoteThread卸载DLL在DEBUG下可以,但Release下失败

2009-9-4 11:17
5978
CreateRemoteThread卸载DLL在DEBUG下可以,但Release下失败,且无任何提示(我设置的失败应该有msg),怎么弄?
基本思路是打开目标进程,修改内存,写入代码,启动远程线程,虽然网上有更好的我我主要想弄清问题所在,请高手指导。
struct MyData
{
	HMODULE inmodule; // 传入的模块地址
	DWORD dwFreeLibrary; // FreeLibrary的地址
};
//远程卸载函数
DWORD __stdcall RMTFunc(MyData *pData)
{
	typedef int(__stdcall*MFreeLibrary)(HMODULE);
	MFreeLibrary Mfremod = (MFreeLibrary)pData->dwFreeLibrary;
	Mfremod(pData->inmodule);
	return 0;
}
bool Killmod(LPCTSTR inCurprocId,LPCTSTR Modadre,bool ShowMsg)
{

	//远程注入CurprocId指定的进程,卸载Modadre地址处的DLL
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,_wtoi(inCurprocId));
	// ========= 代码结构 =============================
	MyData data;
	ZeroMemory(&data, sizeof (MyData));
	data.inmodule=(HMODULE)_wtol( Modadre);
	HINSTANCE hUser = LoadLibrary(L"kernel32.dll");
	if (! hUser)
	{
		if(ShowMsg) MessageBox(NULL,L"在载入kernel32模块时失败,请确认该DLL是\n否存在,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	data.dwFreeLibrary = (DWORD)GetProcAddress(hUser,(LPCSTR)"FreeLibrary");
	FreeLibrary(hUser);
	if (! data.dwFreeLibrary)
	{
		if(ShowMsg) MessageBox(NULL,L"获取系统卸载函数失败,请确认kernel32是否\n正常,卸载不能继续",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	// ======= 分配空间备远程注入====================
	void *pRemoteThread=VirtualAllocEx(hProcess,0,1024*4, MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
	if (!pRemoteThread)
	{
		if(ShowMsg) MessageBox(NULL,L"目标进程内存修改失败,可能你没有此权限或\n安全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	if (!WriteProcessMemory(hProcess,pRemoteThread,&RMTFunc,1024*4,0))
	{
		if(ShowMsg) MessageBox(NULL,L"目标进程内存写入失败,可能你没有此权限或\n安全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	MyData *pData = (MyData*)VirtualAllocEx(hProcess,0,sizeof (MyData), MEM_COMMIT,PAGE_READWRITE);
	if (!pData)
	{
		if(ShowMsg) MessageBox(NULL,L"目标进程内存写入失败,可能你没有此权限或\n安全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
	{
		if(ShowMsg) MessageBox(NULL,L"目标进程内存写入失败,可能你没有此权限或安\n全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	// =========== 启动远程线程==================
	HANDLE hThread =CreateRemoteThread(hProcess, 0,0, (LPTHREAD_START_ROUTINE)pRemoteThread,pData, 0, 0);
	if (! hThread)
	{
		if(ShowMsg) MessageBox(NULL,L"远程线程启动失败,可能你没有此权限或安\n全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
		return false;
	}
	WaitForSingleObject(hThread,INFINITE);
	CloseHandle(hThread);
	VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
	VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
	CloseHandle(hProcess);
	return true;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
好复杂.
2009-9-4 11:35
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没错误也不一定表示卸载成功
执行一次只能把 Dll 的引用计数减1,果Dll原来的引用计数大于1就不会被卸载
具体什么问题还是要Debug一下
实现的确太复杂了,同样的功能,只要把FreeLibrary作为线程入口,把HMOUDLE作为参数 建个远线程就够了
2009-9-4 12:06
0
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
还是谢谢,在Debug下是完全成功,所以不知道怎么调试。万一不行换个方式算了
2009-9-4 12:50
0
雪    币: 170
活跃值: (45)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
在编译的时候去掉增量链接。
2009-9-4 23:37
0
游客
登录 | 注册 方可回帖
返回
//