分享

360安全卫士hookport.sys简单逆向——MyHookMgr数据结构

 昵称2034962 2010-07-06
MyHookMgr数据结构

MyHookMgr是一个大小为0x5DDC的巨大结构,是360挂钩中的一个重要数据,它记录了挂钩函数的原地址、代理函数地址及相应函数是否挂钩的标志位。

它的数据结构是这样的:

struct MyHookMgr{

         DWORD ssdtSize;                                                  //ssdt大小

         DWORD ssdtOriginFunc[1001];                         //ssdt对应的原函数地址

DWORD ssdtFakeFunc[1001];                            //ssdt对应的代理函数地址

DWORD shadowSsdtOriginFunc[1001];           //ssdtShadow原函数地址

DWORD shadowSsdtFakeFunc[1001];              //ssdtShadow代理函数地址

DWORD ssdtSwitch[1001];                                 //ssdt代理函数开关

DWORD shadowSsdtSwitch [1001];                  //ssdtShadow代理函数开关

};

ssdtSize是ssdt的大小,这个域被用的并不多,这里不做过多解释。
SsdtOriginFunc和shadowSsdtOriginFunc数组分别包含了两个表中所有的原函数地址。但这个域在初始化时并没有被填写,在 过滤函数真正开始工作时才逐渐被代理函数填写完毕。
ssdtFakeFunc和shadowSsdtFakeFunc是对应的代理函数表,初始化时被填写。
ssdtSwitch和shadowSsdtSwitch是代理函数开关,为1时代表函数被挂载,为0时直接执行原始函数,不进行过滤,初始化时所有开关 均置0。
结构中的6个数组都是以ssdt编号作为索引的,由于win7的ssdtShadow表函数最多——827个,所以这里使用了足够大的数组保证稳定,当然 这里浪费了一些内存。

关于SSDT编号的获取有两种方法,对于导出函数,因为其形式都如:

ntdll!ZwSetEvent:

7c92e570 b8db000000      mov     eax,0DBh             ;0DBh就是ssdt编号

7c92e575 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)

7c92e57a ff12            call    dword ptr [edx]

7c92e57c c20800          ret     8

7c92e57f 90              nop


从第一条指令中就可以读取ssdt索引了。
对于未导出函数360使用了根据操作系统进行硬编码的方式。(详情见IDB文件)


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多