zoukankan      html  css  js  c++  java
  • 反调试技术

    在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术,首先我们来看看反调试技术。
    一、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;
    }
    未完待续
  • 相关阅读:
    Python3 学习第八弹: 模块学习一之模块变量
    Python3 学习第六弹: 迭代器与生成器
    Python3 学习第五弹:类与面向对象
    Java之泛型
    Java之工具类Collections
    Java之map
    Java集合之List
    Java集合之TreeSet
    Java集合
    Java异常处理
  • 原文地址:https://www.cnblogs.com/killmyday/p/2063891.html
Copyright © 2011-2022 走看看