首页
社区
课程
招聘
[原创]Ring3层Native API hook 的实现
发表于: 2010-7-12 00:22 14536

[原创]Ring3层Native API hook 的实现

2010-7-12 00:22
14536

系统:Windows Xp sp3
工具:OD, vs 2008

前几天看到这篇帖子http://bbs.pediy.com/showthread.php?p=833045#post833045让我想来试着hook 一下native api

毋庸置疑,API hook在各种类型项目中使用广泛,已经研究了长一段时间了。参考文献1可以说是APIhook的一个综述。其中主要讲了Ring3层的hook。Ring0层hook难度要大点,驱动程序的稳定性也不能保证,所以我现在还没有勇气去搞驱动层的hook。

关于ring0 api hook 可以参考文献2. 其中详细的讲解了怎样编写驱动程序进行API hook,包含源码。这里主要说Ntdll.dll中的Native API 的hook。Ntdll.dll中函数在window Xp系统中形如:
7C92DF7E >  B8 12010000     mov eax,112                              ; ZwWriteFile
7C92DF83    BA 0003FE7F     mov edx,7FFE0300
7C92DF88    FF12            call dword ptr ds:[edx]                  ; ntdll.KiFastSystemCall
7C92DF8A    C2 2400         retn 24
在windows 2000中有所不同.

hook的基本思路是:修改函数入口处的第5——12字节,既是把
7C92DF83    BA 0003FE7F     mov edx,7FFE0300
7C92DF88    FF12            call dword ptr ds:[edx]                  ; ntdll.KiFastSystemCall
修改成:
mov edx,[自定义的hook函数地址]
call edx
修改后的代码如下:
7C92DF7E >  B8 12010000     mov eax,112                              ; ZwWriteFile
7C92DF83    BA 0003FE7F     mov edx,xxxxxxxx                 ;xxxxx是hook函数的地址,定义在你的dll中
7C92DF88    FF12            call edx                         ;call到你的hook函数中
7C92DF8A    C2 2400         retn 24
这个通过打内存补丁来实现,参考文献3。代码如下:

//这是该的看雪的源码
BOOL MemPatch(HANDLE hProcess,const DWORD PatchAddr,const DWORD PatchSize,const BYTE signData[],const BYTE NewData[])
{
	BYTE ReadBuffer[128]={0};
	BOOL bConntiuneRun=TRUE;
	DWORD Oldpp;
	int cnt = 0;
	while (bConntiuneRun)
	{
		cnt++;
		/*	ResumeThread(pi.hThread);
		Sleep(1000);
		SuspendThread(pi.hThread);*/
		ReadProcessMemory(hProcess,(LPVOID)PatchAddr,&ReadBuffer,2,NULL);//读2个字节来比较
		if (!memcmp(signData,ReadBuffer,2))
		{
			VirtualProtectEx(hProcess,(LPVOID)PatchAddr,PatchSize,PAGE_EXECUTE_READWRITE,&Oldpp);
			WriteProcessMemory(hProcess,(LPVOID)PatchAddr,NewData,PatchSize,0);
			bConntiuneRun = FALSE;
		}
		else if(cnt>5)
			break;
	}
	//ResumeThread(pi.hThread);
	//CloseHandle(pi.hProcess);pi.hProcess=0;
	//CloseHandle(pi.hThread);pi.hThread=0;
	if(cnt>5)
		return FALSE;
	else
		return TRUE;
}

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

收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
似乎很依赖系统版本,还使用了硬编码。但作为自己研究还是很不错的!
2010-7-12 02:01
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
1.试试detours等函数指令长度计算库,避免了硬编码.
2.hook user api和hook native api并无区别,都在ring3,都是针对特定进程有效.
2010-7-12 09:55
0
雪    币: 324
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
4
使用detours hook过上层的API,能不能hook 到native api 还没有试过,也没有看到过。
2010-7-12 10:33
0
雪    币: 352
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
轻松路过·!留个脚印·!
2010-7-12 11:40
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我觉得应该是可以的,本质都是inline
我也没用detours hook过native api,不过弄过CreateProcessInternalW
需要自己用GetProcAddress得到原地址,然后就跟其他上层API比如OpenProcess之类的没区别了
2010-7-12 12:48
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这兄弟说得好,都在ring3意义不大
2010-7-12 17:41
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习学习~
2010-12-20 22:10
0
雪    币: 611
活跃值: (251)
能力值: ( LV12,RANK:390 )
在线值:
发帖
回帖
粉丝
9
detour可以hook native api
2010-12-21 17:10
0
游客
登录 | 注册 方可回帖
返回
//