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 这条指令为什么不能被执行?试了好几天了,都是这样,想不通,求解释。 这里, 我只是保存了 头部的 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 [] 这指令之后的数据跳到我的函数去,为什么跳回去时,会报错? 在自己的函数里, 全 return 0.然后,输出 ObjectAttributes->ObjectName 是可以运行的,说明代码没有错误,但如果是 jmp 到恢复指令的地址运行,就蓝屏了,怎么可以有这么痛的蓝屏的,让rip执行的的指令也是对的, 用用windbg 的 eq 给那个寄存器赋值也正常, 恢复的指令也是正常的,求解释~~~ 你的指令顺序是不是有问题?我在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正常,返回原函数不正常”的情况。
另外,你玩这个把戏的时候,破解了内核没有??? 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: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 解决了... 换了个方式,没有用这个方法。 谢谢版主帮忙。 解决了就好,本来HOOK就不是什么难事。
不过不建议在WIN64内核上使用HOOK,因为会引发蓝屏。
PS:从你的回复上看,就是觉得你截断了指令才导致出了问题。
你看一下这个贴(http://www.m5home.com/bbs/thread-7279-1-1.html),WIN64AST早期版本使用的INLINE HOOK引擎。 Tesla.Angela 发表于 2013-4-28 22:34 static/image/common/back.gif
解决了就好,本来HOOK就不是什么难事。
不过不建议在WIN64内核上使用HOOK,因为会引发蓝屏。
好的。 谢谢版主。 呵呵, 在64位驱动里,基本上是看版主的文章走过来的。这个论坛又让我学到了很多东西。
页:
[1]