加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

26种对付反调试的方法

发布时间:2019-03-22 07:59:18 所属栏目:策划 来源:luochicun
导读:目前主要有3种分析软件的方法: 1.数据交换分析,研究人员使用数据包嗅探工具来分析网络数据交换。 2.对软件的二进制代码进行反汇编,然后以汇编语言列出。 3.字节码解码或二进制解码,然后以高级编程语言重新创建源代码。 本文针对的是Windows操作系统中

PEB结构包含指向进程堆的指针— _HEAPP结构:

  1. 0:000> dt _PEB ProcessHeap @$peb 
  2. ntdll!_PEB 
  3.    +0x018 ProcessHeap : 0x00440000 Void0:000> dt _HEAP Flags ForceFlags 00440000 ntdll!_HEAP 
  4.    +0x040 Flags      : 0x40000062 
  5.    +0x044 ForceFlags : 0x40000060 

Windows X64里的进程如下:

  1. 0:000> dt _PEB ProcessHeap @$peb 
  2. ntdll!_PEB 
  3.    +0x030 ProcessHeap : 0x0000009d`94b60000 Void 
  4. 0:000> dt _HEAP Flags ForceFlags 0000009d`94b60000 
  5. ntdll!_HEAP 
  6.    +0x070 Flags      : 0x40000062 
  7.    +0x074 ForceFlags : 0x40000060 

如果正在调试进程,则两个字段Flags和ForceFlags都具有特定的调试值:

1.如果Flags字段没有设置HEAP_GROWABLE(0x00000002)标识,则正在调试进程。

2.如果ForceFlags!= 0,则正在调试进程。

不过要注意的是,_HEAP结构并未记录,并且Flags和ForceFlags字段的偏移值可能因操作系统版本而异。以下代码就是基于HeapFlag检查的反调试保护:

  1. int GetHeapFlagsOffset(bool x64) 
  2.     return x64 ? 
  3.         IsVistaOrHigher() ? 0x70 : 0x14: //x64 offsets 
  4.         IsVistaOrHigher() ? 0x40 : 0x0C; //x86 offsets 
  5. int GetHeapForceFlagsOffset(bool x64) 
  6.     return x64 ? 
  7.         IsVistaOrHigher() ? 0x74 : 0x18: //x64 offsets 
  8.         IsVistaOrHigher() ? 0x44 : 0x10; //x86 offsets 
  9. void CheckHeap() 
  10.     PVOID pPeb = GetPEB(); 
  11.     PVOID pPeb64 = GetPEB64(); 
  12.     PVOID heap = 0; 
  13.     DWORD offsetProcessHeap = 0; 
  14.     PDWORD heapFlagsPtr = 0, heapForceFlagsPtr = 0; 
  15.     BOOL x64 = FALSE; 
  16. #ifdef _WIN64 
  17.     x64 = TRUE; 
  18.     offsetProcessHeap = 0x30; 
  19. #else 
  20.     offsetProcessHeap = 0x18; 
  21. #endif 
  22.     heap = (PVOID)*(PDWORD_PTR)((PBYTE)pPeb + offsetProcessHeap); 
  23.     heapFlagsPtr = (PDWORD)((PBYTE)heap + GetHeapFlagsOffset(x64)); 
  24.     heapForceFlagsPtr = (PDWORD)((PBYTE)heap + GetHeapForceFlagsOffset(x64)); 
  25.     if (*heapFlagsPtr & ~HEAP_GROWABLE || *heapForceFlagsPtr != 0) 
  26.     { 
  27.         std::cout << "Stop debugging program!" << std::endl; 
  28.         exit(-1); 
  29.     } 
  30.     if (pPeb64) 
  31.     { 
  32.         heap = (PVOID)*(PDWORD_PTR)((PBYTE)pPeb64 + 0x30); 
  33.         heapFlagsPtr = (PDWORD)((PBYTE)heap + GetHeapFlagsOffset(true)); 
  34.         heapForceFlagsPtr = (PDWORD)((PBYTE)heap + GetHeapForceFlagsOffset(true)); 
  35.         if (*heapFlagsPtr & ~HEAP_GROWABLE || *heapForceFlagsPtr != 0) 
  36.         { 
  37.             std::cout << "Stop debugging program!" << std::endl; 
  38.             exit(-1); 
  39.         } 
  40.     } 

如何避开HeapFlag和ForceFlags检查

为了避开基于HeapFlag检查的反调试保护,应该为Flags字段设置HEAP_GROWABLE标识,并将ForceFlags的值设置为0.。但要注意的是,字段值的重新定义应该在HeapFlag检查之前执行。

陷阱标识检查

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读