首页
社区
课程
招聘
[求助]KiFastCallEntry 调用号大于 0x1000的问题
发表于: 2012-12-22 23:27 4888

[求助]KiFastCallEntry 调用号大于 0x1000的问题

2012-12-22 23:27
4888
KiFastCallEntry 里面有

83c8838f 8bf8                    mov             edi,eax                // eax 系统调用号
83c88391 c1ef08                  shr             edi,8                // eax 除以 256 取整
83c88394 83e710                  and             edi,10h                // eax 是否大于 0x1000
83c88397 8bcf                    mov             ecx,edi                 // ecx 是0x00 或者 0x10

83c88399 03bebc000000            add             edi,dword ptr [esi+0BCh]       
                                // KThread.ServiceTable (KeServiceDescriptorTable or KeServiceDescriptorTableShadow)

83c8839f 8bd8                    mov             ebx,eax
83c883a1 25ff0f0000              and             eax,0FFFh                // 系统调用号是否 超过 0xFFF
83c883a6 3b4708                  cmp             eax,dword ptr [edi+8]        // 比较 KSYSTEM_SERVICE_TABLE.NumberOfService

83c883a9 0f8333fdffff            jae             nt!KiBBTUnexpectedRange (83c880e2)          // 调用号 异常

// 2

83c883af 83f910                  cmp             ecx,10h
83c883b2 751a                    jne             nt!KiFastCallEntry+0xce (83c883ce)        ----------------------------------
                                                                                                                                                      |
Win32:                                                                                                                                              |
                                                                                                                                                      |
83c883b4 8b8e88000000            mov             ecx,dword ptr [esi+88h]                // Teb: Ptr32 Void                      |       
83c883ba 33f6                    xor             esi,esi                                                                                              |       
83c883bc 0bb1700f0000            or              esi,dword ptr [ecx+0F70h]                // GdiBatchCount : Uint4B              |       
83c883c2 740a                    je              nt!KiFastCallEntry+0xce (83c883ce)                                                      |
83c883c4 52                      push            edx                                                                                                      |
83c883c5 50                      push            eax                                                                                                      |
83c883c6 ff154cd9da83            call            dword ptr [nt!KeGdiFlushUserBatch (83dad94c)]                                      |
83c883cc 58                      pop             eax                                                                                                      |
83c883cd 5a                      pop             edx                                                                                                      |
                                                                                                                                                      |
        <----------------------------------------------------------------------------------------------------

NoWin32:

然后 《Windows 内核情景分析》 里面说要看是 主表(KSERVICE_TABLE_DESCRIPTOR.ntoskrnl) 还是 副表(KSERVICE_TABLE_DESCRIPTOR.win32k) 要看 ecx 是否为 0x10 或者 0x00

只有在 调用号 大于 0x1000 ecx才会 为 0x10 啊。。。
Shadow SSDT 的调用号也没超过 0x1000 啊。。。何来的 eax > 0x1000 让 ecx 等于 0x10 调用副表。。。


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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我电脑上的Shadow SSDT都是大于0x1000
2012-12-23 00:55
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我是看 SSDT Shadow Hook 的调用号、都没超过 0x1000 啊。

您的是如何观测的。 求教
2012-12-23 02:09
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
一般说的调用叫 是减了0x1000的
事实上0x1000是代表第2个表
类似的可以自定义0x2000,ssdt表中预留了这个位置

GetDesktopWindow

上传的附件:
2012-12-23 14:25
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
0x1000+ 右移8位不就是变成 0x10+了么.当然是跟0x10对比啦.
2012-12-23 18:28
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=loqich;1127764]一般说的调用叫 是减了0x1000的
事实上0x1000是代表第2个表
类似的可以自定义0x2000,ssdt表中预留了这个位置

GetDesktopWindow

[/QUOTE]

多谢您的帮助

另外我还觉得有几句的注释不是太好,我改改:
83c88399 03bebc000000      add       edi,dword ptr [esi+0BCh]  
        // edi 指向 1. KeServiceDescriptorTable or KeServiceDescriptorTableShadow (由KThread.ServiceTable 决定)。2 是主表 KeServiceDescriptorTable.ntoskrnl/KeServiceDescriptorTableShadow.ntoskrnl 还是 副表KeServiceDescriptorTable.win32k/KeServiceDescriptorTableShadow.win32k (由 调用号是否大于 0x1000 决定)

83c8839f 8bd8              mov       ebx,eax
83c883a1 25ff0f0000        and       eax,0FFFh    // 保留 调用号(16进制表示)的低三位
83c883a6 3b4708            cmp       eax,dword ptr [edi+8]  // 比较 KSYSTEM_SERVICE_TABLE.NumberOfService
2012-12-23 21:16
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=DriverAsm;1127842]多谢您的帮助

另外我还觉得有几句的注释不是太好,我改改:
83c88399 03bebc000000      add       edi,dword ptr [esi+0BCh]  
        // edi 指向 1. KeServiceDescriptorTab...[/QUOTE]

不客气,我也是学习中,对驱动也不大了解
2012-12-24 00:57
0
游客
登录 | 注册 方可回帖
返回
//