首页
社区
课程
招聘
[原创]QQ电脑管家中的TsFltMgr Hook框架分析
发表于: 2012-2-6 17:43 35887

[原创]QQ电脑管家中的TsFltMgr Hook框架分析

2012-2-6 17:43
35887

QQ电脑管家中的TsFltMgr Hook框架分析

新版的QQ电脑管家中多了一个名字叫TsFltMgr.sys的驱动(应该是Sysnap大牛开发的,膜拜),对该驱动进行了一些简单的分析,看见了一套漂亮的Hook框架,发出来与大家分享。分析不对的地方请多多包涵。

首先TsFltMgr挂钩了KiFastCallEntry函数,Hook点在这里:

kd> u KiFastCallEntry+e3
nt!KiFastCallEntry+0xe3:
8053dbb3 c1e902        shr     ecx,2
-------------------------------------------------------------------------
8053dbb6 90            nop
8053dbb7 90            nop
8053dbb8 90            nop
8053dbb9 e962170c77    jmp     TsFltMgr+0x2320 (f75ff320)
-------------------------------------------------------------------------
8053dbbe 0f83a8010000  jae     nt!KiSystemCallExit2+0x9f (8053dd6c)
8053dbc4 f3a5          rep movs dword ptr es:[edi],dword ptr [esi]
8053dbc6 ffd3          call    ebx
// 保存现场
pushfd        
pushad        

// 调用 KiFastCallEntry_Filter 函数,实现过滤
push edi                    // 本次系统调用对应的SysCall Table的地址(SSDT或SSDTShadow的地址)
push ebx                    // 本次系统调用在SysCall Table中对应的内核函数地址
push eax                    // 本次系统调用对应的内核函数在SysCall Table中的功能号
call KiFastCallEntry_Filter // 调用KiFastCallEntry_Filter,实现过滤
mov  [esp+10h], eax         // 更改本次调用对应的内核函数地址!

// 恢复现场
popad        
popfd

// 执行 KiFastCallEntry 函数中被替换掉的指令,并跳回原函数
mov     edi,esp
cmp     esi, g_7fff0000
push    g_JmpBack
ret
ULONG __stdcall KiFastCallEntry_Filter(ULONG ulSyscallId, ULONG ulSyscallAddr, PULONG pulSyscallTable) 
{
    PFAKE_SYSCALL pFakeSysCall = NULL;

    if ( ulSyscallId >= 0x400 ) 
        return ulSyscallAddr;

    if ( pulSyscallTable == g_KiServiceTable && ulSyscallId <= g_ServiceNum/* 0x11c */ ) 
    {
        pFakeSysCall = g_FakeSysCallTable[ulSyscallId];        // SSDT
    }
    else if (pulSyscallTable == g_KeServiceDescriptorTable && 
             g_KeServiceDescriptorTable && ulSyscallId <= g_ServiceNum/* 0x11c */)
    {
        pFakeSysCall = g_FakeSysCallTable[ulSyscallId];        // SSDT
    }
    else if (pulSyscallTable == g_W32pServiceTableAddr && ulSyscallId <= g_ShadowServiceNum/* 0x29b */)
    {
        pFakeSysCall = g_FakeSysCallTable[ulSyscallId + 1024]; // ShadowSSDT
    }

    if ( pFakeSysCall && pFakeSysCall->ulFakeSysCallAddr )
    {
        pFakeSysCall->ulOrigSysCallAddr = ulSyscallAddr;
        return pFakeSysCall->ulFakeSysCallAddr;
    }
    return ulSyscallAddr;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (46)
雪    币: 143
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
广告位出租~  
2012-2-6 17:57
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
3
膜拜一个先,自己逆向烂啊
2012-2-6 18:13
0
雪    币: 822
活跃值: (380)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
4
漂亮的框架。。。和360的HookPort有什么区别
2012-2-6 18:55
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
5
其实只是分析了一点,没说出整体框架。

还有为啥是
8053dbb6 90            nop
8053dbb7 90            nop
8053dbb8 90            nop
8053dbb9 e962170c77    jmp     TsFltMgr+0x2320 (f75ff320)
前面3个NOP有神马好处
2012-2-6 19:11
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
占位围观!!
2012-2-6 19:38
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
前排膜拜大牛分析
2012-2-6 19:42
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
凑两个双字,猜测。sys现在也到ZMCPB打酱油了?
2012-2-6 19:45
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
数了下,就差两个人就全员到齐了
2012-2-6 19:46
0
雪    币: 66
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
字母在LZ的帮助下向数字看齐了
2012-2-6 19:55
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
凑俩字节可以放后面吧,猜不到
2012-2-6 19:56
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
12
NO,前面3个NOP是有意图的
2012-2-6 19:59
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
13
还有二个神秘指令,等你挖掘下啊
2012-2-6 20:25
0
雪    币: 33
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
3个nop 意味着想要3个妹子 ,  呵呵
2012-2-6 20:27
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
如果在这个地方hook的话,后面系统的更新估计也要随着改动了,前面那五个字节不错,貌似MS的各个版本都没变过。
其实也可以考虑前面五个字节的前面 …… 不过我考虑的可能比较局限,还有很多要考虑的……
想了下,还是没想出来那三个NOP的作用,没跟上大牛的步伐啊
2012-2-6 20:37
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
三个妹纸
2012-2-6 20:40
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
17
nop掉mov edi,esp是为了直接使用edi的值?
合理的hook部分就是从 mov     ebx,dword ptr [edi+eax*4]之后到call    ebx之前,但要过滤,最好保留edi值,而前面的部分被hookport占了,所以把mov edi,esp 这句放在过滤后面。

呃,刚受JeTus提醒
8053d7ec 8b3f            mov     edi,dword ptr [edi]
8053d7ee 8b1c87          mov     ebx,dword ptr [edi+eax*4]

这里也可以hook,没太注意。KiFastCallEntry里的hook空间不多了啊~~
2012-2-6 20:43
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
18
这个算不算一处神秘指令:
SuperHook proc near

arg_0= dword ptr  8
arg_4= dword ptr  0Ch
arg_8= dword ptr  10h

push    ebp
mov     ebp, esp
push    edi
push    ebx
push    edx
mov     edi, [ebp+arg_0]
mov     eax, [edi]
mov     edx, [edi+4]
mov     ebx, [ebp+arg_4]
mov     ecx, [ebp+arg_8]
mov     edi, [ebp+arg_0]
lock cmpxchg8b qword ptr [edi]
pop     edx
pop     ebx
pop     edi
mov     ebp, esp
pop     ebp
retn    0Ch
SuperHook endp

为了保证原子操作,使用了 lock cmpxchg8b 指令
2012-2-6 20:59
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
19
ZMCPB是啥?
2012-2-6 21:04
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
20
实际更改内存的函数如下:
SuperHook proc near

arg_0= dword ptr  8
arg_4= dword ptr  0Ch
arg_8= dword ptr  10h

push    ebp
mov     ebp, esp
push    edi
push    ebx
push    edx
mov     edi, [ebp+arg_0]
mov     eax, [edi]
mov     edx, [edi+4]
mov     ebx, [ebp+arg_4]
mov     ecx, [ebp+arg_8]
mov     edi, [ebp+arg_0]
lock cmpxchg8b qword ptr [edi]
pop     edx
pop     ebx
pop     edi
mov     ebp, esp
pop     ebp
retn    0Ch
SuperHook endp


将三个 nop 放在 jmp 前面莫非是为了设计SuperHook函数的调用接口?因为这样在任何地方需要调用 SuperHook 进行 hook 时可以统一这样来调用:

SuperHook(dwHookPoint, 0xe9909090, dwOffSet);

其中 dwOffSet 就是从 dwHookPoint 要跳转到的相对偏移(dwOffSet = new - dwHookPoint - 8)。

不知道这个原因对不对……
2012-2-6 21:35
0
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
那三个nop跟360有关吧....我猜
2012-2-7 02:07
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
22
也有可能是给360多腾点地方,万一360突然要用7字节jmp呢
2012-2-7 09:05
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
23
额 多贴点 nt api的处理过程函数啊 看看有没有啥xx没
2012-2-7 09:12
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
膜拜....坐等解释...
2012-2-7 09:45
0
雪    币: 2290
活跃值: (2180)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
25
伟哥,亲。很久么见,想屎你啦。
2012-2-7 09:54
0
游客
登录 | 注册 方可回帖
返回
//