zoukankan      html  css  js  c++  java
  • 反调试手段

    调用函数检测方式
    ----------------------------------------------------
    IsDebuggerPresent(检测本进程)
    检查进程环境块(PEB)中IsDebugged标志
    如果没有被调试就返回0,如果调试附加了进程,函数返回非零值
     
    CheckRemoteDebuggerPresent(检测其他进程)
    这个函数和上面的函数检测的原理是一致的,但是他可以检查其他进程是否被调试,他需要一个进程句柄
     
    NtQueryInformationProcess
    此函数是Ntdll中的一个原生态的API,它用来提取一个给定的进程信息,第一个参数是进程句柄,第二个参数是想获取的进程相关的信息,如果将此参数设置为ProcessDebugPort(值为0x7),如果该程序被调试,则函数的返回值是调试端口,否则返回0
     
    OutputDebugString
    在有调试器存在和没有调试器存在时,OutputDebugString函数表现会有所不同。最明显的不同是, 如果有调试器存在,其后的GetLastError()的返回值为零。
    解析:先设置一个错误码,如果函数返回失败,就会重置错误码,相反如果错误码没有变,就证明OutputDebugString返回成功,正在被调试
     
    ----------------------------------------------------
    手动检查反调试
    1.检测BeingDebugged
    原理是我们可以检测PEB结构(进程环境块)
    我们可以检测FS:[30h]找到PEB的基址,然后检测BeingDebugged标志查看是否被调试

    具体代码

    2.检测ProcessHeap属性
    它处于PEB结构的0X18处,他被设置为加载器为进程分配的第一个堆的位置,第一个堆头有一个属性字段,他告诉这个堆是否在调试器中创建(ForceFlags和Flags)
    在XP中ForceFlags位于堆头部偏移量0x10处,在win7他在0x44处
    同理在XP中偏移量0x0C或者win7系统中偏离量0x40中查看Flags属性
    经过两次解析后检测方式
     
    3检查NTGlobalFlag
    检查PEB的0x68处标志位是否为0x70h

     

    --------------------------------------------------
    系统痕迹检测
    简单的说 如果有调试器调试我们程序,那么在注册表中会有注册表项修改
    -----------------------------------------
    INT扫描
    查看int3 (0xcc)是否存在
     
    执行代码校验和检查
    查看CRC或者MD5校验
     
    时钟检测
    使用rdstc指令
    使用QueryPerformanceCounter和GetTickCount
     
    -------------------------------------------------
    使用TLS回调
    检测程序是否有.tls段,如果有在IDA中Ctrl+E来查看回调函数,TLS回调函数都拥有一个前缀字符串TlsCallback
    使用异常
    原理就是我们的调试器通常遇到异常都会自己处理,不会交给程序自己处理,那么利用这一点,恶意代码程序就会检测异常是否由自己实现的异常处理函数处理,如果没有被处理,则视为在已经被调试
    破解方法:在我们调试中,可以将所有的异常都由用户自己处理
     
    ----------------------------------------------
    插入中断
    1.插入INT3
    双字节操作码0xCD03可以产生INT3中断,这种大部分用在干扰WinDbg,0XCD03会产生一个STATUS_BREAKPOINT异常,在WinDbg中由于断点是单字节0xcc 所以WinDbg会捕获到这个断点,将EIP加1,这样会导致程序错误执行
     
    2.INT 2D
    类似的有INT 2D 它与INT3类似,INT2D用来探测内核调试器
     
    --------------------------------------------------
    调试器漏洞
    1.PE头漏洞
    是利用修改PE文件,当OD在加载PE文件时候,导致OD崩溃
    错误结果是Bad or Unknown 32-bit Executable File
    利用扩展头中的NumberOfRvaAndSizes
    这个值普通是0x10,如果这个值大于0x10后,Winodws加载器会忽略这个值,但是OD在使用的时候,发现大于0x10,OD则会崩溃
    还有一种PE头欺骗,就是当弹出"File contains too much data" 这是因为PE文件的扩展头中
    2.OutputDebugString漏洞

  • 相关阅读:
    Python3之命令行参数处理
    基于 Laradock 环境 Project 的总结
    Typora功能新发现-自动复制图片到指定目录下
    ubuntu 18.04 设置静态ip方法
    vscode 同时编辑多处,多个光标 快捷键
    nginx和ftp搭建图片服务器
    Centos 6.5出现yum安装慢的情况
    Linux中的CentOS 6克隆之后修改
    springMVC-文件上传CommonsMultipartFile
    Spring和mybatis整合 org.mybatis.spring.mapper.MapperScannerConfigurer
  • 原文地址:https://www.cnblogs.com/Tempt/p/9988255.html
Copyright © 2011-2022 走看看