原创 | dll劫持之VEH硬件断点过crc校验

  • A+
所属分类:安全文章
原创 | dll劫持之VEH硬件断点过crc校验
点击上方“蓝字”关注我们吧!
原创 | dll劫持之VEH硬件断点过crc校验


开篇提示:笔者水平一般文章内容也比较浅显,如有错误欢迎指出。


Crc反调试原理很简单,简单来说就是开启一个线程,在这个线程中不断地对内存中代码段的数据进行校验,如果校验时值发生了改变直接调用退出之类的函数关闭程序。

如何干掉crc校验?
1.直接停掉crc线程
2.调用退出之前让他返回,即不让他退出
3.硬件中断的方法,在不修改程序代码的条件下干掉crc

说到硬件中断必须提一下什么是硬件中断,如od里面的f2那个其实是int3断点也叫cc断点(INT3指令的机器码为CC),这是一种软件断点很容易被检测到,而硬件断点使用cpu调试寄存器dr0-dr7,Dr0-dr3用来保存断点地址,Dr7是调试控制寄存器。


原创 | dll劫持之VEH硬件断点过crc校验


原创 | dll劫持之VEH硬件断点过crc校验


相关函数

PVOID AddVectoredExceptionHandler(  ULONG                       First,  PVECTORED_EXCEPTION_HANDLER Handler);


注册一个异常处理

DWORD SuspendThread(  HANDLE hThread);


挂起一个线程

DWORD ResumeThread(  HANDLE hThread);


恢复一个线程

BOOL GetThreadContext(  HANDLE    hThread,  LPCONTEXT lpContext);


检索线程上下文


BOOL SetThreadContext(  HANDLE        hThread,  const CONTEXT *lpContext);


设置线程上下文


其中msdn上写了这么一条 win10需要另起一个线程把主线程挂起才能生效

该函数根据上下文结构的ContextFlags成员的值设置线程上下文。通常,正在调试hThread参数标识的线程,但是即使未调试线程,该函数也可以运行。


不要尝试为正在运行的线程设置上下文;结果是不可预测的。在调用SetThreadContext之前,请使用 SuspendThread函数挂起线程


上代码


原创 | dll劫持之VEH硬件断点过crc校验


原创 | dll劫持之VEH硬件断点过crc校验


原创 | dll劫持之VEH硬件断点过crc校验


原创 | dll劫持之VEH硬件断点过crc校验


这里dr0设置成我们想下的断点地址,Dr7的设置参考

原创 | dll劫持之VEH硬件断点过crc校验


但是如果把G0设置成1并不会断下来,我也不知道为什么,有懂的请务必告诉我。这里我把L0设置成1。


原创 | dll劫持之VEH硬件断点过crc校验


这里当我们下好硬件断点会触发异常,这个异常处理就是从当前断点处+6处运行加几取决于指令的长度。我们结合od来看一下这个dll到底是怎么在不修改代码的情况下破解程序的。

原创 | dll劫持之VEH硬件断点过crc校验


原创 | dll劫持之VEH硬件断点过crc校验


这是关键点,如果不干掉crc线程直接f2下断程序会直接退出。此时把dll放到程序目录重新加载一次,可以看到调试寄存器里面被设置成了我设置的值。401053的指令长度是6,这也就是我为什么把代码里eip+6的原因。

当程序运行到这个地址会触发异常,这个异常会被我们写的异常处理函数处理。由于直接控制eip寄存器,所以不用修改程序代码就可以过掉crc,并且这个程序加了壳,不能直接修改程序,用硬件断点的方法就可以很好的处理这种情况。

原创 | dll劫持之VEH硬件断点过crc校验



原创 | dll劫持之VEH硬件断点过crc校验

原创 | dll劫持之VEH硬件断点过crc校验
原创 | dll劫持之VEH硬件断点过crc校验
原创 | dll劫持之VEH硬件断点过crc校验
点分享
原创 | dll劫持之VEH硬件断点过crc校验
点点赞
原创 | dll劫持之VEH硬件断点过crc校验
点在看

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: