首页
社区
课程
招聘
CreateRemoteThread参数问题.GetProcAddress返回Invalid access to memory
发表于: 2011-12-25 10:39 4981

CreateRemoteThread参数问题.GetProcAddress返回Invalid access to memory

2011-12-25 10:39
4981
在看Windows核心编程远程线程注入这节.试着写了一个程序
问题是GetProcAddress返回       
        $err,hr        0x000003e6 Invalid access to memory location.         unsigned long

贴下代码,感谢.

	PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
		GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");

	
	if (pfnThreadRtn == NULL)
	{
		AfxMessageBox(_T("Get LoadLibrary Error."));
		VirtualFreeEx(hProcess, pszDllName, 0, MEM_RELEASE);
		CloseHandle(hProcess);
		return;
	}

	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, 
		pfnThreadRtn, pszDllName, 0, NULL);
	
	if (hThread == NULL)
	{
		AfxMessageBox(_T("CreateRemoteThread Error."));
		VirtualFreeEx(hProcess, pszDllName, 0, MEM_RELEASE);
		CloseHandle(hProcess);
	}

	WaitForSingleObject(hThread, INFINITE);
	AfxMessageBox(_T("Sucess"));


OS : Win7 SP1
VS2010 SP1

还有个问题,就是例如GetProcAddress ,我如何查看LoadLibraryW在Kernel32.dll中的地址,来判断这个函数的返回地址是否正确? 十分感谢.

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
2
如果确实是GetProcAddress无法访问内存,则显然是GetModuleHandle的返回值不正常。结合你的代码,建议加上“.dll"试下效果。看看返回的模块基址是否正确。

  还有一点,在win7系统中,不同的进程加载同一个模块,其基地址可能是不相同的。你不能做出一定是相同的假设。看你那程序有些危险性。

  最后,用OD,WinDbg一类的调试器附加进程,可以得到你想要的模块以及对应函数的地址。

  希望这些对您有些帮助。
2011-12-25 14:40
0
雪    币: 31
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
thanks hackerlzc.
刚刚才看到.这段代码是没问题的.


	//在申请内存存放要加载的DLL文件路径
	PWSTR pszDllName = (PWSTR)VirtualAllocEx(hProcess, NULL, sizeof(szDllName), 
		MEM_COMMIT, PAGE_READWRITE);

	if (pszDllName == NULL)
	{
		AfxMessageBox(_T("VirtualAllocEx Error."));
		CloseHandle(hProcess);
		return;
	}

	//这里要把pszDllName空白的字节去掉
	int cch = 1 + lstrlen(szDllName);
	int cb = cch * sizeof(TCHAR);

	
	WriteProcessMemory(hProcess, pszDllName, szDllName, cb, NULL);


	PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
		GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");

	
	if (pfnThreadRtn == NULL)
	{
		AfxMessageBox(_T("Get LoadLibrary Error."));
		VirtualFreeEx(hProcess, pszDllName, 0, MEM_RELEASE);
		CloseHandle(hProcess);
		return;
	}
	

	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, 
		pfnThreadRtn, pszDllName, 0, NULL);
	
	if (hThread == NULL)
	{
		AfxMessageBox(_T("CreateRemoteThread Error."));
		VirtualFreeEx(hProcess, pszDllName, 0, MEM_RELEASE);
		CloseHandle(hProcess);
	}

	WaitForSingleObject(hThread, INFINITE);
	AfxMessageBox(_T("Sucess"));


由于意识中在GetProcAddress设置了断点.其实是WriteProcessMemory 返回的错误.
由于我是要远程线程中调用我的DLL,我的问题在WriteProcessMemory的
__in   SIZE_T nSize 参数不是dll路径的大小,而是在远程线程中申请的内存地址的大小.
再次感谢热心的帮助.
2011-12-25 15:29
0
游客
登录 | 注册 方可回帖
返回
//