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