当前位置:网站首页>完美绕开CRC32检测的无痕hook
完美绕开CRC32检测的无痕hook
2022-07-30 15:38:00 【陈子青 - See】
目录
什么是Hook?
Hook 英文有钩子、曲线球的意思。简单来讲就是走弯路,比如原本程序是从 A 到 B 顺序来执行,此时我们在A点做Hook,将程序执行路线变成了 从 A点 先到 C点 再到 B点,这个过程就叫Hook,C点 这里是我们让程序走的弯路,可以通过在C点做数据加工,就可以让程序执行出我们想要的结果。 (记住此时的 A B C,下文都以此为例)
Hook分类

初级hook
初级hook虽然被上述图中(图是网上随便找的)定义为low bi Hook,但却是对Hook原理的最好诠释,正如图中的解释过程一样,是通过jmp 或 Call 等指令 实现的跳转,这样一来就会大量破坏源代码,并且我们在C中处理结束后,必须恢复被修改的源码,才能让程序正常运行。因此过程涉及以下关键点:
① 在A点 修改机器码 跳转到 C点 时,使用 jmp/call 实现
② 修改前需要保存原数据,以便恢复数据
③ 可以通过 pushad 和 pushfd 将CPU寄存器信息入栈,再传入参数 esp ,通过esp 来访问和修改寄存器信息
④ 可以通过 修改 EIP 的值,来返回 B 点
通过软件断点来实现Hook
软件断点实现的本质就是在下断点的地方插入int3,也被称之为CC断点。
断点是一种异常,为什么异常会实现跳转,又是怎么指定调转位置,以下必须对Windows的异常处理机制做一定描述。
Windows正常启动后,将运行在保护模式下,当有中断或异常发生时,CPU会通过中断描述符
表(DescriptorTable,IDT)来寻找处理函数。因此,IDT表是CPU(硬件)和操作系统(软
件)交接中断和异常的关口。
也就是说当程序出现异常之后,CPU会去找一张表中去查找处理该异常的处理函数。那么如果我们手动让程序在 A点 出现异常,CPU就会去表中找处理A点异常的处理函数,那此时如果我们把我们的 C 过程包装成 处理A点异常的处理函数,那么也就是实现了 从A 点 跳转到 C 点的过程,这个跳转跳转过程是 CPU帮我们实现的。
如何包装C点为处理函数,如何让C成为A点的处理函数? 一个API可以解决
异常处理函数:
LONG NTAPI AddVectoredExceptionHandler(
_In_UlON First,
异常处理函数被调用的顺序
_In_PVECTORED_EXECUTE_HANDLER Handler
异常处理回调函数
)
此时当异常发生,CPU会第一时间调用异常回调函数,并传递一个PEXCEPTION_POINTERS作为参数。
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;它包含了所有异常信息和cpu信息 。
PEXCEPTION_RECORD 结构体如下——微软文档
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;因为我们是设置的软件断点,那么我们这里的ExceptionCode则为 EXCEPTION_BREAKPOINT
PCONTEXT结构体如下——PCONTEXT微软文档
typedef struct _ARM64_NT_CONTEXT {
DWORD ContextFlags;
DWORD Cpsr;
union {
struct {
DWORD64 X0;
DWORD64 X1;
DWORD64 X2;
DWORD64 X3;
DWORD64 X4;
DWORD64 X5;
DWORD64 X6;
DWORD64 X7;
DWORD64 X8;
DWORD64 X9;
DWORD64 X10;
DWORD64 X11;
DWORD64 X12;
DWORD64 X13;
DWORD64 X14;
DWORD64 X15;
DWORD64 X16;
DWORD64 X17;
DWORD64 X18;
DWORD64 X19;
DWORD64 X20;
DWORD64 X21;
DWORD64 X22;
DWORD64 X23;
DWORD64 X24;
DWORD64 X25;
DWORD64 X26;
DWORD64 X27;
DWORD64 X28;
DWORD64 Fp;
DWORD64 Lr;
} DUMMYSTRUCTNAME;
DWORD64 X[31];
} DUMMYUNIONNAME;
DWORD64 Sp;
DWORD64 Pc;
ARM64_NT_NEON128 V[32];
DWORD Fpcr;
DWORD Fpsr;
DWORD Bcr[ARM64_MAX_BREAKPOINTS];
DWORD64 Bvr[ARM64_MAX_BREAKPOINTS];
DWORD Wcr[ARM64_MAX_WATCHPOINTS];
DWORD64 Wvr[ARM64_MAX_WATCHPOINTS];
} ARM64_NT_CONTEXT, *PARM64_NT_CONTEXT;
其中ContextFlags 其是标志位寄存器,DUMMYUNIONNAME是调试寄存器。以下提供一段添加异常处理的代码,仅供参考。

设置软件断点通过 int3 实现,对比第一种需要修改少量源码来实现hook的原始方式,这种Hook方式只需要修改一个字节的机器码,显然被检测的难度提升了。
设置硬件断点实现无痕Hook
断点寄存器
硬件断点和上面的不同,它是基于硬件的,不依赖调试程序,有自己的优势,如果通过CRC校验是不会被检测到的。如下是与硬件断点相关的寄存器结构:

Dr0 ~ Dr3用于设置硬件断点,Dr4和Dr5被保留了。由于只有4个断点寄存器,所以最多只能设置4个硬件调试断点。Dr7是最重要的寄存器,它比较复杂,我们来看看它的结构:
L0/G0 ~ L3/G3
控制Dr0 ~ Dr3是否有效,局部还是全局。
例如 位0 L0和位1 G0:用于控制Dr0是全局断点还是局部断点,如果G0为1则是全局断点,如果L0为1则为局部断点。G0,L0 ~G3,L3分别用于控制Dr1~Dr3。
LEN0 ~ LEN3
表示硬件断点的长度。如果是0表示1个字节;是1表示2个字节;是3表示4个字节。
R/W0 ~ R/W3
指示断点类型。如果是0表示执行断点;是1表示写入断点;是3表示访问断点。
处理
硬件调试断点产生的异常是STATUS_SINGLE_STEP,即单步异常。触发异常后,B0 ~ B3对应的位会被置1,以此可以区分单步步入产生的单步异常。
单步步入
在调试中我们经常一条指令一条指令的进行调试,这大大方便了我们查阅结果,CPU提供了这样的基址,就是在Eflag中的TF位实现的,如下图所示:

线程劫持
我们如果要设置硬件断点就要修改Dr0 ~ Dr3 和 Dr7 的数据,此时可以在设计自己的线程函数,然后对该函数使用第二种的Hook的方式,从而修改断点寄存器 Dr0 ~ Dr3 和 Dr7 的值,来控制Hook的触发.
由此可见,硬件断点的Hook过程是通过断点寄存器来完成Hook过程的,不会修改源程序的机器码,自然无视CRC32检测。
边栏推荐
猜你喜欢
随机推荐
Redis 复习计划 - Redis 数据结构和持久化机制
php如何查询字符串出现位置
数据库-SQL
FME realizes the method of converting CAD with attribute to SHP data
php如何截取字符串的前几位
hcip--ospf综合实验
武汉星起航:海外仓基础建设成为跨境电商企业的一大出海利器
Huawei ADS reports an error when obtaining conversion tracking parameters: getInstallReferrer IOException: getInstallReferrer not found installreferrer
Is Redis really slow?
[Developers must see] [push kit] Collection of typical problems of push service 2
RobotStudio实现喷漆、打磨等功能(曲面路径生成与仿真)
TiUP 故障排查
STM32F407定时器输入捕获
加密生活,Web3 项目合伙人的一天
tiup env
【HMS core】【Media】【Video Editing Service】 The online material cannot be displayed, it is always in the loading state or the network is abnormal
围绕用户思维,木鸟与途家如何实现乡村民宿下的用户运营
xxl-job源码解析(技术分享)
近段时间的学习碎片整理(24)
如何快速拷贝整个网站所有网页









