Anti-Debug 小试牛刀

转载 2013年12月04日 12:31:18

Anti-Debug 小试牛刀 

本文整理了日常生活中遇到的一些Anti-Debug技术,除非特殊说明,均适用于Mac/iOS开发
作为第一篇正式博文,会不定期更新,谢谢大家.

  1. 禁止附加或调试-ptrace
  2. 中断检测-int3
  3. 检测lldb
  4. 更多

禁止附加或调试-ptrace

PT_DENY_ATTACH1 is an Apple-specific constant that can prevent debuggers (gdb, DTrace, etc.) from debugging your binary in kernel-level.
通过调用ptrace函数,并传入PT_DENY_ATTACH参数,可以实现禁止调试,示例代码如下:

1
2
3
4
5
6
7
8
9
#define PT_DENY_ATTACH  31
#include <stdio.h>

int main()
{
  ptrace(PT_DENY_ATTACH, 0, 0, 0);
  printf("Hello\n");
  return 0;
}

程序正常运行,会输出hello
但是程序加载到gdb中,就不能正常运行,输出如下:

GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin13.0.0".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file ./anti-debug-1.o
Reading symbols from /Users/ioshack/Desktop/anti-debug-1.o...(no debugging symbols found)...done.
(gdb) r
Starting program: /Users/ioshack/Desktop/anti-debug-1.o 
[Inferior 1 (process 7639) exited with code 055]
(gdb) q  

看,程序直接退出了。

中断检测-int3

通过在程序中设置信号处理函数,并主动触发中断,也可以检测是否被调试,先来看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <signal.h>

void handler(int signo)
{
    printf("You can do something here!\n");
}

int main(int argc, const char * argv[])
{
    signal(SIGTRAP,handler);
    __asm__("int3");
    printf("Always say: Hello\n");
    return 0;
}

通过主动执行__asm__("int3"),我们触发了一个SIGTRAP的中断信号,然后我们又安插了一个信号处理函数,来捕获这个中断。
正常运行的结果输出如下:

ioshackdeMacBook-Pro:Desktop ioshack$ ./anti-debug-2.o
You can do something here!
Always say: Hello  

而如果在调试状态中,我们触发的中断信号会被调试器捕获,是不会执行我们的异常处理函数的。

GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin13.0.0".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file ./anti-debug-2.o
Reading symbols from /Users/ioshack/Desktop/anti-debug-2.o...(no debugging symbols found)...done.
(gdb) r
Starting program: /Users/ioshack/Desktop/anti-debug-2.o 

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000100000f24 in main ()
(gdb) c
Continuing.
Always say: Hello
[Inferior 1 (process 7686) exited normally]

这样,我们可以在信号处理函数中干一些事情,嘻嘻。

检测lldb

再来介绍一种专门针对lldb调试器的检测手段,代码如下:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>

int main() {
  struct winsize win;
  puts ((isatty (1) && !ioctl (1, TIOCGWINSZ, &win) && !win.ws_col)?
          "You are being traced by lldb": "Everything is fine");
  return 0;
}

程序正常运行,输出:

ioshackdeMacBook-Pro:Desktop ioshack$ ./anti-debug-lldb.o 
Everything is fine  

程序加载到lldb中,输出如下:

ioshackdeMacBook-Pro:Desktop ioshack$ lldb anti-debug-lldb.o
Current executable set to 'anti-debug-lldb.o' (x86_64).
(lldb) r
Process 7701 launched: '/Users/ioshack/Desktop/anti-debug-lldb.o' (x86_64)
You are being traced by lldb
Process 7701 exited with status = 0 (0x00000000)   

注意,这种方法对gdb不管用。

更多

所有的检测手段在你拿到解密的二进制文件之后都是可以破解的,这是一个矛与盾的双面。
没有最好,只有更好。
检测的方式有很多,遇到了再慢慢补充,希望本博文对你有所帮助,再次感谢你的耐心阅读。
大牛们手下留情,多给点鼓励啊~~


  1. http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man2/ptrace.2.html

脱壳的艺术(Anti-debug),调试器检测技术

概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年04月08日 11:22
  • 2676

trace_anti_debug.zip

  • 2016年08月13日 20:47
  • 1.71MB
  • 下载

反调试(Anti-debug)

盗版也反盗版一直是共存的矛盾体,也是在数字版权领域争论不休的一块领域。破解与反破解,侦测与反侦测也正是基于此而生生不息,欣欣向荣。鉴于此,安全软件是作为守方的我们所锲而不舍的目标。抛却...
  • winner82
  • winner82
  • 2008年10月05日 17:00
  • 2777

x64 antidebug 不触发PG 补充代码

因为搬家了  还有 板砖很忙 没办法 工头都懂得的~~~~ 先说antiantidebug 都知道 32位的驱动保护  不用VT说白了就是 HOOK过来 HOOK过去  比的是谁的 钩子深  谁的 钩...
  • qq_18942885
  • qq_18942885
  • 2015年08月05日 12:31
  • 1415

Anti-Debug 小试牛刀

Anti-Debug 小试牛刀  本文整理了日常生活中遇到的一些Anti-Debug技术,除非特殊说明,均适用于Mac/iOS开发 作为第一篇正式博文,会不定期更新,谢谢大家. ...
  • langzxz
  • langzxz
  • 2013年12月04日 12:31
  • 2410

Windows Anti-Debug Reference

This paper classifies and presents several anti-debugging techniques used on Windows NT-based operat...
  • fengyunzhongwei
  • fengyunzhongwei
  • 2014年09月09日 20:34
  • 822

吃一口肥肉之小程序牛刀小试(一)

小程序发布几天了,这两天我也好信牛刀小试一下。 记录下一天的战绩,自我理解和总结。看看效果: 注:这是一个更换头像效果,点击头像然后弹出本机照片(我用电脑测试的效果,如果是手机应该是弹出相...
  • mdzzzhangxian
  • mdzzzhangxian
  • 2017年01月14日 22:40
  • 178

基于HOOK的Anti-debug调用点trace和Anti-anti

转:http://bbs.pediy.com/showthread.php?p=1365668#post1365668 发一个之前写的辅助调试SO的小东西,限于水平难免会有错误之处,请各...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2015年04月17日 12:16
  • 1180

Android反调试方法总结以及源码实现之检测篇(一)

好久没有更新博客了,主要是忙项目的事,今日总结一下在Android中常遇到的反调试方法,一来帮助需要之人,二来加深自己的理解。 反调试在代码保护中扮演着很重要的角色,虽然不能完全阻止攻击者,但是还是...
  • feibabeibei_beibei
  • feibabeibei_beibei
  • 2017年03月09日 11:37
  • 4447

TracerPid反调试实现与逆向

经常会在一些脱壳文章里面看到TracerPid,ptrace什么的,那这些都是什么意思呢? 我们来查看本程序的/proc/{PID}/status文件 C:\Users\wangz>adb she...
  • tianyeming
  • tianyeming
  • 2017年11月01日 16:51
  • 206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Anti-Debug 小试牛刀
举报原因:
原因补充:

(最多只允许输入30个字)