iOS Anti-Debug

iOS Anti-Debug

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:

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

 

图 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文件。

 

图 3 man dlopen
 

图 4 man dlsym
      根据以上的信息,反调试方法基本可以完成了,demo主要代码如下:
 

图 5 Anti debug Demo
      尝试gdb依附会得到一个Segmentation fault错误:
 

图 6 运行demo
 

图 7 gdb依附
      针对这种ptrace的反反调试方法其实很简单,通过修改ptrace的参数或者内存补丁就可以搞定,具体不在此详述。
      另外,在某亿级用户的APP里面发现了相同的反调试方法,伪代码如下:
 

图 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信息,查询函数的实现可以这样:

 

图 9 found debugger
      name参数的4个元素表示通过本进程pid查询本进程信息。在主函数中检索is_debugged的返回值,返回为真时,即进程正在被调试,退出进程。测试结果如下:
 

图 10 gdb依附demo
 

图 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父进程进行检测方式不再奏效。而且,要完全防止程序被调试或者被逆向,理论上来说是不可能的。

作者 轩夏

时间: 2024-10-01 10:41:25

iOS Anti-Debug的相关文章

iOS开发debug集锦

1.添加第三方库时,需要注意使用环境 duplicate symbol _llvm.embedded.module in: /Users/dengw/360Cloud/xcode_code/application/OnceNote/Pods/ShareSDK3/libraries/extends/WeChatSDK/libWeChatSDK.a(MTAEvent.o) /Users/dengw/360Cloud/xcode_code/application/OnceNote/Pods/Share

[转贴]利用伪造内核文件来绕过IceSword的检测

[转贴]利用伪造内核文件来绕过IceSword的检测   作者:倪茂志邮件:backspray008@gmail.com完成于:2005.12.20 文章分为八个部分:   一.为什么需要伪造内核  二.伪造内核文件  三.隐藏进程  四.隐藏内核模块  五.隐藏服务  六.隐藏注册表  七.隐藏文件  八.关于端口 另:建议先看看最后那些参考文章. 一.为什么需要伪造内核:   I

未越狱的iPhone如何伪造GPS定位信息

最近Pokemon Go 火的不行,结果人家服务器扛不住了,只接受GPS定位信息在澳洲的客户端的登陆请求.今天自己搞了个小Demo,在未越狱的iPhone上把系统的GPS定位信息给改了. 步骤: 在Xcode8-beta上新建一个空白工程 -> Edit scheme -> Default Location 选澳洲 -> Device选真机设备,Run Paste_Image.png 现在,看看自己手机(我是iOS10系统): 1.微信: Paste_Image.png 2.高德地图:

【短视频SDK】关于iOS提供的SDK中模拟器版本(debug)和release 版本

目前短视频SDK的iOS版本在阿里云官网下载,下载页面有两个选择,一个是纯粹的SDK,一个是独立的示例代码. 我们以iOS专业版SDK为例,我们看到下载完成里面有一个framework就是我们需要的SDK,有一个debug的和一个release的,分别对应可以模拟器编译版本和可以上传到App Store的release版本.目前我们的示例代码就是提供的SDK release版本. Debug版本和release版本有什么区别呢?什么时候选择使用什么样的版本呢? Debug版本:带x86的包可以编

Instruments Tutorial for iOS: How To Debug Memory Leaks【转】

If you're new here, you may want to subscribe to my RSS feed or follow me on Twitter. Thanks for visiting! Call the plumber, it's-a-leaking! Update 4/12/13: These days, you should probably be using Apple's new Automatic Reference Counting (ARC) techn

IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog输出,NSLog输出方式_IOS

IOS中(Xcode) DEBUG模式(RELEASE模式) 在开发IOS程序过程中,经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程.但是一个发布的程序,里面带有太多的NSLog输出,肯定对于App性能有所影响,这时候我们可以使用一个宏定义来处理,在开发的时候使用DEBUG模式,在发布的时候使用RELEASE模式.这样,发布的App就不会在程序内部做大量的NSLog输出了  感谢阅读,希望能帮助到大家,谢谢大

xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别

首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编 - (void)test { UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.0, 20.0f, 30.1, 40)]; [button setTitle:@"test" forState:UIControlStateNormal]; [button setTitleColor:[UI

IOS 环信SDK 怎么关闭后台打印,即关闭debug模式,要上线了应用,急!!!

问题描述 解决方案 [[EaseMob sharedInstance] registerSDKWithAppKey:appkey    apnsCertName:apnsCertNa    otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:NO]}];解决方案二:这回复速度,你真是我亲哥呀

符号化你的iOS崩溃报告

前言 本文翻译自Symbolicating Your iOS Crash Reports.这是一篇对于iOS崩溃报告符号化的比较全面的文章.我对Symbolicatecrash工具做了比较完善的封装,一句话就可以符号化你的崩溃报告,还集成了检查UUID匹配的功能. sh symbolicate.sh Crasher.crash Example/Crasher.app > Crasher_Symbolicated.crash 或者 sh symbolicate.sh Crasher.crash E