首页
社区
课程
招聘
关于Detours的几个使用问题
发表于: 2014-8-13 11:44 8489

关于Detours的几个使用问题

2014-8-13 11:44
8489
本人初学detours hook技术,有几个问题一直搞不懂,希望有相关经验的大牛指点,谢谢!
1、如何将自己生产的替换函数库**.dll注入到已经存在的某个进程中,以实现API hook,detours 3.0后DetourCreateProcessWithDll是创建新进程时注入,但我想要注入到已经存在的进程中。
2、如何用Detours hook第三方(非微软)的动态库中的API函数,如某进程A.exe调用第三方动态库b.dll中的某个func,如何用detour hook b.dll中的func

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感脚,还是自定义函数Hook好一点,其他的库无非是你家替你做一部份工作而已
2014-8-13 11:50
0
雪    币: 3532
活跃值: (1862)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
3
1.将你的dll注入到目标进程,在dll的dllmain里hook。
2.自己看example
2014-8-13 12:34
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢回复
我现在的问题是如何把dll注入到一个已经存在的进程中,detours中withdll的例子是创建新进程时注入,没有向已经存在的进程中注入的例子。
还请高手再提示细致一点
2014-8-13 16:13
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

标准办法
第一步,用NtOpenProcess打开进程
第二步,用VirtualAllocEx分配空间,记得要参数MEM_COMMIT,
第三步,GetProcAddress得到对方进程模块Kernel32" 的 “LoadLibraryA"函数
第四步,用WriteProcessMemory写入得到的地址
第五步,CreateRemoteThread建立线程执行。

内存写入型办法,你去看PE的相关资料才能理解,一句两句讲不清,涉及病毒原理的东西,一讲一大堆,呵呵
够清楚了吧,亲,分给我吧。嘿嘿
2014-8-13 17:29
0
雪    币: 2747
活跃值: (1097)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
楼上远程线程注入的具体实现,剩下的自己弄吧
BOOL CInjectTestDlg::injectDllToProcess(void)
{
	BOOL bOk = FALSE; // Assume that the function fails
	HANDLE hProcess = NULL, hThread = NULL;
	PCSTR pszLibFileRemote = NULL;

	UpdateData(TRUE);
	do 
	{
		hProcess = OpenProcess(
			PROCESS_QUERY_INFORMATION |   // Required by Alpha
			PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
			PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
			PROCESS_VM_WRITE,             // For WriteProcessMemory
			FALSE, m_processID);
		if (hProcess == NULL) break;

		PCSTR dllName =  m_DllName.GetBuffer(m_DllName.GetLength());

		//在目标程序开辟内存
		pszLibFileRemote = (PCSTR) 
			VirtualAllocEx(hProcess, NULL,strlen(dllName)*sizeof(CHAR)+1, MEM_COMMIT, PAGE_READWRITE);
		if (pszLibFileRemote == NULL) break;

		//将dll路径全名写入目标内存
		if (!WriteProcessMemory(hProcess, (LPVOID)pszLibFileRemote, 
			(PVOID)dllName, strlen(dllName)*sizeof(CHAR)+1, NULL)) 
		{
			//	m_DllName.ReleaseBuffer();
			break;
		}

		//启动目标线程并让其执行LoadLibraryA
		PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
			GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
		if (pfnThreadRtn == NULL) break;

		hThread = CreateRemoteThread(hProcess, NULL, 0, 
			pfnThreadRtn, (LPVOID)pszLibFileRemote, 0, NULL);
		if (hThread == NULL) break;

		// 等待程序结束
		WaitForSingleObject(hThread, INFINITE);

		if (pszLibFileRemote != NULL) 
			VirtualFreeEx(hProcess, (LPVOID)pszLibFileRemote, 0, MEM_RELEASE);

		if (hThread  != NULL) 
			CloseHandle(hThread);

		if (hProcess != NULL) 
			CloseHandle(hProcess);
		bOk = TRUE;

	} while (FALSE);
	if(bOk)
	{
	//	MessageBox("注入成功",NULL,MB_OK);
	}
	else
	{
		MessageBox("注入失败",NULL,MB_OK);
	}
	return bOk;
}
2014-8-13 20:38
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
就是楼上这段代码,我犯懒,莫找源代码,直接说原理了。
2014-8-13 21:19
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
setdll
2014-8-14 10:19
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢dppdpp,
这个方法我使用了,怎么在win7下CreateRemoteThread执行不成功,返回NULL,我又懵了
2014-8-14 16:35
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢xhbuming
我回去测一下在win7下行不行,我的代码基本上和你的一致,但CreateRemoteThread执行不成功,是什么原因我也不知道,希望赐教!
2014-8-14 16:38
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
CreateRemoteThread(进程句柄(保证已打开),0,0,(对方进程函数地址,保证不为零),(对方进程参数地址,保证不为零),0,0);

必须能行的噢。除非有保护啥的。
2014-8-14 17:25
0
雪    币: 2747
活跃值: (1097)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
首先看一下是否是因为权限问题,其次是动态库是否调用了User32里面的API而没有导入这个动态库(可以随便找一个dll尝试下是否注入成功)。
都不行那就只有单步看一下喽~
2014-8-14 22:09
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
有可能是权限问题,那权限提到SE_DEBUG_NAME等级看看,我记着不提也能执行来的。
2014-8-14 22:57
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
win7 创建远程线程:http://hi.baidu.com/hjxy_shell/item/578cebeb5f38842b4cdcaf4b
2014-8-14 23:22
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
原来如此,看来老知识要更新了。学习了
2014-8-14 23:53
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
哦,谢谢高人指点,下来好好研究一下!
2014-8-15 09:31
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
怎么把权限提到SE_DEBUG_NAME等级呢,呵呵,这方面初学,问题都比较白痴,见谅!
2014-8-15 09:33
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢寒江雪语,我的第一个问题解决了!怎么给你分啊?另外,怎么对MyCreateRemoteThread免杀啊?
2014-8-15 11:34
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
帖子发了2周,目前解决了第一个问题,第二个问题还没有得到完美解决,只形成了初步解决思路,希望有过Detour使用经历的大牛进来看看,重点帮忙解决劫持第三方动态库导出函数的问题。
2014-8-22 10:11
0
游客
登录 | 注册 方可回帖
返回
//