找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7836|回复: 8

64位内联hook,求帮助,求救。

[复制链接]

4

主题

58

回帖

0

精华

铜牌会员

积分
248
发表于 2013-4-28 16:13:02 | 显示全部楼层 |阅读模式
本帖最后由 chess0726 于 2013-4-28 16:36 编辑

这几天在玩64位系统的驱动了,和32位,好多不熟悉的。

关于内联hook,很想死。

hook 了 IopCreateFile 函数头之后
  1. nt!IopCreateFile:
  2. fffff800`01bcc5a0 ff2500000000            jmp     qword ptr [nt!IopCreateFile+0x6 (fffff800`01bcc5a6)]  // jmp 到下面的数据组成的地址

  3. fffff800`01bcc5a6 50                      push    rax
  4. fffff800`01bcc5a7 94                      xchg    eax,esp
  5. fffff800`01bcc5a8 da0b                    fimul   dword ptr [rbx]
  6. fffff800`01bcc5aa 80f8ff                  cmp     al,0FFh
  7. fffff800`01bcc5ad ff4889                  dec     dword ptr [rax-77h]
  8. fffff800`01bcc5b0 4c2408                  and     al,8
  9. fffff800`01bcc5b3 53                      push    rbx
复制代码
调试跟到了自己的函数,call 被保存时的代码:
  1. fffff880`0bda950e  mov edx,dword ptr [rsp+98h]
  2. fffff880`0bda9515  mov rcx,qword ptr [rsp+90h]
  3. fffff880`0bda9515  mov rcx,qword ptr [rsp+90h]
  4. fffff880`0bda951d  [color=Red]call rax        // rax=fffff8800bdab118[/color]
  5. fffff880`0bda951f  add rsp,88h
复制代码
跟到:
  1. 1: kd> u rax
  2. fffff880`0bdab118 4c894c2420              mov     qword ptr [rsp+20h],r9
  3. fffff880`0bdab11d 4c89442418              mov     qword ptr [rsp+18h],r8
  4. fffff880`0bdab122 89542410                mov     dword ptr [rsp+10h],edx
  5. fffff880`0bdab126 ff2500000000            jmp     qword ptr [fffff880`0bdab12c]
  6. fffff880`0bdab12c ae                      scas    byte ptr [rdi]
  7. fffff880`0bdab12d c5                      ???
  8. fffff880`0bdab12e bc0100f8ff              mov     esp,0FFF80001h
  9. fffff880`0bdab133 ff00                    inc     dword ptr [rax]
复制代码
这里时  fffff880`0bdab118 4c894c2420              mov     qword ptr [rsp+20h],r9 这句指令一运行就跳到
nt!RtlpBreakWithStatusInstruction 这个函数去,之后就蓝屏了。

我可以确认 r9 和rsp的值是正常的。

这里和系统函数差别大点的就是这里的 rsp 的地址的高位是  fffff880 ,面系统的是 fffff800,但是自己接管了函数,所以堆栈肯定是在自己的领域的啊?   

在跳到nt!RtlpBreakWithStatusInstruction 时 WinDbg显示  

*** Fatal System Error: 0x000000fc
                       (0xFFFFF8800BDAB118,0x800000003CDF7963,0xFFFFF8800C3C78F0,0x0000000000000002)


fffff880`0bdab118 4c894c2420              mov     qword ptr [rsp+20h],r9 这条指令为什么不能被执行?试了好几天了,都是这样,想不通,求解释。

4

主题

58

回帖

0

精华

铜牌会员

积分
248
 楼主| 发表于 2013-4-28 16:33:53 | 显示全部楼层
这里, 我只是保存了 头部的 14个字节。 自己处理完后, 又恢复那这14个字节的指令
fffff880`0bdab118 4c894c2420              mov     qword ptr [rsp+20h],r9
fffff880`0bdab11d 4c89442418              mov     qword ptr [rsp+18h],r8
fffff880`0bdab122 89542410                mov     dword ptr [rsp+10h],edx

之后跳转回去的数据是不对齐的, 是这里的原因吗?  在32位里,他会自己读4个数据字节的数据的啊?
在原函数里,这么字,他又可以根据 jmp ptr [] 这指令之后的数据跳到我的函数去,为什么跳回去时,会报错?

4

主题

58

回帖

0

精华

铜牌会员

积分
248
 楼主| 发表于 2013-4-28 17:14:30 | 显示全部楼层
在自己的函数里, 全 return 0.  然后,输出 ObjectAttributes->ObjectName 是可以运行的,说明代码没有错误,  但如果是 jmp 到恢复指令的地址运行,就蓝屏了,怎么可以有这么痛的蓝屏的,让rip执行的的指令也是对的, 用  用windbg 的 eq 给那个寄存器赋值也正常, 恢复的指令也是正常的,求解释~~~

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2013-4-28 19:59:13 | 显示全部楼层
你的指令顺序是不是有问题?我在VM里看到的指令顺序:
  1. nt!IopCreateFile:
  2. fffff800`019d22d0 4c894c2420      mov     qword ptr [rsp+20h],r9
  3. fffff800`019d22d5 89542410        mov     dword ptr [rsp+10h],edx
  4. fffff800`019d22d9 48894c2408      mov     qword ptr [rsp+8],rcx
复制代码
其实流程你不明白吗?
头14字节改jmp跳到代理函数,不足填NOP凑够14字节,代理函数处理结束后,跳到任意一个地方执行完头14字节,然后跳到IopCreateFile+14的地方执行。我的意思是,你确保没有截断指令???我觉得唯一的可能就是你截断了指令,所以才出现“return 0正常,返回原函数不正常”的情况。
另外,你玩这个把戏的时候,破解了内核没有???

4

主题

58

回帖

0

精华

铜牌会员

积分
248
 楼主| 发表于 2013-4-28 20:45:03 | 显示全部楼层
Tesla.Angela 发表于 2013-4-28 19:59
你的指令顺序是不是有问题?我在VM里看到的指令顺序:其实流程你不明白吗?
头14字节改jmp跳到代理函数,不 ...

又是版主来帮忙,谢谢啊。

我的代码是这么写的
void InLineHookEngine(void* TargetProc,void* NewProc,OUT void* l_OldProc,int bytescopy)
{
//bytescopy ==14      因为要破坏14个字节,所以 最少要保存 14个字节

        KIRQL Irql;
        ULONG64 funAddr=0;

        UCHAR jmp_code[]="\xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFFX\xFF\xFF\xFF\xFF";
        int codelen=14;
       
        Irql=WPOFFx64();
        //恢复代码并跳到相应的位置
        funAddr=(ULONG64)TargetProc +bytescopy;
        memcpy(jmp_code+6,&funAddr,8);
        memcpy(l_OldProc, TargetProc, bytescopy);
        memcpy((UCHAR*)l_OldProc+bytescopy,jmp_code,codelen);
        //跳到自己的代码处
        funAddr=(ULONG64)NewProc;
        memcpy(jmp_code+6,&funAddr,8);
        memcpy(TargetProc,jmp_code,codelen);
        WPONx64(Irql);
}


上面说的 return 0 , 是说在我自己的函数里, 先执行输出,在return 0.  然后是有输出的, 应该可以确定我跳到我的函数 这个hook 是没有问题的。

但一恢复他的代码时 也就是

        return((IOPCREATEFILE)(ULONG64*)g_IopCreateFileCode)(FileHandle, DesiredAccess,ObjectAttributes,
                IoStatusBlock,AllocationSize,FileAttributes,ShareAccess,Disposition,CreateOptions,
                EaBuffer,EaLength,CreateFileType,InternalParameters,Options,InternalFlags,DeviceObject);
       

这里,就出错了。  

g_IopCreateFileCode 的代码是
fffff880`0bdab118 4c894c2420              mov     qword ptr [rsp+20h],r9
fffff880`0bdab11d 4c89442418              mov     qword ptr [rsp+18h],r8
fffff880`0bdab122 89542410                mov     dword ptr [rsp+10h],edx
fffff880`0bdab126 ff2500000000            jmp     qword ptr [fffff880`0bdab12c]
fffff880`0bdab12c ae                      scas    byte ptr [rdi]
fffff880`0bdab12d c5                      ???
fffff880`0bdab12e bc0100f8ff              mov     esp,0FFF80001h
fffff880`0bdab133 ff00                    inc     dword ptr [rax]

然后, rip跳到 fffff880`0bdab118 这个地址,一执行,就错了。

4

主题

58

回帖

0

精华

铜牌会员

积分
248
 楼主| 发表于 2013-4-28 20:47:19 | 显示全部楼层
本帖最后由 chess0726 于 2013-4-28 20:52 编辑
Tesla.Angela 发表于 2013-4-28 19:59
你的指令顺序是不是有问题?我在VM里看到的指令顺序:其实流程你不明白吗?
头14字节改jmp跳到代理函数,不 ...


关于 越狱, 应该是越了的, 不然我的驱动就加载不起来了。  是用 版主推举的那个工具破解的。

我的内核 的那个函数的头部数据 是
Command> u IopCreateFile
0xFFFFF80001B995A0  4C894C2420                      mov [rsp+0x20], r9
0xFFFFF80001B995A5  4C89442418                      mov [rsp+0x18], r8
0xFFFFF80001B995AA  89542410                        mov [rsp+0x10], edx
0xFFFFF80001B995AE  48894C2408                      mov [rsp+0x8], rcx
0xFFFFF80001B995B3  53                              push rbx
0xFFFFF80001B995B4  56                              push rsi
0xFFFFF80001B995B5  57                              push rdi
0xFFFFF80001B995B6  4154                            push r12

4

主题

58

回帖

0

精华

铜牌会员

积分
248
 楼主| 发表于 2013-4-28 21:55:20 | 显示全部楼层
解决了...   换了个方式,没有用这个方法。 谢谢版主帮忙。

评分

参与人数 1水晶币 +60 收起 理由
Tesla.Angela + 60 祝贺你自己解决问题

查看全部评分

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2013-4-28 22:34:49 | 显示全部楼层
解决了就好,本来HOOK就不是什么难事。
不过不建议在WIN64内核上使用HOOK,因为会引发蓝屏。


PS:从你的回复上看,就是觉得你截断了指令才导致出了问题。
你看一下这个贴(http://www.m5home.com/bbs/thread-7279-1-1.html),WIN64AST早期版本使用的INLINE HOOK引擎。

4

主题

58

回帖

0

精华

铜牌会员

积分
248
 楼主| 发表于 2013-4-28 23:07:34 | 显示全部楼层
Tesla.Angela 发表于 2013-4-28 22:34
解决了就好,本来HOOK就不是什么难事。
不过不建议在WIN64内核上使用HOOK,因为会引发蓝屏。

好的。 谢谢版主。 呵呵, 在64位驱动里,基本上是看版主的文章走过来的。  这个论坛又让我学到了很多东西。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表