首页
社区
课程
招聘
[求助]为什么远程线程注入的时候 DllMain启动的thread不运行呢??
发表于: 2012-6-30 20:12 8378

[求助]为什么远程线程注入的时候 DllMain启动的thread不运行呢??

2012-6-30 20:12
8378
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
	if (fdwReason == DLL_PROCESS_ATTACH) {
		_TRACE(_T("00\n"));
		_beginthread(ThreadProc,0,NULL);
		_TRACE(_T("11\n"));
		while (1) {}
		_TRACE(_T("22\n"));
	}

	return TRUE; 
}


//结束进程的函数

void ThreadProc(void *param)
{
	//------------hook api----------------
	_TRACE(_T("TR 00\n"));
	hMod = GetModuleHandle(NULL);
	_TRACE(_T("TR 11\n"));
	pDosHeader = (PIMAGE_DOS_HEADER)hMod;
	pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hMod + pDosHeader->e_lfanew);
	pOptHeader = (PIMAGE_OPTIONAL_HEADER)&(pNTHeaders->OptionalHeader);

	pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hMod + pOptHeader->DataDirectory[1].VirtualAddress);
	_TRACE(_T("TR 22\n"));
	while (pImportDescriptor->FirstThunk) {
		char * dllname = (char *)((BYTE *)hMod + pImportDescriptor->Name);

		pThunkData = (PIMAGE_THUNK_DATA)((BYTE *)hMod + pImportDescriptor->OriginalFirstThunk);

		int no = 1;
		while (pThunkData->u1.Function) {
			char * funname = (char *)((BYTE *)hMod + (DWORD)pThunkData->u1.AddressOfData + 2);
			PDWORD lpAddr = (DWORD *)((BYTE *)hMod + (DWORD)pImportDescriptor->FirstThunk) +(no-1);

			//修改内存的部分
			if ((*lpAddr) == (int)addr) {
				//修改内存页的属性
				DWORD dwOLD;
				MEMORY_BASIC_INFORMATION  mbi;
				VirtualQuery(lpAddr,&mbi,sizeof(mbi));
				VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOLD);

				WriteProcessMemory(GetCurrentProcess(), 
					lpAddr, &myaddr, sizeof(DWORD), NULL);
				//恢复内存页的属性
				VirtualProtect(lpAddr,sizeof(DWORD),dwOLD,0);
			}
			//---------
			no++;
			pThunkData++;
		}

		pImportDescriptor++;
	}
	//-------------------HOOK END-----------------
}

//new messagebox function
int WINAPI MessageBoxProxy(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType)
{
	return         ((PFNMESSAGEBOX)addr)(NULL, "gxter_test", "gxter_title", 0);
	//这个地方可以写出对这个API函数的处理代码
}


这是代码。也是网上的。。
注入部分我是用《Windows核心编程》上面的InjLib做的。。

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你要让程序调用你的动态库才会运行,你有那部分程序吗?
2012-6-30 22:26
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
详细去看msdn对DllMain 的描述。。。
你的DllMain 要返回,
你那里卡了
while (1) {}

否则你DllMain中开的线程会轮不到执行,直到你DllMain 返回
2012-6-30 23:00
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我试过了,我调用了那个DLL。
2012-7-1 19:23
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我将while (1) {}删除
同时将那个线程换成一个直接函数调用
发现那个函数的可以调用的。
就是执行线程的时候后

比如
TRACE(_T("00"));
_beginthread();
TRACE(_T("11"));
这里,00,和11都能输出,就是线程不执行。。。晕

同时我换成CreateThread,并立即ResumeThread,
线程还不执行。。。
2012-7-1 19:25
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
6
LZ直接写个exe ,LoadLibrary这个dll,新线程会执行么?
2012-7-1 20:53
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
都说了,要你的DllMain返回,DllMain怎么能不返回呢?在DllMain严忌调用类似等待或阻塞的函数, 像 WaitForXXX等等,更何况你 while (1){}

你在DllMain中创建线程可以,但这里比较特殊,必须DllMain返回线程才会得到执行
2012-7-2 00:24
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
DWORD WINAPI ThreadProc(lpvoid param1)
{
return 0;
}
2012-7-2 12:56
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
用getmessge试试
2012-7-2 21:32
0
游客
登录 | 注册 方可回帖
返回
//