chess0726 发表于 2013-4-28 16:13:02

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

本帖最后由 chess0726 于 2013-4-28 16:36 编辑

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

关于内联hook,很想死。

hook 了 IopCreateFile 函数头之后nt!IopCreateFile:
fffff800`01bcc5a0 ff2500000000            jmp   qword ptr // jmp 到下面的数据组成的地址

fffff800`01bcc5a6 50                      push    rax
fffff800`01bcc5a7 94                      xchg    eax,esp
fffff800`01bcc5a8 da0b                  fimul   dword ptr
fffff800`01bcc5aa 80f8ff                  cmp   al,0FFh
fffff800`01bcc5ad ff4889                  dec   dword ptr
fffff800`01bcc5b0 4c2408                  and   al,8
fffff800`01bcc5b3 53                      push    rbx
调试跟到了自己的函数,call 被保存时的代码:fffff880`0bda950emov edx,dword ptr
fffff880`0bda9515mov rcx,qword ptr
fffff880`0bda9515mov rcx,qword ptr
fffff880`0bda951dcall rax      // rax=fffff8800bdab118
fffff880`0bda951fadd rsp,88h 跟到:1: kd> u rax
fffff880`0bdab118 4c894c2420            mov   qword ptr ,r9
fffff880`0bdab11d 4c89442418            mov   qword ptr ,r8
fffff880`0bdab122 89542410                mov   dword ptr ,edx
fffff880`0bdab126 ff2500000000            jmp   qword ptr
fffff880`0bdab12c ae                      scas    byte ptr
fffff880`0bdab12d c5                      ???
fffff880`0bdab12e bc0100f8ff            mov   esp,0FFF80001h
fffff880`0bdab133 ff00                  inc   dword ptr
这里时fffff880`0bdab118 4c894c2420            mov   qword ptr ,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 ,r9 这条指令为什么不能被执行?试了好几天了,都是这样,想不通,求解释。

chess0726 发表于 2013-4-28 16:33:53

这里, 我只是保存了 头部的 14个字节。 自己处理完后, 又恢复那这14个字节的指令
fffff880`0bdab118 4c894c2420            mov   qword ptr ,r9
fffff880`0bdab11d 4c89442418            mov   qword ptr ,r8
fffff880`0bdab122 89542410                mov   dword ptr ,edx

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

chess0726 发表于 2013-4-28 17:14:30

在自己的函数里, 全 return 0.然后,输出 ObjectAttributes->ObjectName 是可以运行的,说明代码没有错误,但如果是 jmp 到恢复指令的地址运行,就蓝屏了,怎么可以有这么痛的蓝屏的,让rip执行的的指令也是对的, 用用windbg 的 eq 给那个寄存器赋值也正常, 恢复的指令也是正常的,求解释~~~

Tesla.Angela 发表于 2013-4-28 19:59:13

你的指令顺序是不是有问题?我在VM里看到的指令顺序:nt!IopCreateFile:
fffff800`019d22d0 4c894c2420      mov   qword ptr ,r9
fffff800`019d22d5 89542410      mov   dword ptr ,edx
fffff800`019d22d9 48894c2408      mov   qword ptr ,rcx其实流程你不明白吗?
头14字节改jmp跳到代理函数,不足填NOP凑够14字节,代理函数处理结束后,跳到任意一个地方执行完头14字节,然后跳到IopCreateFile+14的地方执行。我的意思是,你确保没有截断指令???我觉得唯一的可能就是你截断了指令,所以才出现“return 0正常,返回原函数不正常”的情况。
另外,你玩这个把戏的时候,破解了内核没有???

chess0726 发表于 2013-4-28 20:45:03

Tesla.Angela 发表于 2013-4-28 19:59 static/image/common/back.gif
你的指令顺序是不是有问题?我在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 ,r9
fffff880`0bdab11d 4c89442418            mov   qword ptr ,r8
fffff880`0bdab122 89542410                mov   dword ptr ,edx
fffff880`0bdab126 ff2500000000            jmp   qword ptr
fffff880`0bdab12c ae                      scas    byte ptr
fffff880`0bdab12d c5                      ???
fffff880`0bdab12e bc0100f8ff            mov   esp,0FFF80001h
fffff880`0bdab133 ff00                  inc   dword ptr

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

chess0726 发表于 2013-4-28 20:47:19

本帖最后由 chess0726 于 2013-4-28 20:52 编辑

Tesla.Angela 发表于 2013-4-28 19:59 static/image/common/back.gif
你的指令顺序是不是有问题?我在VM里看到的指令顺序:其实流程你不明白吗?
头14字节改jmp跳到代理函数,不 ...

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

我的内核 的那个函数的头部数据 是
Command> u IopCreateFile
0xFFFFF80001B995A04C894C2420                      mov , r9
0xFFFFF80001B995A54C89442418                      mov , r8
0xFFFFF80001B995AA89542410                        mov , edx
0xFFFFF80001B995AE48894C2408                      mov , rcx
0xFFFFF80001B995B353                              push rbx
0xFFFFF80001B995B456                              push rsi
0xFFFFF80001B995B557                              push rdi
0xFFFFF80001B995B64154                            push r12

chess0726 发表于 2013-4-28 21:55:20

解决了...   换了个方式,没有用这个方法。 谢谢版主帮忙。

Tesla.Angela 发表于 2013-4-28 22:34:49

解决了就好,本来HOOK就不是什么难事。
不过不建议在WIN64内核上使用HOOK,因为会引发蓝屏。


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

chess0726 发表于 2013-4-28 23:07:34

Tesla.Angela 发表于 2013-4-28 22:34 static/image/common/back.gif
解决了就好,本来HOOK就不是什么难事。
不过不建议在WIN64内核上使用HOOK,因为会引发蓝屏。



好的。 谢谢版主。 呵呵, 在64位驱动里,基本上是看版主的文章走过来的。这个论坛又让我学到了很多东西。
页: [1]
查看完整版本: 64位内联hook,求帮助,求救。