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

26种对付反调试的方法

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

Windows Vista引入了NtCreateThreadEx函数,其函数如下:

  1. NTSTATUS NTAPI NtCreateThreadEx ( 
  2.     _Out_    PHANDLE              ThreadHandle, 
  3.     _In_     ACCESS_MASK          DesiredAccess, 
  4.     _In_opt_ POBJECT_ATTRIBUTES   ObjectAttributes, 
  5.     _In_     HANDLE               ProcessHandle, 
  6.     _In_     PVOID                StartRoutine, 
  7.     _In_opt_ PVOID                Argument, 
  8.     _In_     ULONG                CreateFlags, 
  9.     _In_opt_ ULONG_PTR            ZeroBits, 
  10.     _In_opt_ SIZE_T               StackSize, 
  11.     _In_opt_ SIZE_T               MaximumStackSize, 
  12.     _In_opt_ PVOID                AttributeList 
  13. ); 

最有趣的参数是CreateFlags,这个参数的标识如下:

  1. #define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001 
  2. #define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002 
  3. #define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004 
  4. #define THREAD_CREATE_FLAGS_HAS_SECURITY_DESCRIPTOR 0x00000010 
  5. #define THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET 0x00000020 
  6. #define THREAD_CREATE_FLAGS_INITIAL_THREAD 0x00000080    

如果一个新线程获取了THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER标识,它将在调试器创建时被隐藏。它是由NtSetInformationThread函数设置的ThreadHideFromDebugger,负责安全运行的代码可以在设置了THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER标识的线程中执行。

如何避开NtCreateThreadEx

该技术可以通过钩子NtCreateThreadEx函数来避开,其中THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER将被重置。

如何处理跟踪

从Windows XP开始,系统就配置了内核对象句柄跟踪的机制。当跟踪模式打开时,具有处理程序的所有操作都将保存到循环缓冲区,同时也尝试使用不存在的处理程序,例如,使用CloseHandle函数关闭它,将生成EXCEPTION_INVALID_HADNLE异常。如果进程不是从调试器启动,那么CloseHandle函数将返回FALSE。以下就是基于CloseHandle的防调试保护:

  1. EXCEPTION_DISPOSITION ExceptionRoutine( 
  2.     PEXCEPTION_RECORD ExceptionRecord, 
  3.     PVOID             EstablisherFrame, 
  4.     PCONTEXT          ContextRecord, 
  5.     PVOID             DispatcherContext) 
  6.     if (EXCEPTION_INVALID_HANDLE == ExceptionRecord->ExceptionCode) 
  7.     { 
  8.         std::cout << "Stop debugging program!" << std::endl; 
  9.         exit(-1); 
  10.     } 
  11.     return ExceptionContinueExecution; 
  12. int main() 
  13.     __asm 
  14.     { 
  15.         // set SEH handler 
  16.         push ExceptionRoutine 
  17.         push dword ptr fs : [0] 
  18.         mov  dword ptr fs : [0], esp 
  19.     } 
  20.     CloseHandle((HANDLE)0xBAAD); 
  21.     __asm 
  22.     { 
  23.         // return original SEH handler 
  24.         mov  eax, [esp] 
  25.         mov  dword ptr fs : [0], eax 
  26.         add  esp, 8 
  27.     } 
  28.     return 0 

堆栈段操作

(编辑:应用网_镇江站长网)

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

热点阅读