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

26种对付反调试的方法

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

在Windows 2000中,ThreadHideFromDebugger这项技术用到了常常被用来设置线程优先级的API ntdll!NtSetInformationThread(),它是Windows提供的第一个反调试技术之一,功能非常强大。如果把该标识设置为一个线程,它将停止发送关于调试事件的通知。如果为主线程设置了ThreadHideFromDebugger,则这些事件包括关于程序完成的断点和通知。该标识的值存储在_ETHREAD结构的HideFromDebugger字段中,如下所示:

  1. 1: kd> dt _ETHREAD HideFromDebugger 86bfada8 
  2. ntdll!_ETHREAD 
  3.    +0x248 HideFromDebugger : 0y1 

以下是设置ThreadHideFromDebugger的示例:

  1. typedef NTSTATUS (NTAPI *pfnNtSetInformationThread)( 
  2.     _In_ HANDLE ThreadHandle, 
  3.     _In_ ULONG  ThreadInformationClass, 
  4.     _In_ PVOID  ThreadInformation, 
  5.     _In_ ULONG  ThreadInformationLength 
  6.     ); 
  7. const ULONG ThreadHideFromDebugger = 0x11; 
  8. void HideFromDebugger() 
  9.     HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll")); 
  10.     pfnNtSetInformationThread NtSetInformationThread = (pfnNtSetInformationThread) 
  11.         GetProcAddress(hNtDll, "NtSetInformationThread"); 
  12.     NTSTATUS status = NtSetInformationThread(GetCurrentThread(),  
  13.         ThreadHideFromDebugger, NULL, 0); 

如何避开从调试器隐藏线程

为了防止应用程序将线程隐藏到调试器中,需要钩住NtSetInformationThread函数调用。以下就是一个钩子代码:

  1. pfnNtSetInformationThread g_origNtSetInformationThread = NULL; 
  2. NTSTATUS NTAPI HookNtSetInformationThread( 
  3.     _In_ HANDLE ThreadHandle, 
  4.     _In_ ULONG  ThreadInformationClass, 
  5.     _In_ PVOID  ThreadInformation, 
  6.     _In_ ULONG  ThreadInformationLength 
  7.     ) 
  8.     if (ThreadInformationClass == ThreadHideFromDebugger &&  
  9.         ThreadInformation == 0 && ThreadInformationLength == 0) 
  10.     { 
  11.         return STATUS_SUCCESS; 
  12.     } 
  13.     return g_origNtSetInformationThread(ThreadHandle,  
  14.         ThreadInformationClass, ThreadInformation, ThreadInformationLength 
  15.                                          
  16. void SetHook() 
  17.     HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll")); 
  18.     if (NULL != hNtDll) 
  19.     { 
  20.         g_origNtSetInformationThread = (pfnNtSetInformationThread)GetProcAddress(hNtDll, "NtSetInformationThread"); 
  21.         if (NULL != g_origNtSetInformationThread) 
  22.         { 
  23.             Mhook_SetHook((PVOID*)&g_origNtSetInformationThread, HookNtSetInformationThread); 
  24.         } 
  25.     } 

在钩子函数中,当以正确的方式调用它时,就将返回STATUS_SUCCESS,而不将控制权转移到原始的NtSetInformationThread函数。

NtCreateThreadEx

(编辑:晋中站长网)

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

热点阅读