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),调试器检测技术

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

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

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

x64 antidebug 不触发PG 补充代码

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

反调试(Anti-debug)

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

Anti-Attach 防止调试器附加

今天逛了下52pojie,看到有哥们发了一段代码,摘自《加密解密3》 看了下代码,只知道是HOOK ntdll.dll的ZwContinue函数,具体不知道为啥HOOK这个函数能发现调试器,这个时候...

分析学习【1】—— Anti-debug分析及Snapshot学习

学着分析一个老样本的时候,发现了这个段anti-debug函数,鉴于WinSDK掌握不足,所以就慢慢分析了下。 概述:1、简单分析了这个anti-debug的流程;2、介绍下用到的Win函数,其中重...
  • BetaBin
  • BetaBin
  • 2012年04月19日 16:49
  • 2018

Windows Anti-Debug Reference

This paper classifies and presents several anti-debugging techniques used on Windows NT-based operat...

Windows_Anti-Debug_Reference

  • 2015年08月19日 14:11
  • 138KB
  • 下载

trace_anti_debug.zip

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

【玩转cocos2d-x之十二】plist解析工具:Anti_TexturePacker

之前拿了一些别人的图片素材,是用TexturePacker打包合成的,结果写程序的时候不知道每个合成前小png图的名字是什么,只能一个一个从plist文件中找,然后猜测对应的名字,再进行显示,如果不对...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Anti-Debug 小试牛刀
举报原因:
原因补充:

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