欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

大家都知道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

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功