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

26种对付反调试的方法

发布时间:2019-03-22 05:51:46 所属栏目:建站 来源: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; 

(编辑:河北网)

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

热点阅读