吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6707|回复: 11
收起左侧

[易语言 转载] R3层下一种另类的hook的方法

[复制链接]
逝去的初夏丶 发表于 2018-4-16 01:00
本文以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成功

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
wushaominkk + 1 + 1 鼓励新人发帖
pray丶 + 1 我很赞同!
TYL0711 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 逝去的初夏丶 发表于 2018-4-16 13:06
chen1234 发表于 2018-4-16 07:45
支持支持,话说你这个本身就是用inline hook实现的,怎么防检测

一般不怎么检测这里
 楼主| 逝去的初夏丶 发表于 2018-4-16 01:01
附上源码: hookOpenThread.rar (3.15 KB, 下载次数: 119)
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
然而去年我就发过帖子了
yjf306 发表于 2018-4-16 08:58
认真学习了,保留下来自己试试。
wozzi 发表于 2018-4-16 18:23
易语言写起来好麻烦呀

免费评分

参与人数 1吾爱币 +1 收起 理由
逝去的初夏丶 + 1 是的,内联汇编还是c,帮朋友写个例子才用e

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 15:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表