iOS底子开发知识速览 - 理解你要逆向的目的
正如上一篇文章结尾所预报的,在完成情况搭建后,我们需要相识iOS开发的底子知识。这不是要求你成为一名iOS开发者,而是为了让你在逆向分析过程中能够理解应用的代码结构和运行逻辑。正所谓"知己知彼,百战不殆",只有相识iOS应用是如何构建的,我们才气更有效地进行逆向工程。
本文将为零底子的读者提供iOS开发的核心概念速览,帮助你快速掌握进行逆向工程所需的底子知识。
为什么逆向工程师需要相识iOS开发?
在开始学习具体内容前,让我们先理解为什么需要学习这些iOS开发知识:
- 识别关键代码:相识常见的框架和API,可以快速定位应用中的关键功能
- 理解应用结构:掌握iOS应用的组织方式,有助于找到突破口
- 解读反编译代码:反编译后的代码通常包含大量iOS特有的类和方法调用
- 修改应用活动:只有理解代码逻辑,才气精确修改应用的活动
- 规避保护机制:相识开发者常用的保护技术,才气有效绕过
Objective-C与Swift底子
iOS应用重要利用两种编程语言:Objective-C和Swift。作为逆向工程师,我们需要能够阅读和理解这两种语言的代码。
1. Objective-C底子
Objective-C是iOS开发的传统语言,具有独特的语法风格。即使现在许多应用利用Swift开发,相识Objective-C仍旧非常重要,由于:
- 大量iOS体系框架是用Objective-C编写的
- 许多第三方库和旧应用仍在利用Objective-C
- 反编译工具对Objective-C的支持通常比Swift更好
1.1 Objective-C核心语法
类的界说:
- // 头文件 (.h)
- @interface MyClass : NSObject
- @property (nonatomic, strong) NSString *name;
- @property (nonatomic, assign) int age;
- - (void)sayHello;
- - (NSString *)getGreetingForName:(NSString *)name withAge:(int)age;
- @end
- // 实现文件 (.m)
- @implementation MyClass
- - (void)sayHello {
- NSLog(@"Hello, I'm %@", self.name);
- }
- **绕过方法**:
- - Hook sysctl和ptrace函数
- - 修改返回的进程信息
- - 使用反调试保护绕过插件
- ### 3. 代码混淆与加密
- 开发者可能会使用代码混淆和加密技术保护核心代码:
- **常见技术**:
- - 字符串加密
- - 控制流扁平化
- - 函数名混淆
- - 自定义加密算法
- **逆向对策**:
- - 动态分析:在运行时观察解密后的数据
- - 使用Frida Hook关键函数
- - 编写脚本自动解密字符串
- - 利用模式识别还原控制流
- ### 4. SSL Pinning
- SSL Pinning用于防止中间人攻击,但也会阻碍网络流量分析:
- **常见实现**:
- ```objective-c
- // 使用NSURLSession进行证书验证
- - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
- if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
- NSString *host = challenge.protectionSpace.host;
- SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
-
- // 加载本地证书
- NSString *certPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];
- NSData *certData = [NSData dataWithContentsOfFile:certPath];
- CFDataRef certDataRef = (__bridge CFDataRef)certData;
- SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef);
-
- // 设置证书验证策略
- SecPolicyRef policy = SecPolicyCreateSSL(true, (__bridge CFStringRef)host);
- SecTrustSetPolicies(serverTrust, policy);
- CFRelease(policy);
-
- // 添加锚点证书
- SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)@[(__bridge id)cert]);
- SecTrustSetAnchorCertificatesOnly(serverTrust, true);
- CFRelease(cert);
-
- // 执行验证
- SecTrustResultType result;
- SecTrustEvaluate(serverTrust, &result);
-
- if (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed) {
- NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
- completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
- } else {
- completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, nil);
- }
- } else {
- completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
- }
- }
复制代码 绕过方法:
- 利用SSL Kill Switch 2插件
- Hook SecTrustEvaluate函数
- 修改NSURLSession的didReceiveChallenge:completionHandler:方法
- 利用Frida脚本动态绕过验证
实用小本领:快速识别应用关键功能
在逆向分析iOS应用时,以下本领可以帮助你快速定位应用的关键功能:
1. 通过字符串查找功能
应用中的字符勾通常是找到关键功能的好线索:
利用strings命令:
- strings AppBinary | grep -i "password\|login\|token\|secure"
复制代码 利用class-dump和grep组合:
- class-dump -H AppBinary | grep -A 10 -B 10 "login"
复制代码 2. 关注网络活动
网络哀求每每包含应用的核心功能:
利用网络监控工具:
- Charles Proxy捕获HTTP/HTTPS流量
- Wireshark分析原始网络数据包
重点关注:
3. 观察文件体系活动
应用读写的文件可以提供重要信息:
利用Frida监控文件利用:
- Interceptor.attach(ObjC.classes.NSFileManager["- writeData:toFile:options:error:"].implementation, {
- onEnter: function(args) {
- var data = new ObjC.Object(args[2]);
- var path = new ObjC.Object(args[3]).toString();
- console.log("[+] 写入文件: " + path);
- console.log(" 数据: " + data);
- }
- });
复制代码 4. 追踪用户界面交互
用户界面交互通常会触发关键功能:
利用界面探测器:
- Reveal检察UI层次
- 利用cycript遍历视图层次
分析视图控制器:
视图控制器通常包含业务逻辑,分析它们可以快速相识应勤奋能。
实战演练:分析一个简朴应用
让我们通过一个简朴的实战演练,综合运用本文介绍的知识,分析一个假设的iOS应用:
场景形貌
假设有一个名为"SecureNotes"的应用,它具有以下功能:
- 用户注册和登录
- 创建加密条记
- 通过Touch ID/Face ID保护内容
- 同步数据到云端
分析步骤
1. 提取应用根本信息:
- # 解密应用
- python3 dump.py "SecureNotes"
- # 提取头文件
- class-dump -H SecureNotes.decrypted -o SecureNotes_headers
复制代码 2. 查找关键类:
通太过析头文件,可能发现如下关键类:
- SNLoginViewController:处理登录逻辑
- SNNoteManager:条记管理
- SNEncryptionService:加密相干功能
- SNCloudSyncManager:云同步功能
3. 动态分析登录流程:
利用Frida监控登录哀求:
- // 监控登录方法
- Interceptor.attach(ObjC.classes.SNLoginViewController["- loginWithUsername:password:completion:"].implementation, {
- onEnter: function(args) {
- var username = new ObjC.Object(args[2]).toString();
- var password = new ObjC.Object(args[3]).toString();
- console.log("[+] 登录尝试:");
- console.log(" 用户名: " + username);
- console.log(" 密码: " + password);
- }
- });
- // 监控网络请求
- Interceptor.attach(ObjC.classes.NSURLSession["- dataTaskWithRequest:completionHandler:"].implementation, {
- onEnter: function(args) {
- var request = new ObjC.Object(args[2]);
- if (request.URL().absoluteString().toString().includes("login")) {
- console.log("[+] 登录请求:");
- console.log(" URL: " + request.URL().absoluteString());
- var body = request.HTTPBody();
- if (body) {
- console.log(" Body: " + new ObjC.Object(body).toString());
- }
- }
- }
- });
复制代码 4. 分析条记加密机制:
查找加密相干代码,并实验Hook关键方法:
- // 监控加密方法
- Interceptor.attach(ObjC.classes.SNEncryptionService["- encryptData:withKey:error:"].implementation, {
- onEnter: function(args) {
- this.data = new ObjC.Object(args[2]);
- this.key = new ObjC.Object(args[3]);
- console.log("[+] 加密数据:");
- console.log(" 原始数据: " + this.data.toString());
- console.log(" 密钥: " + this.key.toString());
- },
- onLeave: function(retval) {
- var encryptedData = new ObjC.Object(retval);
- console.log(" 加密结果: " + encryptedData);
- }
- });
复制代码 5. 绕过生物认证:
定位并Hook Touch ID/Face ID验证代码:
- // 绕过生物认证
- Interceptor.attach(ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"].implementation, {
- onEnter: function(args) {
- var reason = new ObjC.Object(args[3]);
- console.log("[+] 请求生物认证: " + reason);
-
- // 获取原始回调块
- var originalBlock = new ObjC.Block(args[4]);
-
- // 替换为我们的回调
- var replacementBlock = function(success, error) {
- console.log(" 拦截生物认证回调,强制成功");
- originalBlock(true, null);
- };
-
- args[4] = replacementBlock;
- }
- });
复制代码 6. 分析数据存储:
查抄应用的数据存储方式:
- # 查找SQLite数据库
- find /var/mobile/Containers/Data/Application/*/SecureNotes -name "*.sqlite"
- # 查看UserDefaults内容
- plutil -p /var/mobile/Containers/Data/Application/*/SecureNotes/Library/Preferences/com.example.securenotes.plist
复制代码 7. 监控云同步:
观察应用的网络同步活动:
- // 监控同步请求
- Interceptor.attach(ObjC.classes.SNCloudSyncManager["- syncNotes:"].implementation, {
- onEnter: function(args) {
- var notes = new ObjC.Object(args[2]);
- console.log("[+] 开始同步笔记:");
- console.log(" 笔记数量: " + notes.count());
- for (var i = 0; i < notes.count(); i++) {
- var note = notes.objectAtIndex_(i);
- console.log(" 笔记 " + i + ": " + note.title());
- }
- }
- });
复制代码 通过上述分析,我们可以相识应用的核心功能和实现方式,为后续的功能修改和数据提取奠定底子。
总结与下一步
在本文中,我们具体介绍了iOS应用开发的底子知识,包括:
- Objective-C和Swift的底子语法和特点
- iOS应用生命周期和页面生命周期
- UI架构和常用组件
- 常用体系框架和API
- 常见应勤奋能的实现方式
- 保护机制和对策
- 实用本领和实战分析方法
这些知识为我们后续的逆向工程工作提供了必要的理论底子。记着,逆向工程就像破解谜题,相识开发者如何构建应用,才气更有效地分析和修改它。
在下一篇文章中,我们将正式开始介绍Mach-O文件格式,这是iOS应用的二进制格式,深入理解它对于静态分析至关重要。我们将具体讲解Mach-O的文件结构、Header分析、Load Commands解析以及Segments与Sections的详情,这将是我们迈入静态分析阶段的第一步。
如果你对本文内容有任何疑问,或者想相识特定iOS开发概念的更多细节,接待在评论区留言交流!
作者:自学不成才
本文为iOS逆向工程专栏的第5篇文章,版权所有,未经允许请勿转载。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |