好友
阅读权限10
听众
最后登录1970-1-1
|
本文以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:[esp+0x4]
77641153 64:FF15 C000000>call dword ptr fs:[0xC0]
7764115A 83C4 04 add esp,0x4
7764115D C2 1000 retn 0x10
发现 call dword ptr fs:[0xC0] 这应该就是调用syscall了.0xFE是NtOpenThread的序号
那就知道怎么去hook了,如下这段代码获得syscall的地址
.版本 2
.子程序 _getSysCallAddr, 整数型
.局部变量 a, 整数型
a = 0
置入代码 ({ 100, 161, 192, 0, 0, 0 })
' _asm:mov [ebp-0x4],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成功 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|