加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

26种对付反调试的方法

发布时间:2019-03-22 03:36:50 所属栏目:建站 来源: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搜查之前执行。

陷阱标识搜查

(编辑:湖南网)

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

热点阅读