R3层下一种另类的hook的方法
本文以openThread的hook为例浅析hook syscall.小弟才疏学浅如有理解错误的地方还请大神不吝赐教本文的代码需要用到wonderwall支持库
我们知道OpenThread->NtOpenThread这样一个流程.跟NtOpenThread查看汇编
77641148 >B8 FE000000 mov eax,0xFE
7764114D 33C9 xor ecx,ecx
7764114F 8D5424 04 lea edx,dword ptr ss:
77641153 64:FF15 C000000>call dword ptr fs:
7764115A 83C4 04 add esp,0x4
7764115D C2 1000 retn 0x10
发现 call dword ptr fs: 这应该就是调用syscall了.0xFE是NtOpenThread的序号
那就知道怎么去hook了,如下这段代码获得syscall的地址
.版本 2
.子程序 _getSysCallAddr, 整数型
.局部变量 a, 整数型
a = 0
置入代码 ({ 100, 161, 192, 0, 0, 0 })
' _asm:mov ,eax
返回 (a)
编写过滤的代码
.子程序 mySysCall
' _asm{
' cmp eax,0xFE
' je next
' nop
' nop
' nop
' nop
' nop
' nop
' nop
' push 0x400000
' retn
' next:
' add esp,0x4
' retn 0x10
' }
其中7个字节的nop指令是用来占位的,因为win7 64下发现被我们损坏的第一行指令是占7字节
push + retn用来跳转回原始的代码,push 0x400000也只是用来占位而已,实际上不是push 0x400000
以下是hook的代码
.版本 2
.支持库 const
.子程序 setHook
.局部变量 sysCallAddr, 整数型
.局部变量 oldCode, 字节集
.局部变量 oldFlag, 整数型
.局部变量 lenth, 整数型
.局部变量 newCode, 字节集
.局部变量 myFunJmpAddr, 整数型
' 取得SysCall的地址
sysCallAddr = _getSysCallAddr ()
myOutPutDebugString (“sysCallAddr = 0x” + 取十六进制文本 (sysCallAddr))
' 计算我们hook要跳转的字节数
VirtualProtect (sysCallAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag)
oldCode = _读字节集 (sysCallAddr, 7)' 读取原始代码
lenth = _取真实地址 (&mySysCall) + 3 - sysCallAddr - 5
' 修改7个nop的位置为被我们损坏的代码
myFunJmpAddr = _取真实地址 (&mySysCall) + 3 + 7
VirtualProtect (myFunJmpAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag)
写到内存 (oldCode, myFunJmpAddr, )
' 修改要跳回的地址
myFunJmpAddr = _取真实地址 (&mySysCall) + 3 + 15
VirtualProtect (myFunJmpAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag)
写到内存 (到整数 (sysCallAddr + 7), myFunJmpAddr, )
' hook syscall
newCode = { 233 } + 到字节集 (lenth)
写到内存 (newCode, sysCallAddr, )
测试代码:
.支持库 const
.子程序 _按钮1_被单击
.局部变量 hThread, 整数型
hThread = OpenThread (#THREAD_ALL_ACCESS, #NULL, GetCurrentThreadId ())
SuspendThread (hThread)
CloseHandle (hThread)
在主线程调用此代码会导致整个窗口卡死,因为挂起了主线程,如果安装hook之后此代码无效,说明hook成功 chen1234 发表于 2018-4-16 07:45
支持支持,话说你这个本身就是用inline hook实现的,怎么防检测
一般不怎么检测这里 附上源码: 膜拜初夏大神 膜拜大神(* ̄з ̄) 我有一种简单暴力的,直接HOOK,全局注入,不要驱动不要注入器。 然而去年我就发过帖子了{:1_925:} 认真学习了,保留下来自己试试。 易语言写起来好麻烦呀{:1_926:}
页:
[1]
2