加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

26种对付反调试的方法

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

检查操作系统版本的功能代码如下:

  1. WORD GetVersionWord() 
  2.     OSVERSIONINFO verInfo = { sizeof(OSVERSIONINFO) }; 
  3.     GetVersionEx(&verInfo); 
  4.     return MAKEWORD(verInfo.dwMinorVersion, verInfo.dwMajorVersion); 
  5. BOOL IsWin8OrHigher() { return GetVersionWord() >= _WIN32_WINNT_WIN8; } 
  6. BOOL IsVistaOrHigher() { return GetVersionWord() >= _WIN32_WINNT_VISTA; }        

如何避开IsDebuggerPresent检查

为了做到这一点,在执行检查代码之前,需要将0置于BeingDebugged。例如,可以使用DLL注入:

  1. mov eax, dword ptr fs:[0x30]   
  2. mov byte ptr ds:[eax+2], 0 

Windows X64里的进程如下:

  1. DWORD64 dwpeb = __readgsqword(0x60); 
  2. *((PBYTE)(dwpeb + 2)) = 0; 

TLS回调

其实,在主函数中检查调试器的存在不是最好的方法,因为TLS回调处于反汇编列表时反向工具的第一个位置。它实施的检查可以由nop指令擦除,从而解除保护。如果使用CRT库,则在将控制权转移到主函数之前,主线程就已经有一个调用堆栈了。执行调试器存在检查的一个方法便是TLS回调。如下图所示,在可执行模块入口调用之前就已经调用回调函数。

  1. #pragma section(".CRT$XLY", long, read) 
  2. __declspec(thread) int var = 0xDEADBEEF; 
  3. VOID NTAnopPI TlsCallback(PVOID DllHandle, DWORD Reason, VOID Reserved) 
  4.     var = 0xB15BADB0; // Required for TLS Callback call 
  5.     if (IsDebuggerPresent()) 
  6.     { 
  7.         MessageBoxA(NULL, "Stop debugging program!", "Error", MB_OK | MB_ICONERROR); 
  8.         TerminateProcess(GetCurrentProcess(), 0xBABEFACE); 
  9.     } 
  10. __declspec(allocate(".CRT$XLY"))PIMAGE_TLS_CALLBACK g_tlsCallback = TlsCallback; 

NtGlobalFlag

在Windows NT中,存在一组标识,它们存储在全局变量NtGlobalFlag中。在系统启动时,NtGlobalFlag全局系统变量将使用系统注册表项中的值进行初始化:

  1. [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerGlobalFlag] 

(编辑:源码网)

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

热点阅读