前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dll劫持利用VEH硬件断点过crc校验

dll劫持利用VEH硬件断点过crc校验

作者头像
鸿鹄实验室
发布2021-04-15 10:28:44
1.7K0
发布2021-04-15 10:28:44
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

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

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

如何干掉crc校验?

  • 直接停掉crc线程
  • 调用退出之前让他返回 即不让他退出
  • 硬件中断的方法,在不修改程序代码的条件下干掉crc

说到硬件中断必须提一下什么是硬件中断,如od里面的f2 那个其实是int3断点也叫cc断点(INT3指令的机器码为CC),这是一种软件断点很容易被检测到,而硬件断点使用cpu

调试寄存器dr0-dr7

Dr0-dr3用来保存断点地址

Dr7是调试控制寄存器

相关函数

代码语言:javascript
复制
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函数挂起线程

上代码

这里dr0设置成我们想下的断点地址

Dr7的设置参考

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

这里我把L0设置成1

这里当我们下好硬件断点会触发异常 这个异常处理就是从当前断点处+6处运行 加几取决于指令的长度

我们结合od来看一下这个dll到底是怎么在不修改代码的情况下破解程序的

这是关键点 如果不干掉crc线程直接f2下断程序会直接退出

此时把dll放到程序目录重新加载一次,可以看到调试寄存器里面被设置成了我设置的值

401053的指令长度是6 这也就是我为什么把代码里eip+6的原因

当程序运行到这个地址会触发异常 这个异常会被我们写的异常处理函数处理

由于直接控制eip寄存器 所以不用修改程序代码就可以过掉crc,并且这个程序加了壳,不能直接修改程序,用硬件断点的方法就可以很好的处理这种情况。

END

文章 | lengyi

图文 | 不可商用

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档