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


作者 轩夏


目录
相关文章
|
5月前
|
iOS开发 开发者
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
297 3
|
8月前
|
移动开发 网络协议 Linux
We discovered one or more bugs in your app when reviewed on iPhone and iPad running iOS 14.1
We discovered one or more bugs in your app when reviewed on iPhone and iPad running iOS 14.1
76 0
|
iOS开发
ios fixed定位问题
ios fixed定位问题
137 0
|
Shell
(Mac)remotedebug-ios-webkit-adapter 无法运行,出现以下错误:ios_webkit_debug_proxy找不到。请安装 ios_webkit_debug_proxy (https://github.com/google/ios-webkit-debug-proxy) #74
(Mac)remotedebug-ios-webkit-adapter 无法运行,出现以下错误:ios_webkit_debug_proxy找不到。请安装 ios_webkit_debug_proxy (https://github.com/google/ios-webkit-debug-proxy) #74
655 0
|
Shell iOS开发
iOS逆向:tweak开发教程(iPhone/tool)
iOS逆向:tweak开发教程(iPhone/tool)
1266 0
iOS逆向:tweak开发教程(iPhone/tool)
|
iOS开发
iOS UITableViewCellSelectionStyleBlue 不起作用怎么办
iOS UITableViewCellSelectionStyleBlue 不起作用怎么办
135 0
|
iOS开发
Xcode警告消除 ios WKWebView Could not signal service com.apple.WebKit.WebContent
Xcode警告消除 ios WKWebView Could not signal service com.apple.WebKit.WebContent
866 0
iOS你不知道的事--Crash分析
原文作者:Cooci_和谐学习_不急不躁原文地址:https://www.jianshu.com/p/56f96167a6e9 大家平时在开发过程中,经常会遇到Crash,那也是在正常不过的事,但是作为一个优秀的iOS开发人员,必将这些用户不良体验降到最低。
1204 0
|
iOS开发
iOS 开发之 Fucking Block Syntax !
How Do I Declare A Block in Objective-C? As a local variable: returnType (^blockName)(parameterTypes) = ^returnType(parameters) {.
1651 0
|
iOS开发
This iPhone xxx is running iOS xxx, which may not be supported by this version of Xcode.
有时候我们的iPhone紧跟apple的步伐升级最新的版本了,但是Xcode并没有及时更新到最新版本(Xcode是在很大,而且有时候是需要最新的beta版本的),这时候真机调试的时候就会出现下面这样的问题: 报错: Could not locate device support files.
1798 0

热门文章

最新文章