本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 4366|回复: 8

Inline Hook为什么要用远跳转 [复制链接]

Rank: 2

发表于 2010-6-21 14:26:47 |显示全部楼层
FAR JMP     0xEA
JMP              0xE9

为什么R0 Inlinehook要用0xEA XXXXX
而RING3  Inlinehook要用0xE9 XXXXX

我在钩KiFastCallEntry函数,发现如果远JMP就蓝屏了,而论坛上有个大侠用0xE9就很正常。
代码应该没问题,其它函数HOOK都正常的。

我看了下段寄存器,默认的HOOK都是 0008:XXXXXX 为啥是这样的呢?

Rank: 1

发表于 2010-6-21 15:00:53 |显示全部楼层
蓝屏应该是不是近跳还是远跳的问题.远近跳在ring3,ring0都可以.

EA跳的话,0008后面的4字节是目的地址.补7个byte
E9跳的话,后面4字节是目的地址相对于当前地址的偏移.补5个byte
假设都是一次memcpy补,都是大于4byte的patch,我觉得7byte要比5byte蓝的几率大.
0008是内核态执行代码时候的CS寄存器,对应GDT中的第0x8个段选择子,低两位为0说明jmp到ring0代码段.
0008:xxxxxxxx组成一个描述ring0代码段的虚拟地址.

另:出来挂,迟早要蓝的.

Rank: 2

发表于 2010-6-21 15:52:04 |显示全部楼层
谢谢楼上,想给你分,但是我不会,只能把代码贴出来,帮帮其它同学。
吃了顿饭,回来之后竟然不蓝屏了,也忘了修改了什么地方了,遗憾,下次遇到这样的问题再来请教。

其实写这个代码是为了分析外挂(我不是写挂的,却是反挂的),想直接收集外挂调用的API,然后猜测、分析再保护自己。因为分析VM壳那简直.......所以想写个API TRACE
  1. 第一段代码,自己的处理函数
  2. __declspec(naked) void NewKiFastCallEntry2(void)
  3. {
  4.     __asm
  5.     {
  6.         pushad
  7.         mov    ulID, eax
  8.         push fs
  9.         
  10.         push 0x30
  11.         pop    fs            //修改FS寄存器
  12.     }
  13.    
  14.     DbgPrint( "MyKiFastCallEntry() Service ID: %X \\n", ulID );
  15.    
  16.     __asm
  17.     {
  18.         pop fs
  19.         
  20.         popad
  21.         jmp realKiFastCallEntry
  22.     }
  23. }
复制代码

第二段:开始IL_HOOK,realKiFastCallEntry 全局变量
  1.     __asm
  2.     {
  3.         PUSHAD
  4.         MOV    ECX, 0x176            //read the value of the IA32_SYSENTER_EIP register
  5.         RDMSR                    //RDMSR指令用于读取MSR寄存器,首先应该将要读的MSR的ID放入ECX寄存器,然后执行RDMSR指令,如果操作成功,返回值会被放入EDX:EAX中。
  6.         MOV    ulSysEnterAddress, EAX        //得到KiFastCallEntry地址
  7.         POPAD
  8.     }
  9.    
  10.     DbgPrint( "ulSysEnterAddress: 0x%08x", ulSysEnterAddress );
  11.    
  12.     InlineHook( (PVOID)ulSysEnterAddress,
  13.                 NewKiFastCallEntry2,
  14.                 &realKiFastCallEntry );
复制代码

第三段:
内存代码

1.原始 KiFastCallEntry
kd> u KiFastCallEntry
nt!KiFastCallEntry:
8053d710 b923000000      mov     ecx,23h
8053d715 6a30            push    30h
8053d717 0fa1            pop     fs
8053d719 8ed9            mov     ds,cx
8053d71b 8ec1            mov     es,cx

2.ILH 之后
  1. nt!KiFastCallEntry:
  2. 8053d710 eaf47b1f820800  jmp     0008:821F7BF4
  3. 8053d717 0fa1            pop     fs
  4. 8053d719 8ed9            mov     ds,cx
  5. 8053d71b 8ec1            mov     es,cx
复制代码

0008:821F7BF4:地址代码
  1. kd> u 821F7BF4
  2. 821f7bf4 ea902cbbf80800  jmp     0008:F8BB2C90
  3. 821f7bfb b923000000      mov     ecx,23h      <----在MyKiFastCallEntry返回这里
  4. 821f7c00 6a30            push    30h
  5. 821f7c02 ea17d753800800  jmp     0008:8053D717  ----->跳转到KiFastCallEntry+7
复制代码

F8BB2C90:代码
  1. __declspec(naked) void MyKiFastCallEntry(void)
  2. {
  3. ....
  4. ....
  5.        jmp realKiFastCallEntry ;           // = 821f7bfb
  6. }
复制代码


之后,调试器输出结果:

MyKiFastCallEntry() Service ID: 124E
MyKiFastCallEntry() Service ID: 97
MyKiFastCallEntry() Service ID: 19
MyKiFastCallEntry() Service ID: 8B
MyKiFastCallEntry() Service ID: 25
MyKiFastCallEntry() Service ID: B2
MyKiFastCallEntry() Service ID: E0
MyKiFastCallEntry() Service ID: B7
MyKiFastCallEntry() Service ID: 11
MyKiFastCallEntry() Service ID: 53
MyKiFastCallEntry() Service ID: E0
MyKiFastCallEntry() Service ID: B7
MyKiFastCallEntry() Service ID: AF
MyKiFastCallEntry() Service ID: 17
MyKiFastCallEntry() Service ID: F4
MyKiFastCallEntry() Service ID: 20
MyKiFastCallEntry() Service ID: 3B
MyKiFastCallEntry() Service ID: 5A
MyKiFastCallEntry() Service ID: 10E
MyKiFastCallEntry() Service ID: 10E
MyKiFastCallEntry() Service ID: 2
MyKiFastCallEntry() Service ID: E5
MyKiFastCallEntry() Service ID: 5A
MyKiFastCallEntry() Service ID: 2
MyKiFastCallEntry() Service ID: E5
MyKiFastCallEntry() Service ID: C4
MyKiFastCallEntry() Service ID: C8
MyKiFastCallEntry() Service ID: 5A
MyKiFastCallEntry() Service ID: 2
MyKiFastCallEntry() Service ID: E5
MyKiFastCallEntry() Service ID: 5A
MyKiFastCallEntry() Service ID: 2
MyKiFastCallEntry() Service ID: E5
MyKiFastCallEntry() Service ID: C4
MyKiFastCallEntry() Service ID: C8
MyKiFastCallEntry() Service ID: 5A

。。。。。

Rank: 2

发表于 2010-6-21 19:27:51 |显示全部楼层
出来挂的迟早要蓝屏,

Rank: 2

发表于 2010-6-21 22:31:25 |显示全部楼层
引用第1楼KiSSinGGer于2010-06-21 12:00发表的  :
蓝屏应该是不是近跳还是远跳的问题.远近跳在ring3,ring0都可以.

EA跳的话,0008后面的4字节是目的地址.补7个byte
E9跳的话,后面4字节是目的地址相对于当前地址的偏移.补5个byte
假设都是一次memcpy补,都是大于4byte的patch,我觉得7byte要比5byte蓝的几率大.
.......

好一个“出来挂,迟早是要蓝的”,呵呵

Rank: 1

发表于 2010-7-6 03:38:29 |显示全部楼层
学习了

mark一个

Rank: 1

发表于 2010-7-6 15:02:16 |显示全部楼层
学习了.TKS

Rank: 1

发表于 2010-7-11 15:11:48 |显示全部楼层
引用第3楼icezy于2010-06-21 16:27发表的  :
出来挂的迟早要蓝屏,
360应该很少蓝吧

Rank: 1

发表于 2010-10-23 02:23:04 |显示全部楼层
引用第1楼KiSSinGGer于2010-06-21 12:00发表的  :
蓝屏应该是不是近跳还是远跳的问题.远近跳在ring3,ring0都可以.

EA跳的话,0008后面的4字节是目的地址.补7个byte
E9跳的话,后面4字节是目的地址相对于当前地址的偏移.补5个byte
假设都是一次memcpy补,都是大于4byte的patch,我觉得7byte要比5byte蓝的几率大.
.......
受教了~~~
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-26 15:04 , Processed in 0.026135 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部