逝去的初夏丶 发表于 2018-4-16 01:00

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成功

逝去的初夏丶 发表于 2018-4-16 13:06

chen1234 发表于 2018-4-16 07:45
支持支持,话说你这个本身就是用inline hook实现的,怎么防检测

一般不怎么检测这里

逝去的初夏丶 发表于 2018-4-16 01:01

附上源码:

pray丶 发表于 2018-4-16 01:04

膜拜初夏大神

jinqing1992 发表于 2018-4-16 01:45

膜拜大神(* ̄з ̄)

xxhaishixx 发表于 2018-4-16 03:55

我有一种简单暴力的,直接HOOK,全局注入,不要驱动不要注入器。

chen1234 发表于 2018-4-16 07:45

万剑归宗 发表于 2018-4-16 08:56

然而去年我就发过帖子了{:1_925:}

yjf306 发表于 2018-4-16 08:58

认真学习了,保留下来自己试试。

wozzi 发表于 2018-4-16 18:23

易语言写起来好麻烦呀{:1_926:}
页: [1] 2
查看完整版本: R3层下一种另类的hook的方法