由于自己的业务需求,需要一个简单跨平台的Inline Hook框架,又不想自己写,于是找到了Cydia Substrate。
Cydia Substrate是iOS以及安卓平台上有名的Hook框架,对于安卓,能进行Java层的Hook以及Native层Hook。但是Cydia Substrate并不支持Windows,也没有任何好用的跨平台钩子框架,于是就自己造轮子写了一个。
使用效果:
代码部分
运行起来的效果:
可以看见我们要钩的ZwTerminateProcess已经被成功挂钩,执行TerminateProcess必定走ZwTerminateProcess,因此我们安装的钩子实际上是生效的。
我们知道,32位的Windows跟64位的Windows,在Windows API函数头部是不一样的,32位预留了钩子空间,64位没有跟32位一样直接预留短跳空间。而Inline Hook框架主要就是在函数头部插入自己的OpCode,跳到跳板,再执行Hook函数。而对于原始函数,Fix过程是很重要的,Substrate的Fix存在BUG,可以自己修复。
下面说说怎么简单移植Cydia Substrate到Windows:
我们从各种开源网站把Cydia Substrate的so库源码down下来,再导入到Visual Studio当中,由于没有Makefile,一切都是简单无脑的操作。只需要将所有cpp文件导入到源文件,所有h跟hpp文件导入到头文件即可。
接下来就是删掉GNU系列的一些属性定义,我用的是MSVC,对齐之类的都是没问题的,后面自己根据本机的定义,对于一些Linux上才有的内容进行转译,例如一些缺失的头文件以及缺失的定义。
后面就是编译了,由于X86平台函数调用上,Windows跟类Unix是一样的,因此不会遇到用不了的问题。
具体的移植过程 可以看我的博客网站,网址:https://www.die.lu/core/index.php/2020/09/13/328/
一个反反调试断点检测:
有很多软件会对调试器断点进行检测,例如对IsDebuggerPresent的断点是可以检测的。我们可以这样做:
这是IsDebuggerPresent的函数内容,我们并不需要在这个地方下断点,如图:
我们可以不下断点,这个函数下面又很多0xCC,即int3,实际上我们完全可以填充掉。
将ret以及下面的几个int3抹掉,改位指令xor rax,rax以及ret。如图:
这样就能拥有完整的调用链,过很多关于该函数断点的检测了,别的函数也大同小异。
不一样的是某些带有防调试软件,NtQueryInformationProcess函数会调用32位的版本,这里我们只需要在WOW64 Bridge里面直接下钩子,抓取32位版本即可。
自制调试器-不一样的思路:
我们知道,System32里面的部分dll是有保护的,但是我们可以在注册表里面删除这些保护,通过dll劫持这个古老的技术,主动连接到我们的调试器。
目前市面上调试器普遍为远线程注入,再attach等等,为什么我们不可以跟木马的反向连接(反弹)一样,让程序主动连接到我们的程序呢?
实际上我们完全可以修改注册表,将user32.dll剔除于保护名单之外,直接使用我们自己的劫持dll并对任意软件进行注入和hook。
目前已经开发出初代的新调试器,完全不使用任何debugger的内容,而是自主对整个软件运行环境进行监控,自然也没有debugger检测一说。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法