码迷,mamicode.com
首页 > 其他好文 > 详细

反调试(一)

时间:2017-09-22 16:34:41      阅读:602      评论:0      收藏:0      [点我收藏+]

标签:obj   rom   param   output   信息   windows   format   glob   filter   

反调试

  1. IsDebuggerPresent()
  2. __readgsqword(0x60)得到指向PEB64的指针,pPeb->BeingDebugged .__readfsdword(0x30)
  3. CheckRemoteDebuggerPresent(GetCurrentProcess(), &bIsDbgPresent)
  4. BOOL HeapFlags(),64位下,得到指向PEB的地址加上0x30的偏移得到pProcessHeap,由于pHeapFlags在不同版本的操作系统中位置不一,需要IsWindowsVistaOrGreater()判断大概版本,高于VISTA的版本pProcessHeap解星号加上0x70的偏移得到pHeapFlags,低于高于VISTA的版本pProcessHeap解星号加上0x14的偏移得到pHeapFlags
    32位下,得到指向PEB的地址加上0x18的偏移得到pProcessHeap,由于pHeapFlags在不同版本的操作系统中位置不一,需要IsWindowsVistaOrGreater()判断大概版本,高于VISTA的版本pProcessHeap解星号加上0x40的偏移得到pHeapFlags,低于VISTA的版本pProcessHeap解星号加上0x0C的偏移得到pHeapFlags。判断*pHeapFlags > 2 是否为真
  5. __readgsqword(0x30)得到TEB64指针.*(DWORD64*)(_teb64 + 0x60)得到PEB64结构体,PEB64取偏移0xBC得到NTGlobalFlag。
    __readfsdword(0x18)得到TEB32指针.*(DWORD64*)(_teb32 + 0x30)得到PEB32结构体,PEB32取偏移0x68得到NTGlobalFlag
    假如是wow64下的__readfsdword(0x18)得到TEB64指针.*(DWORD64*)(_teb64 + 0x60)得到PEB64结构体,PEB64取偏移0xBC得到NTGlobalFlag当进程被调试时,NTGlobalFlag会被置为FLG_HEAP_ENABLE_TAIL_CHECK (0x10), FLG_HEAP_ENABLE_FREE_CHECK(0x20), 和 FLG_HEAP_VALIDATE_PARAMETERS(0x40)即0x70
  6. BOOL HeapForceFlags(),64位下,得到指向PEB的地址加上0x30的偏移得到pProcessHeap,由于pHeapForceFlags在不同版本的操作系统中位置不一,需要IsWindowsVistaOrGreater()判断大概版本,高于VISTA的版本pProcessHeap解星号加上0x74的偏移得到pHeapFlags,低于高于VISTA的版本pProcessHeap解星号加上0x18的偏移得到pHeapFlags
    32位下,得到指向PEB的地址加上0x18的偏移得到pProcessHeap,由于pHeapForceFlags在不同版本的操作系统中位置不一,需要IsWindowsVistaOrGreater()判断大概版本,高于VISTA的版本pProcessHeap解星号加上0x44的偏移得到pHeapForceFlags,低于VISTA的版本pProcessHeap解星号加上0x10的偏移得到pHeapFlags。判断*pHeapFlags > 2 是否为真
  7. 通过LoadLibrary  得到ntdll的句柄hNtdll,通过GetProcAddress从ntdll模块中得到NtQueryInformationProcess  const int ProcessDbgPort = 7;
    NtQueryInfoProcess(GetCurrentProcess(),
     ProcessDbgPort, 
    &IsRemotePresent, 
    dProcessInformationLength, 
    NULL) 当IsRemotePresent不等于0时 进程被调试
  8. 通过LoadLibrary  得到ntdll的句柄hNtdll,通过GetProcAddress从ntdll模块中得到NtQueryInformationProcess  const int ProcessDebugFlags =  0x1f;
    NtQueryInfoProcess(GetCurrentProcess(),
     ProcessDebugFlags,
     &NoDebugInherit, 
    sizeof(DWORD), 
    NULL);NoDebugInherit精确等于0时,被调试
  9. 通过LoadLibrary  得到ntdll的句柄hNtdll,通过GetProcAddress从ntdll模块中得到NtQueryInformationProcess  const int ProcessDebugObjectHandle =  0x1e;NtQueryInfoProcess(GetCurrentProcess(), ProcessDebugObjectHandle, &hDebugObject, dProcessInformationLength, NULL);hDebugObject不为空
  10. 通过GetProcAddress从ntdll模块中得到NtSetInformationThreadThreadInformationClass设置为0x11(ThreadHideFromDebugger),用于隐藏调试器中的线程,调用之后调试器与该线程不再关联  NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);当函数成功时,被调试
  11. CloseHandle_InvalideHandle()当进程被调试时,调用CloseHandle并传入无效句柄,会得到一个STATUS_INVALID_HANDLE的异常,函数返回TRUE。__try {NtClose_((HANDLE)0x99999999);}__except (EXCEPTION_EXECUTE_HANDLER) {return TRUE;}
  12. UnhandledExcepFilterTest () 设置一个SetUnhandledExceptionFilter。然后利用RaiseException提出一个异常交给异常处理机制 由于没有设置相应的异常处理程序 当进程被调试时,会通知进程的调试器,而不会调用UnhandledExceptionFilter
  13. OutputDebugStringAPI(),只在XP或2000中适用。OutputDebugString()用于输出字符串给调试器显示。若GetLastError被置为Val,说明调试器与进程关联。
  14. HardwareBreakpoints(),初始化PCONTEXT ctx,将ctx->ContextFlags = CONTEXT_DEBUG_REGISTERS。通过GetThreadContext(GetCurrentThread(), ctx)得到寄存器信息,硬件断点,用Dr0-Dr7七个寄存器控制。Dr1-Dr3存放了断点地址,若有一个寄存器存放了断点地址说明 被调试

反调试(一)

标签:obj   rom   param   output   信息   windows   format   glob   filter   

原文地址:http://www.cnblogs.com/Crisczy/p/7575521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!