首页
社区
课程
招聘
通过重写API让鼠标模拟无法被HOOK和检测到
2018-4-21 19:12 35391

通过重写API让鼠标模拟无法被HOOK和检测到

2018-4-21 19:12
35391

大家都知道window就是一个封闭的黑盒子,在我们没有window源码的情况下我们只能通过hook达到改变api流程的目的,在windows下的hook有很多种:比如 lnlinehook,系统消息hook等,SSDT hook(win10下我们不用考虑这个)当然在用户层我们最常用也是最好用的还是lnlinehook,通过索引API地址重新构建自己的hook函数达到一些目的,这里说的就如何不让hook成功以达到攻防的目的。


首先我们先编写一个鼠标按下的代码,当然你也可以重写其他API,我们的重点是重写API,而不是过鼠标检测

Sleep(1500);
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0); 
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);


然后编译,当然我们要重写必须要知道它内部干了什么


我们可以用OD打开编译好的程序



这样肯定不行,进入之后我们第一步肯定要找到自己写的代码
怎么找呢?这里又要把逆向知识补充了~~

注意刚才我们写了一个sleep函数,这里直接按暂停肯定是断在sleep上的



然后查看调用堆栈,我们要找到最外层调用的地方肯定就是地址最小的堆栈00f93f79了,点击调用来自



直接双击点进去的就来到我们的代码了 直接到mouse_event然后跟进去


这里可以看到mouse_event实际上就是调用的UsersendInput



继续跟踪进到NtUsersendInput(),这里我们就可以看到api索引号,



我们继续跟进可以看到Wow64Transition 32位转64位模式的地方



继续跟进直接就远跳了 这种长度很明显就是用户层切换到内核层的地址了,再调用int2rh或sysenter中断指令 进入系统exe和内核ZW函数通信完成参数检查 ,在调用内核NT函数完成微软API的调用,这里我们就说R3的处理,R0是R0处理的事情



总结一下 ,如果要HOOK一个API 那么我们只能索引到API地址和NT地址

那么换句话说,是不是我们直接绕过NT,自己构建一个函数地址,也就达到绕过R3层所有检测和HOOK的目的了呢


我们回到这里,因为这里是API索引号call到驱动中转的位置,这个call每个系统都不一样,并且每个API需要经过这个call 我们不可能hook到这里,如果你强行hook这里程序都会崩溃



那么大致的思路就出来了 


自己写一个函数-->填入API参数-->模拟出API索引号(其实是内核SSDT的下标) call

本来想用_stdcall约定写更加方便 但是由于我对UsersendInput这个函数并不是很熟  所以直接用__declspec模拟一个UsersendInput的堆栈出来,建立一个控制台工程即可实现

__declspec(naked) void BuildMouse()//这里就是模拟器的API索引号call
{
	_asm _emit 0xB8
	_asm _emit 0x82
	_asm _emit 0x10
	_asm _emit 0x00
	_asm _emit 0x00
	_asm _emit 0xBA
	_asm _emit 0xF0
	_asm _emit 0x73
	_asm _emit 0xBD
	_asm _emit 0x76
	_asm _emit 0xFF
	_asm _emit 0xD2
	_asm _emit 0xC2
	_asm _emit 0x0C
	_asm _emit 0x00
}

__declspec(naked) void BuildParameter()//这里模拟的就是NtUsersendInput{
	_asm
	{
		mov         edi, edi
		push        ebp
		mov         ebp, esp
		sub          esp, 1Ch
		mov        eax, dword ptr[ebp + 8]
		and         dword ptr[ebp - 1Ch], 0
		and         dword ptr[ebp - 8], 0
		mov         dword ptr[ebp - 0Ch], eax
		mov         eax, dword ptr[ebp + 10h]
		mov         dword ptr[ebp - 14h], eax
		mov         eax, dword ptr[ebp + 14h]
		mov         dword ptr[ebp - 10h], eax
		mov         eax, dword ptr[ebp + 18h]
		mov         dword ptr[ebp - 4], eax
		lea         eax, [ebp - 1Ch]
		push        1Ch
		push        eax
		push        1
		call       BuildMouse
		mov         esp, ebp
		pop         ebp
		ret         14h
	}



int _tmain(int argc, _TCHAR* argv[])
{
	_asm push 1500
	_asm call Sleep
	_asm push 0x00
	_asm push 0x00
	_asm push 0x00
	_asm push 0x00
	_asm push 0x02
	_asm call BuildParameter
	_asm push 500
	_asm call Sleep
	_asm push 0x00
	_asm push 0x00
	_asm push 0x00
	_asm push 0x00
	_asm push 0x04
	_asm call BuildParameter
	_asm push 15000
	_asm call Sleep
}

下面把完整代码传到附件 可以自行下载


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2019-2-2 10:16 被admin编辑 ,原因: 图片本地化
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (23)
雪    币: 719
活跃值: (782)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
落笔飞花 1 2018-4-21 21:35
2
0
鼠标过滤了解一下。
雪    币: 95
活跃值: (124)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
isdebug 2018-4-22 13:33
3
0
vt  ept  hook  了解一下
雪    币: 95
活跃值: (124)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
isdebug 2018-4-22 13:35
4
0
而且,某些厂商硬刚PG,x64内核搞事情,所以,sssdt是要考虑
雪    币: 914
活跃值: (2188)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 1 2018-4-22 13:50
5
0
真水
雪    币: 238
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
武装的蔷薇 2018-4-22 14:32
6
0
isdebug 而且,某些厂商硬刚PG,x64内核搞事情,所以,sssdt是要考虑
那就没有办法了
雪    币: 238
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
武装的蔷薇 2018-4-22 14:33
7
0
万剑归宗 真水[em_2]
哪里水了......
雪    币: 95
活跃值: (124)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
isdebug 2018-4-22 17:11
8
0
武装的蔷薇 那就没有办法了[em_2]
有啊,vt对付呀...用户不开vt就也效仿某公司xxpg,然后大肆hook啊-  -||,哎呦..不装了,装不下去了
雪    币: 95
活跃值: (124)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
isdebug 2018-4-22 17:13
9
0
武装的蔷薇 那就没有办法了[em_2]
小弟觉得吧,标题应该叫  通过syscall让r3apihook无效(x86)
雪    币: 914
活跃值: (2188)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 1 2018-4-22 17:25
10
0
isdebug 小弟觉得吧,标题应该叫 通过syscall让r3apihook无效(x86)
说得对
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2018-4-23 09:40
11
0
NtUserSendInput拿全局消息钩子就秒了,根本用不着什么inline hook,都是杂技。
最后于 2018-4-23 09:42 被hzqst编辑 ,原因:
雪    币: 238
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
武装的蔷薇 2018-4-23 11:44
12
0
hzqst NtUserSendInput拿全局消息钩子就秒了,根本用不着什么inline hook,都是杂技。
我感觉任何开发者都不会拿真实鼠标一起检测
雪    币: 1484
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
冰雄 2018-4-30 11:22
13
0
直接连nt函数一起都重写了,调用自己nt函数。不过要考虑系统兼容
雪    币: 433
活跃值: (1805)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
萌克力 2018-4-30 11:56
14
0
isdebug 小弟觉得吧,标题应该叫 通过syscall让r3apihook无效(x86)
对啊...就这回事
雪    币: 2
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
achuana 2018-5-2 12:22
15
0
现在的游戏感觉不仅仅是检测你模拟鼠标键盘,应该还会HOOP找图需要用到的一些API  通过参数判断你是否在频繁的截取游戏的图片,判定你是脚本!为什么所有人都在讨论鼠标键盘的过检测,没有人讨论找图过检测呢,你需要截图就需要用到一些API,人家可以猥琐的需要检测的时候才HOOK这些函数,不检测的时候不HOOK,你发现不了,有没有可能呢
雪    币: 4636
活跃值: (2069)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hekes 2018-6-15 11:49
16
0
mark
雪    币: 238
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
武装的蔷薇 2018-6-22 11:17
17
0
achuana 现在的游戏感觉不仅仅是检测你模拟鼠标键盘,应该还会HOOP找图需要用到的一些API 通过参数判断你是否在频繁的截取游戏的图片,判定你是脚本!为什么所有人都在讨论鼠标键盘的过检测,没有人讨论找图过检测呢 ...
没有这种游戏
雪    币: 238
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
武装的蔷薇 2018-6-22 11:17
18
0
hekes mark
我是没遇到过
雪    币: 6124
活跃值: (4081)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 1 2018-9-7 03:37
19
0
自写syscall
雪    币: 711
活跃值: (243)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mydvdf 2019-6-18 21:13
20
0
666666666
雪    币: 182
活跃值: (576)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
柒雪天尚 2019-6-18 22:08
21
0
很多年以前郁金香的某教程了解一下,呵呵o(* ̄︶ ̄*)o
雪    币: 583
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
supersoar 2020-1-6 11:26
22
0
很好,就是代码看得我有点懵逼。
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
taizhong 2020-5-13 09:52
23
0
hzqst NtUserSendInput拿全局消息钩子就秒了,根本用不着什么inline hook,都是杂技。
怎么用全局消息钩子 拦截NT函数?
求指点
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwCopyAll 2020-5-13 18:58
24
0
66
游客
登录 | 注册 方可回帖
返回