iOS Anti-Debug

简介: iOS Anti-Debug 1 iOS Anti-Debug前言       移动平台攻防对抗技术的发展基本是沿着PC端发展轨迹在前进,从windows平台上的加壳到Android平台的APK加固,相信ipa的加固也已经不远了;windows平台下从ring3层到ring0层的反调试技术已经非常成熟,Android平台下的反调试技术已经出现了





1 iOS Anti-Debug前言

      移动平台攻防对抗技术的发展基本是沿着PC端发展轨迹在前进,从windows平台上的加壳到Android平台的APK加固,相信ipa的加固也已经不远了;windows平台下从ring3层到ring0层的反调试技术已经非常成熟,Android平台下的反调试技术已经出现了好几套不错的方案,今天来简单聊聊iOS下的反调试技术。

2 PT_DENY_ATTACH

      谈到debug,首先会想到的一个系统调用是ptrace,它主要用于实现断点调试和系统调用跟踪。从man ptrace的结果发现一个有趣的参数——PT_DENY_ATTACH:

iOS Anti-Debug-iOS反调试-阿里聚安全


图 1 man ptrace
      PT_DENY_ATTACH是苹果增加的一个ptrace选项,用以防止gdb等调试器依附到某进程。用法如下:
      ptrace(PT_DENY_ATTACH, 0, 0, 0);
      直接上demo:

iOS Anti-Debug-PT_DENY_ATTACH-阿里聚安全 
图 2 ptrace not found
      那么问题就来了,编译报错:'sys/ptrace.h' file not found。iPhone真实环境下,根本就没有抛出sys/ptrace.h。但是幸运的是,我们依然可以使用dlopen和dlsym拿到ptrace。从man dlopen和man dlsym可以发现,当dlopen的path参数传入NULL时,dlopen将返回一个相当于RTLD_DEFAULT的handle;当dlsym接收到一个RTLD_DEFAULT的handle参数时,dlsym将根据载入的顺序搜索除以dlopen(xxx, RTLD_LOCAL)方式载入的所有mach-o文件。

iOS Anti-Debug-Anti-Debug-阿里聚安全 
图 3 man dlopen
iOS Anti-Debug-ipa加固-阿里聚安全 
图 4 man dlsym
      根据以上的信息,反调试方法基本可以完成了,demo主要代码如下:
iOS Anti-Debug-iOS反调试-阿里聚安全 
图 5 Anti debug Demo
      尝试gdb依附会得到一个Segmentation fault错误:
iOS Anti-Debug-PT_DENY_ATTACH-阿里聚安全 
图 6 运行demo
  iOS Anti-Debug-Anti-Debug-阿里聚安全
图 7 gdb依附
      针对这种ptrace的反反调试方法其实很简单,通过修改ptrace的参数或者内存补丁就可以搞定,具体不在此详述。
      另外,在某亿级用户的APP里面发现了相同的反调试方法,伪代码如下:
iOS Anti-Debug-ipa加固-阿里聚安全 

图 8 某APP反调试伪代码
      注意,在dlfcn.h中有如下定义:
      #define RTLD_GLOBAL 0x8
      #define RTLD_NOW 0x2

3 sysctl

      思路是通过sysctl查看信息进程里的标记,判断自己是否正在被调试。sysctl是用以查询内核状态的接口,并允许具备相应权限的进程设置内核状态。其定义如下:
      int sysctl(int *name, u_int namelen, void *old, size_t *oldlen, void *newp, size_t newlen);
      name参数是一个用以指定查询的信息数组;
namelen用以指定name数组的元素个数;
      old是用以函数返回的缓冲区;
      oldlen用以指定oldp缓冲区长度;
      newp和newlen在设置时使用;
      当进程被调试器依附时,kinfo_proc结构下有一个kp_proc结构域,kp_proc的p_flag的被调试标识将被设置,即会进行类似如下的设置:
      kinfo_proc. kp_proc. p_flag & P_TRACED
      其中P_TRACED的定义如下:
      #define P_TRACED        0x00000800  /* Debugged process being traced */
      我们可以通过sysctl查询进程相应的kinfo_proc信息,查询函数的实现可以这样:

iOS Anti-Debug-iOS反调试-阿里聚安全 
图 9 found debugger
      name参数的4个元素表示通过本进程pid查询本进程信息。在主函数中检索is_debugged的返回值,返回为真时,即进程正在被调试,退出进程。测试结果如下:
iOS Anti-Debug-PT_DENY_ATTACH-阿里聚安全 
图 10 gdb依附demo
iOS Anti-Debug-Anti-Debug-阿里聚安全 
图 11 demo发现debugger并退出
      针对sysctl的反反调试的思路其实很简单,只需要在函数返回时清除p_flag标识位即可,根据sysctl.h文件中的定义:
      #define CTL_KERN 1
      #define KERN_PROC 14
      #define KERN_PROC_PID 1
      以及sysctl的第二个参数为4,对sysctl下条件断点,在sysctl返回后,根据反编译二进制文件找到kproc的首地址,接下来找到p_flag相对kproc首地址的偏移,最后修改对应内存地址的值就OK了。

4 iOS Anti-Debug小节

      iOS平台下的Anti-Debug方法相对于Linux下的要少很多,例如fork一个子进程,ptrace父进程进行检测方式不再奏效。而且,要完全防止程序被调试或者被逆向,理论上来说是不可能的。


作者 轩夏


目录
相关文章
|
API Python
邮件发送API使用方法?代码应该怎么编辑
邮件发送API简化了编程式邮件发送,如SendGrid、Mailgun、Amazon SES是常见提供商。获取API密钥后,以Python和SendGrid为例,发送邮件涉及设置API密钥、创建客户端、定义邮件内容及发送。运行代码得到发送响应,确保邮件成功发送。AokSend提供高触达、触发式SMTP/API发信服务。集成API能快速高效地在应用中实现邮件功能。
|
存储 DataWorks Unix
Dataworks数据集成之“文本数据”
Dataworks不是支持文本数据导入么?为什么Excel数据不能导入?CSV文件不就是Excel文件么?关于这些问题,我整理了一篇文章进行解释。
1292 2
|
Web App开发 安全 iOS开发
TrollStore巨魔商店永久安装APP 可实现IOS应用双开 安装任意APP
TrollStore 是一个永久签名的监禁应用程序,可以永久安装您在其中打开的任何 IPA。
14161 0
|
数据安全/隐私保护 iOS开发 开发者
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(上)
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)
987 0
|
运维 监控 jenkins
Jenkins有哪些优势和劣势
【10月更文挑战第18天】Jenkins有哪些优势和劣势
492 2
|
安全 Java 数据安全/隐私保护
java JDWP调试接口任意命令执行漏洞
java JDWP调试接口任意命令执行漏洞
853 1
|
机器学习/深度学习 人工智能 数据可视化
【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!
本文是一位自称对网球规则和比赛数据非常熟悉的计算机博士对2024美国大学生数学建模竞赛C题"网球运动中的势头"的全面解析,包括问题分析、数学模型构建、代码实现,以及完整论文的逐步更新过程。
335 1
【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!
|
Java 测试技术
Java反射之Method的invoke方法详解
Java反射之Method的invoke方法详解
|
Web App开发 Java 数据库
Java三大器之监听器(Listener)的工作原理和代码演示
    现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
5026 0
|
Web App开发 网络协议 算法