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

26种对付反调试的方法

发布时间:2019-03-22 03:36:50 所属栏目:建站 来源:luochicun
导读:今朝首要有3种说明软件的要领: 1.数据互换说明,研究职员行使数据包嗅探器材来说明收集数据互换。 2.对软件的二进制代码举办反汇编,然后以汇编说话列出。 3.字节码解码或二进制解码,然后以高级编程说话从头建设源代码。 本文针对的是Windows操纵体系中

在这里,我们配置了一个VEH处理赏罚措施并发生间断(不必要int 1h)。在间断天生时,呈现非常,节制被传送到VEH处理赏罚措施。假如配置了硬件断点,措施执行遏制。假如没有硬件断点,则EIP寄存器值会增进2,以在int 1h处天生指令后继承执行。

怎样避开硬件断点搜查和VEH

我们来看看导致VEH处理赏罚措施的挪用仓库:

  1. 0:000> kn 
  2.  # ChildEBP RetAddr   
  3. 00 001cf21c 774d6822 AntiDebug!ExceptionHandler  
  4. 01 001cf26c 7753d151 ntdll!RtlpCallVectoredHandlers+0xba02 001cf304 775107ff ntdll!RtlDispatchException+0x7203 001cf304 00bf4a69 ntdll!KiUserExceptionDispatcher+0xf04 001cfc1c 00c2680e AntiDebug!main+0x59  
  5. 05 001cfc30 00c2665a AntiDebug!invoke_main+0x1e  
  6. 06 001cfc88 00c264ed AntiDebug!__scrt_common_main_seh+0x15a  
  7. 07 001cfc90 00c26828 AntiDebug!__scrt_common_main+0xd  
  8. 08 001cfc98 753e7c04 AntiDebug!mainCRTStartup+0x8  
  9. 09 001cfcac 7752ad1f KERNEL32!BaseThreadInitThunk+0x24 
  10. 0a 001cfcf4 7752acea ntdll!__RtlUserThreadStart+0x2f 
  11. 0b 001cfd04 00000000 ntdll!_RtlUserThreadStart+0x1b 

我们可以看到,节制从主+ 0x59转移到ntdll!KiUserExceptionDispatcher。让我们看看主+ 0x59中的什么指令导致了这个挪用:

  1. 0:000> u main+59 L1 
  2. AntiDebug!main+0x59 
  3. 00bf4a69 cd02            int     1       

这是发生间断的指令, KiUserExceptionDispatcher函数是体系从内核模式挪用到用户模式的回调要领之一。以下是它的署名:

  1. VOID NTAPI KiUserExceptionDispatcher( 
  2.     PEXCEPTION_RECORD pExcptRec,  
  3.     PCONTEXT ContextFrame 
  4. ); 

下面就是避开了应用KiUserExceptionDispatcher函数钩子的硬件断点搜查的代码:

  1. typedef  VOID (NTAPI *pfnKiUserExceptionDispatcher)( 
  2.     PEXCEPTION_RECORD pExcptRec, 
  3.     PCONTEXT ContextFrame 
  4.     ); 
  5. pfnKiUserExceptionDispatcher g_origKiUserExceptionDispatcher = NULL; 
  6. VOID NTAPI HandleKiUserExceptionDispatcher(PEXCEPTION_RECORD pExcptRec, PCONTEXT ContextFrame) 
  7.     if (ContextFrame && (CONTEXT_DEBUG_REGISTERS & ContextFrame->ContextFlags)) 
  8.     { 
  9.         ContextFrame->Dr0 = 0; 
  10.         ContextFrame->Dr1 = 0; 
  11.         ContextFrame->Dr2 = 0; 
  12.         ContextFrame->Dr3 = 0; 
  13.         ContextFrame->Dr6 = 0; 
  14.         ContextFrame->Dr7 = 0; 
  15.         ContextFrame->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS; 
  16.     } 
  17. __declspec(naked) VOID NTAPI HookKiUserExceptionDispatcher()  
  18. // Params: PEXCEPTION_RECORD pExcptRec, PCONTEXT ContextFrame 
  19.     __asm 
  20.     { 
  21.         mov eax, [esp + 4] 
  22.         mov ecx, [esp] 
  23.         push eax 
  24.         push ecx 
  25.         call HandleKiUserExceptionDispatcher 
  26.         jmp g_origKiUserExceptionDispatcher 
  27.     } 
  28. int main() 
  29.     HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll")); 
  30.     g_origKiUserExceptionDispatcher = (pfnKiUserExceptionDispatcher)GetProcAddress(hNtDll, "KiUserExceptionDispatcher"); 
  31.     Mhook_SetHook((PVOID*)&g_origKiUserExceptionDispatcher, HookKiUserExceptionDispatcher); 
  32.     return 0; 

在这个例子中,DRx寄存器的值在HookKiUserExceptionDispatcher函数中被复位,即在VEH处理赏罚措施挪用之前。

NtSetInformationThread —从调试器潜匿线程

(编辑:湖南网)

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

热点阅读