反调试技术

简介:
在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术,首先我们来看看反调试技术。
一、Windows API方法
Win32提供了两个API, IsDebuggerPresent和CheckRemoteDebuggerPresent可以用来检测当前进程是否正在被调试,以IsDebuggerPresent函数为例,例子如下:

 

BOOL ret = IsDebuggerPresent();
printf("ret = %d\n", ret);

 

破解方法很简单,就是在系统里将这两个函数hook掉,让这两个函数一直返回false就可以了,网上有很多做hook API工作的工具,也有很多工具源代码是开放的,所以这里就不细谈了。

 

二、查询进程PEB的BeingDebugged标志位
当进程被调试器所附加的时候,操作系统会自动设置这个标志位,因此在程序里定期查询这个标志位就可以了,例子如下:

 

bool PebIsDebuggedApproach()
{
       char result = 0;
       __asm
       {
      // 进程的PEB地址放在fs这个寄存器位置上
              mov eax, fs:[30h]
  // 查询BeingDebugged标志位
              mov al, BYTE PTR [eax + 2] 
              mov result, al
       }
 
       return result != 0;
}

 

三、查询进程PEB的NtGlobal标志位 
跟第二个方法一样,当进程被调试的时候,操作系统除了修改BeingDebugged这个标志位以外,还会修改其他几个地方,其中NtDll中一些控制堆(Heap)操作的函数的标志位就会被修改,因此也可以查询这个标志位,例子如下:

 

bool PebNtGlobalFlagsApproach()
{
       int result = 0;
 
       __asm
       {
      // 进程的PEB
              mov eax, fs:[30h]
  // 控制堆操作函数的工作方式的标志位
              mov eax, [eax + 68h]
  // 操作系统会加上这些标志位FLG_HEAP_ENABLE_TAIL_CHECK, 
  // FLG_HEAP_ENABLE_FREE_CHECK and FLG_HEAP_VALIDATE_PARAMETERS,
  // 它们的并集就是x70
  //
  // 下面的代码相当于C/C++的
  //     eax = eax & 0x70
              and eax, 0x70
              mov result, eax
       }
 
       return result != 0;
}

 

四、查询进程堆的一些标志位
这个方法是第三个方法的变种,只要进程被调试,进程在堆上分配的内存,在分配的堆的头信息里,ForceFlags这个标志位会被修改,因此可以通过判断这个标志位的方式来反调试。因为进程可以有很多的堆,因此只要检查任意一个堆的头信息就可以了,所以这个方法貌似很强大,例子如下:

 

bool HeapFlagsApproach()
{
       int result = 0;
 
       __asm
       {
      // 进程的PEB
              mov eax, fs:[30h]
      // 进程的堆,我们随便访问了一个堆,下面是默认的堆
              mov eax, [eax + 18h]
  // 检查ForceFlag标志位,在没有被调试的情况下应该是
              mov eax, [eax + 10h]
              mov result, eax
       }
 
       return result != 0;
}

 

 

未完待续

本文转自 donjuan 博客园博客,原文链接:  http://www.cnblogs.com/killmyday/archive/2011/05/31/2063891.html  ,如需转载请自行联系原作者
相关文章
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
|
消息中间件 JSON Java
SpringBoot集成和使用消息队列
SpringBoot集成和使用消息队列
Open3D File Io 文件IO
Open3D File Io 文件IO
187 1
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
426 2
|
存储 安全 Oracle
C#检验科lis实验室信息管理系统源码
LIS是全院信息化建设的一个重要组成部分,其主要功能是将检验的实验仪器传出的检验数据经分析后,生成检验报告,通过网络存储在数据库中,使医生能够方便、及时的看到患者的检验结果,LIS已经成为现代化医院管理中必不可少的一部分。有助于提高实验室的整体管理水平,减少漏洞,提高检验质量。
146 1
|
JavaScript
Node.js之http模块
Node.js之http模块
|
资源调度 前端开发 数据库
权限 | 前端控制权限
啊,我们经常做权限控制,控制菜单,控制按钮功能等,但是在一些特殊情况下不能够由后端来做权限控制,那就只能前端来做啦。
264 0
|
编解码 人工智能 算法
AAAI 2023 Oral | 字节提出非对称图像重采样模型,JPEG、WebP上抗压缩性能领先SOTA
AAAI 2023 Oral | 字节提出非对称图像重采样模型,JPEG、WebP上抗压缩性能领先SOTA
271 0
|
自然语言处理 算法 API
Py之gensim:gensim的简介、安装、使用方法之详细攻略
Py之gensim:gensim的简介、安装、使用方法之详细攻略
Py之gensim:gensim的简介、安装、使用方法之详细攻略