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

26种对付反调试的方法

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

 目前主要有3种分析软件的方法:

1.数据交换分析,研究人员使用数据包嗅探工具来分析网络数据交换。

2.对软件的二进制代码进行反汇编,然后以汇编语言列出。

3.字节码解码或二进制解码,然后以高级编程语言重新创建源代码。

本文针对的是Windows操作系统中常用的防破解及防逆向工程保护技术,即反调试方法,各种防逆向工程技术的主要目标是尽可能多的使逆变工具尽可能失效。

26种对付反调试的方法

本文的对付反调试方法,总共涉及26种:

1. IsDebuggerPresent

2. PEB(进程环境块)

3.如何避开IsDebuggerPresent的检查

4. TLS回调

5.NtGlobalFlag

6.如何避开NtGlobalFlag检查

7.NtGlobalFlag和IMAGE_LOAD_CONFIG_DIRECTORY

8.HeapFlag和ForceFlags

9.如何避开HeapFlag和ForceFlags

10.陷阱标识检查

11如何避开陷阱标识检查

12.CheckRemoteDebuggerPresent和NtQueryInformationProcess

13.如何避开CheckRemoteDebuggerPresent和NtQueryInformationProcess

14.基于NtQueryInformationProcess的其他反调试保护技术

15.如何避开NtQueryInformationProcess检查

16.软件和硬件的断点反应

17.SEH(结构化异常处理)

18.如何避开SHE检查

19.VEH(向量化异常处理)

20.如何避开硬件断点检查和VEH

21.NtSetInformationThread ,在调试工具中隐藏线程

22.如何避开从调试工具中隐藏线程

23.NtCreateThreadEx

24. 如何避开NtCreateThreadEx

25.处理跟踪

26.堆栈段操作

建议你在阅读本文时,先具备一定的Assembler知识,一些Windbg操作经验以及使用API函数开发Windows的经验。

IsDebuggerPresent

也许最简单的方法是调用IsDebuggerPresent函数,用此函数检测用户模式的调试器是否正在调试调用进程。下面的代码就是一个基本的保护案例:

  1. int main() 
  2.     if (IsDebuggerPresent()) 
  3.     { 
  4.         std::cout << "Stop debugging program!" << std::endl; 
  5.         exit(-1); 
  6.     } 
  7.     return 0; 

如果我们来看看IsDebuggerPresent函数,我们会发现这样的代码:

  1. 0:000< u kernelbase!IsDebuggerPresent L3 
  2. KERNELBASE!IsDebuggerPresent: 
  3. 751ca8d0 64a130000000    mov     eax,dword ptr fs:[00000030h] 
  4. 751ca8d6 0fb64002        movzx   eax,byte ptr [eax+2] 
  5. 751ca8da c3              ret 

Windows X64里的进程如下:

  1. 0:000< u kernelbase!IsDebuggerPresent L3 
  2. KERNELBASE!IsDebuggerPresent: 
  3. 00007ffc`ab6c1aa0 65488b042560000000 mov   rax,qword ptr gs:[60h] 
  4. 00007ffc`ab6c1aa9 0fb64002           movzx eax,byte ptr [rax+2] 
  5. 00007ffc`ab6c1aad c3                 ret 

在FS寄存器的偏移量30h处存在PEB(进程环境块),而在X64上,PEB(进程环境块)存在于GS段寄存器的偏移量60h处。在PEB中的2个偏移量处,我们将找到BeingDebugged字段:

  1. 0:000< dt _PEB 
  2. ntdll!_PEB 
  3.    +0x000 InheritedAddressSpace : UChar 
  4.    +0x001 ReadImageFileExecOptions : UChar 
  5.    +0x002 BeingDebugged    : UChar 

即IsDebuggerPresent函数读取BeingDebugged字段的值。如果进程被调试,值为1,否则为0。

PEB(进程环境块)

PEB是在操作系统内使用的封闭结构。在不同地运行环境下,大家应该以不同的方式获取PEB结构指针。如下所示,你可以在下图中找到x32和x64系统的PEB指针:

  1. // Get PEB for WOW64 Process 
  2. PVOID GetPEB64() 
  3.     PVOID pPeb = 0; 
  4. #ifndef _WIN64 
  5.     // 1. There are two copies of PEB - PEB64 and PEB32 in WOW64 process 
  6.     // 2. PEB64 follows after PEB32 
  7.     // 3. This is true for version less then Windows 8, else __readfsdword returns address of real PEB64 
  8.     if (IsWin8OrHigher()) 
  9.     { 
  10.         BOOL isWow64 = FALSE; 
  11.         typedef BOOL(WINAPI *pfnIsWow64Process)(HANDLE hProcess, PBOOL isWow64); 
  12.         pfnIsWow64Process fnIsWow64Process = (pfnIsWow64Process) 
  13.             GetProcAddress(GetModuleHandleA("Kernel32.dll"), "IsWow64Process"); 
  14.         if (fnIsWow64Process(GetCurrentProcess(), &isWow64)) 
  15.         { 
  16.             if (isWow64) 
  17.             { 
  18.                 pPeb = (PVOID)__readfsdword(0x0C * sizeof(PVOID)); 
  19.                 pPeb = (PVOID)((PBYTE)pPeb + 0x1000); 
  20.             } 
  21.         } 
  22.     } 
  23. #endif 
  24.     return pPeb; 

(编辑:厦门网)

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

热点阅读