反调试

CrisCzy CrisCzy     2022-09-20     775

关键词:

反调试

  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存放了断点地址,若有一个寄存器存放了断点地址说明 被调试

反调试-checkremotedebuggerpresent

和IsDebuggerPresent差不多简单的反调试技术 查看详情

反调试-isdebuggerpresent

目前这个是我知道的最简单的反调试方法了 查看详情

反调试

反调试IsDebuggerPresent()__readgsqword(0x60)得到指向PEB64的指针,pPeb->BeingDebugged.__readfsdword(0x30)CheckRemoteDebuggerPresent(GetCurrentProcess(),&bIsDbgPresent)BOOL HeapFlags(),64位下,得到指向PEB的地址加 查看详情

elf反调试初探

ELF反调试初探http://www.freebuf.com/sectool/83509.html ELF(ExecutableandLinkableFormat)是Unix及类Unix系统下可执行文件、共享库等二进制文件标准格式。为了提高动态分析的难度,我们往往需要对ELF文件增加反调试措施。本文便对相关技术进... 查看详情

.NET:如何隔离反调试类库?

】.NET:如何隔离反调试类库?【英文标题】:.NET:Howtoisolateananti-debuggingclasslibrary?【发布时间】:2022-01-2212:28:51【问题描述】:我构建了一个.NET类库并使用混淆器通过反调试对其进行混淆。我使用我的混淆类库构建了一个测试项... 查看详情

javascript奇淫技巧:反调试

JavaScript奇淫技巧:反调试本文,将分享几种JS代码反调试技巧,目标是:实现防止他人调试、动态分析自己的代码。检测调试,方法一:用console.log检测代码:varc=newRegExp("1");c.toString=function()alert("检测到调试")console.log(c);原理:... 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

目录前言一、反调试技术概况二、静态反调试技术1、PEB2、NtQueryInformationProcess()(1)ProcessDebugPort(0x7)(2)ProcessDebugObjectHandle(0x1E)(3)ProcessDebugFlags(0x1F)(4)例子(5)破解之法3、NtQuerySystemIn... 查看详情

一种基于tls的高级反调试技术(代码片段)

...越引起人们的重视。在反盗版技术中,起最大作用的当属反调试技术。然而传统的反调试技术都存在一个弱点:他们都在程序真正开始执行之后才采取反调试手段。实际上在反调试代码被执行前,调试器有大量的时间来影响程序... 查看详情

java层反调试

...调式,在build.prop(boot.img),ro.debugable=1。一:实例演示java层反调试以“百度加固”为例。1.将样本拖入jdax-gui中,进行反编译,来到加固程序的onCreate里,如下图所示。2 查看详情

反调试技术常用api,用来对付检测od和自动退出程序

在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术... 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

目录前言一、反调试技术概况二、静态反调试技术1、PEB2、NtQueryInformationProcess()(1)ProcessDebugPort(0x7)(2)ProcessDebugObjectHandle(0x1E)(3)ProcessDebugFlags(0x1F)(4)例子 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

目录前言一、反调试技术概况二、静态反调试技术1、PEB2、NtQueryInformationProcess()(1)ProcessDebugPort(0x7)(2)ProcessDebugObjectHandle(0x1E)(3)ProcessDebugFlags(0x1F)(4)例子 查看详情

ios逆向笔记之反调试以及反反调试和反反反调试ptrace篇

参考技术A1.ptrace(processtrace进程跟踪)为了方便软件的开发和调试,UNIX早期版本就提供了一种对运行进程进行跟踪和控制的手段,那就是系统调用ptrace.通过ptrace可以实现对另一个进程实现调试和跟踪.同时,ptrace提供了一个非常有用的... 查看详情

c++反调试(基于seh的setunhandledexceptionfilter)

终于!终于把静态反调试串了一遍,虽然没有包含全部但是也对反调试的轮廓有了初步的认识。但是这一切才刚刚开始,翻过一座山(坑),还有另一座山(坑)在等着你?刚发现csdn还有个发表情的功能,这就是传说中的彩蛋吗... 查看详情

frida反调试

...某app时,想用frida进行hook分析其执行流程,遇到了frida的反调试。这里记录一下出现问题的情况和反调试的实现.Android8frida12.11.18windows10使用frida-U注入app结果如下这里有两个com.shark.tracerpidapp名称的进程我们直接进入adb查看进程可... 查看详情

逆向分析反调试程序

...行下正常2.打密码密码错误3.用OD调试发现报异常说明做了反调试(OD不要用插件不然他会反反调试看不到)4.(这里要用到win7了因为win10报异常不知道在哪里)win10效果win7效果可以看出异常地址在哪里5.知道异常地址在哪了用ida静... 查看详情

ida动态调试破解alicrackme与反调试对抗(代码片段)

文章目录前言APK破解(上)1.1静态分析1.2动态分析反调试对抗2.1Ptrace2.2全局调试2.3反反调试APK破解(下)3.1重新编译3.2动态调试总结前言在前面的文章中IDA动态调试破解EXE文件与分析APK流程介绍了IDA对APK进行动态调试分析的简单流程&#... 查看详情

学习:反调试之检测类名与标题名(代码片段)

反调试之检测类名与标题名:通过FindWindow函数来进行反调试HWNDFindWindowA(LPCSTRlpClassName,LPCSTRlpWindowName);返回值类型:类型:HWND如果函数成功,则返回值是具有指定类名和窗口名的窗口的句柄。如果函数失败,则返回值为NULL。要获... 查看详情