190328 逆向-浅谈反调试

调试机制

Linux

通过ptrace系统调用来调试子进程
对于create类型,与正常创建子进程工序相同,通过fork创建子进程后使用traceme来告知内核它需要被调试,这样等到exec执行的时候内核就会产生SIGTRAP,此时调用wait的父进程就会接收到这个信号并ptrace子进程,从而使得调试优先于子进程的所有内容
而对于attach类型,是父进程直接使用ptrace去调试其他进程,如果此时子进程已经被调试那么就会报错

Windows

通过调试对象(或者说是API)来进行通信
Windows系统的复杂度比Linux高很多,所以调试相关的东西对于用户态来说基本都是API来操作
对于create类型,父进程CreateProcess时直接传入DEBUG_PROCESS的标志即可
对于attach类型,则是调用DebugActiveProcess的API来实现的

反调试

  • Windows

    • PEB
      当进程被调试时会在进程环境块中设置很多内容,这些内容都可以被检测到。包括BeingDebugged、NTGlobalFlags、调试堆、DebugPort等等
    • API
      例如ZwSetInformationThread可以设置ThreadHideFromDebugger标志,使得进程不接受被调试
  • Linux

    • ptrace(trace_me)
      当使用trace_me后进程即会进入被调试的状态,此时别的进程就无法主动附加
    • self/$pid/status
      status中会显示tid、ppid等
  • x86通用

    • 检测调试器特征
      进程遍历
    • 断点检查和HOOK
      检查INT 3(0xcc)、HOOK调试函数
    • 异常处理
      调试器会优先接收子进程的异常,从而产生区别
    • 父进程
      Windows下正常的父进程应该是explorer.exe(从文件管理器启动)、cmd.exe(从命令行启动)、Services.exe(系统服务)
      Linux下正常的进程一般是由bash fork出来的

反反调试

几乎所有用户态反调试只要被抓到即可轻而易举地破解,所以关键问题在于发现反调试
而反调试的种类过于繁多,个人建议通读参考资料,当发现可疑代码时再行检查

参考文章:
26种反调试的方法
详解反调试技术

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值