首页
论坛
课程
招聘
[原创]Windows环境下基于Hook技术的调试器及其实现(含源码)
2011-9-6 22:05 38460

[原创]Windows环境下基于Hook技术的调试器及其实现(含源码)

2011-9-6 22:05
38460
Windows环境下基于Hook技术的调试器及其实现

    稍微了解Windows调试机制的朋友都知道,调试是受操作系统直接支持的,因而调试器在系统中就奠定了其特殊地位。这种调试事件的采集和分发都是由系统完成的。调试器正是通过系统定义的标准接口与调试子系统通信,达到调试的目的。

    众所周知,为了支持调试,在建立调试会话期间,系统会在内核和应用层启用各种公开和未公开的与调试相关的标志,而对这些标志的掌握情况将会直接影响调试器检测技术的效果(反调效果)。也因而,围绕这些调试和反调之间的较量便一发不可收拾了。甚至为了检测或隐藏标志,各种特定的内核驱动都被开发出来并投入使用(比如游戏保护等)。

    基于这样的现状,一个调试爱好者最希望的是什么呢?我是这样想的:“要是系统可以关闭所有调试相关的标志,但仍然可以支持调试就好了!”我想应该多数调试爱好者都有和我一样的心愿吧。然而,这样的美梦做做还可以,要想使这样的梦成为现实,还请劳烦您坚持看下去,我的废话是多了点,呵呵。

    然而,既要要系统支持调试,又要其不开启任何调试相关的标志是不可能的,因为系统正常的调试机制就需要这些标志(比如调试端口一类的)。因而为了实现我们的设想,我们得自己实现一个小型的调试子系统。这个子系统必须实现系统提供给调试器的标准接口API,这样一来,目前我们用到的调试器(本文指的都是三环调试器)几乎不用改动就可以正常的工作。

    实现一个小型调试子系统,关键点在于以下几个方面。一、捕获各类调试事件。二、构造相关的调试数据包。三、对目标进程实施有效而实时的控制。四、解决与调试器进程的同步以及通信问题。下面,我将对每个方面用到的原理做个简单的介绍。

    在调试事件采集部分,是主要的是异常捕获,其次是捕获模块加载/卸载,线程创建/结束事件。通过hook技术,SHE,VEH,我们可以捕获异常事件。特别指出,由于未启用系统调试会话,int 2D异常会分发给异常处理器,进而我们就可以捕获这个事件并传给目标的异常处理程序,达到躲避检测的目的。对于模块的加载/缷载事件,我们可以通过注册一些回调函数或是hook有关的函数(比如LdrLoadDll或ZwMapViewOfSection等)并做些处理达到目的。至于线程的创建/结束,和捕获模块事件类似,这里不详细介绍了。细节请参考源码。

    在数据包的构造环节,最主要的是认真阅读MSDN文档,严格按照说明构造相关的调试数据包,力求能够精确模仿原系统调试子系统构造的数据包。

    在对目标进程的控制方面,主要采用了我刚不久发的“再谈Dll隐藏”一文中所用到的方法,这里对其进行了一些改进。因为之前的前辈们的事迹知之甚少,所以自己想出这么一个方法来还兴奋不已,并在这时投入使用了。呵呵,坐井观天,让大家见笑了。求个原创原来是这么难啊!在目标进程中有我们的服务线程为调试器进程提供相关情报。如果要挂起目标进程,则必须挂起除我们的服务线程以外的所有其它线程(如果我们的服务线程挂起了,那可就全线冻结了)。

    最后一个让人头疼的问题便是与调试器进程的同步和通信问题了。原理是非常简单的,用事件内核对象进行同步。至于进程通信,方法有很多种。这里我是采用了一组内存映射文件进行数据交换的。至于这样使用是否合适,还坐等有经验的朋友们给指点一下。然而,虽说原理是这样简单,实现起来确没有想象的顺利。我目前上的一个“求助贴”就是这里给引出来的。构建多线程程序(再加上一堆hook)确实是件头疼的事情。目前,我的代码里还有不少bug,希望在大家的帮助下能够渐渐得到修正。

    以上是针对我们自己构建的调试子系统的简单介绍,接下来,我还想对本文提到的这个小项目再啰嗦几句。该项目主要由两大部分组成,一个是调试子系统的引擎——birdengine,它是被植入到目标进程中执行的。另一部分为一个OD插件——strawberrybird,该插件内含相关标准调试接口(API)的实现以及对OD的一些补丁操作。特别指出,birdengine生成的dll文件是以资源的形式包含在插件dll中的;开发编译以及测试环境为win7系统,在xp下的表现和win7略有不同,原因我也在探索中,如果有程序载入失败,建议试下附加功能;访插件针对的是OD标准1.10版,我不能保证与现在的OD改进版可以兼容,因为有内存补丁,大家在编译和测试的时候一定要注意,。此外,为了辅助调试,插件中增加了“断点内存保护”功能,防止在目标运行期间代码自修改恢复断点,插件还解决了OD设置硬件断点有时不能应用到所有线程的问题。下图是本插件工作框架示意图。



    再说明一点,本插件只是展示一种调试方法,它距完全实用还有一段很长的路要走。里边还有好多问题需要解决。由于本人也是菜鸟,水平实在有限,一些问题仍然无法得到理想的解决方案。这里我完全开源了,希望对调试爱好者们有所帮助,也希望这个东东在大家的努力下功能更加强大起来!

    最后,感谢仙果和教主在百忙中对我的点拨。正是他们的帮助才使我坚持把这个项目弄到这个程度。虽然还很不完善,不过我还是挺兴奋的。过程中学到了不少知识。仍然写上这句话,作为本文的结尾——“好好学习,天天向上”。


[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (44)
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
善良屠夫 活跃值 2011-9-6 22:38
2
0
天道酬勤 谢谢楼主
雪    币: 3219
活跃值: 活跃值 (471)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sisess 活跃值 1 2011-9-6 22:46
3
0
这个强呀
雪    币: 1356
活跃值: 活跃值 (363)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 活跃值 19 2011-9-6 23:09
4
0
是这样,我有一个建议,把这个项目做到code.google.com上去,做成一个真正的开源的项目,定期维护更新,这样你的收获会更多,而且有更多的人可以加入到这个项目中来。。。
雪    币: 1356
活跃值: 活跃值 (363)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 活跃值 19 2011-9-6 23:10
5
0
其中有一些使用说明并没有说清楚哈,建议也加上,更像一个开源的软件
雪    币: 242
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
qqjack 活跃值 1 2011-9-6 23:14
6
0
十分强悍,支持个,代码收下了
雪    币: 7506
活跃值: 活跃值 (298)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2011-9-6 23:17
7
0
楼主花了不少功夫啊,限于时间不能给予更多帮助,Sorry。。。
雪    币: 7162
活跃值: 活跃值 (441)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
joker陈 活跃值 2011-9-7 00:00
8
0
我是来学习的!
雪    币: 3
活跃值: 活跃值 (628)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lookzo 活跃值 2011-9-7 09:12
9
0
可惜是3环的子系统,还是支持一下
雪    币: 317
活跃值: 活跃值 (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
comealong 活跃值 2011-9-7 10:34
10
0
这个对目标程序影响太大, 而且太容易被检测到了
雪    币: 1619
活跃值: 活跃值 (61)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
hackerlzc 活跃值 10 2011-9-7 20:34
11
0
这个的被检测点就那么几个,同样的,通过对内存访问的控制,也很容易定位目标程序的检测代码所在位置。
雪    币: 264
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hackerxina 活跃值 2011-9-8 16:26
12
0
HOOK了目标这么一堆API,确实容易被发现,而且这些都是敏感API
雪    币: 1619
活跃值: 活跃值 (61)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
hackerlzc 活跃值 10 2011-9-8 17:03
13
0
看上去是一堆api,实际上是可以定制的。最关键的api只有一个,而且hook位置可以适当调整。如果做0环防护,可以暴露目标的反调试代码。目前,针对这样的反调试还不多,不过,以后就不一定了,呵呵。
雪    币: 39
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dahaione 活跃值 2011-9-9 09:03
14
0
嗯,这个不错,我自己一直也想写个自己的调试器,苦于技术积累不够,楼主的讲解很王道啊,mark先。
雪    币: 83
活跃值: 活跃值 (22)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
instruder 活跃值 4 2011-9-9 09:07
15
0
顶lz.....
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-9-9 15:41
16
0
还是现成的舒服
雪    币: 271
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wep 活跃值 2011-9-11 12:53
17
0
lz很强大、感谢分享。
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-9-12 00:48
18
0
天道酬勤 谢谢楼主
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumaren 活跃值 2011-9-12 08:25
19
0
很好,不错

mark一下
雪    币: 189
活跃值: 活跃值 (50)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
choday 活跃值 2 2011-9-13 20:51
20
0
激动中,这个东西,正是我一年前的想法,可我一直没有时间去实现,今天见有人实现,感动...
雪    币: 21
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
analytys 活跃值 2011-9-13 21:01
21
0
看了2遍,还不太理解楼主的思想,支持楼主,继续细读!
雪    币: 60
活跃值: 活跃值 (128)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
樊辉 活跃值 2011-9-13 22:27
22
0
暂时看不懂,先收藏。。。好好学习,天天向上!
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 活跃值 2011-9-13 22:56
23
0
希望楼主写一个单独的调试器
雪    币: 99
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
twoseconds 活跃值 2011-9-14 10:19
24
0
学习中。。感觉楼主
雪    币: 333
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
yarpee 活跃值 1 2011-9-14 10:27
25
0
先收藏,感谢楼主分享
游客
登录 | 注册 方可回帖
返回