首页
社区
课程
招聘
[原创]ring3下的Inline hook
发表于: 2013-3-28 22:03 15282

[原创]ring3下的Inline hook

2013-3-28 22:03
15282

inline hooking
      在IAT hook的时候,如果遇到延迟绑定,即使再IAT hook GetProcAddress,也会使得本来很简单的事情,看起来是那么的复杂。那么有没有一种更好的方法来避免DLL延迟绑定的问题,答案是肯定有的,inline hook会是一种不错的选择。
Inline Hook通过硬编码的方式修改目标函数的内存空间(通常是开始的一段字节,且一般在第一个call之前,很多时候是第一个字节,这么做是主要是为了防止堆栈混乱,如果能够处理好堆栈问题,放在哪个位置都是无所谓的),写入跳转语句,跳转到对应的函数空间里去。这样,该目标函数只要被调用,程序就会跳转到我们的函数中来,我们在自己写的函数里需要完成2个问题:
    1)处理好堆栈平衡。在程序流程中,堆栈的平衡是非常的重要,如果inline hook写入的是call语句,那么需要针对函数是否在函数里面做好了堆栈平衡做相应的处理,所以既要保证返回到目标函数中(如果写入的是jmp语句,就不需要),也要保证目标函数能在顺利执行完毕后返回到我们的函数中来。
    2)执行被覆盖的指令。我们向目标函数地址空间些如跳转指令(jmp xxxxxxxx)时,势必要覆盖原先的一些汇编指令,所以我们一定要保证这些被覆盖的指令能够顺利执行。关于这部分指令的执行,一般是将其放在我们的函数中,让我们的函数“帮助”目标函数执行完被覆盖的指令,然后再跳回目标函数中被覆盖内后后的地址继续执行剩余内容。跳回去的时候,一定要算好是跳回到什么地址,是目标函数起始地址后的第几个字节。最好的处理方法就是跳回去之前,还原之前被覆盖的汇编指令。

如下分析所示:

Before hook:
INT Func()						INT Func()
{								{
	return 10;						mov eax, 0xA
									ret
}								}

After hook:
INT Func()						INT Func()
{								{                       
	ReplaceFunc;						jmp 0xXXXXXX;         
									ret                   
}								}                       
VOID ReplaceFunc(VOID)
{
	::MessageBox(NULL, "hello world!", "", MB_OK);
	HookStatus(false, g_TargetFuncAddr);
	//return fnTestDll();
}

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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
????怎么跑这来发了.
2013-3-29 00:20
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
如何检测inline hook和iat hook呢
2013-3-29 09:38
0
雪    币: 149
活跃值: (150)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
IAT hook检测可以枚举输入表的导入函数地址与GetProcAddress获取的地址比较一下,不同为HOOK

inline hook检测
最简单的是抓取函数头的少部分字节进行对比,不同为HOOK
也可以对该函数先进行控制流分析,获得所有的BB块(基本块)进行对比,不同为HOOK
在高级点的就是进一步反编译出来,伪代码也可以,相同的二进制代码在反编译引擎得到的高级语言肯定一样的,不同为HOOK
2013-3-29 10:11
0
雪    币: 97697
活跃值: (200759)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
Thanks for share.
2013-3-29 11:29
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
当目标没有足够空间的时候,可以用0xEB构造短跳去一个有空间的临近位置再jmp或者call
2013-3-29 11:33
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
连发两个精华帖,楼主是个有故事的人
2013-3-29 12:55
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我想楼主对于x64下inline hook有什么看法
2013-3-29 23:38
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
9
hot patch那意思
2013-4-1 11:40
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
10
终于看到了inline hook了,谢谢,学习了
2013-4-3 14:45
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习~~~~支持
2013-4-7 09:27
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mark
2014-1-16 16:57
0
雪    币: 63
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
讲解的也太浅显了吧,而且执行代码也不是你能随便就修改的,你用RtlCopyMemory肯定会BSoD的!
2014-2-17 11:36
0
游客
登录 | 注册 方可回帖
返回
//