|
楼主 |
发表于 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 这个地址,一执行,就错了。 |
|