iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标
iOS安全和逆向系列教程 第5篇 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 PinningSSL 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分析原始网络数据包
重点关注:
- 认证请求
- API端点
- 敏感数据传输
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篇文章,版权所有,未经许可请勿转载。
相关文章:
iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标
iOS安全和逆向系列教程 第5篇 iOS基础开发知识速览 - 理解你要逆向的目标 正如上一篇文章结尾所预告的,在完成环境搭建后,我们需要了解iOS开发的基础知识。这不是要求你成为一名iOS开发者,而是为了让你在逆向分析过程中能够理解应用的代码结…...
计算机常用单词
文章目录 计算机单词1-100101-200201-300301-400401-500501-600601-700701-800801-900901-10001001-11001101-12001201-13001301-14001401-15001501-16001601-1695 计算机单词 参考 1-100 1. file [英faɪl 美faɪl] n. 文件;v. 保存文件 2. command [英kəˈmɑ…...
TS的接口 泛型 自定义类型 在接口中定义一个非必须的属性
TS的接口 泛型 自定义类型 接口 新建一个ts文件,在里面定义一个接口 export interface PersonInter{id:string,name:string,age:number }在vue文件中引入这个ts文件 <script lang"ts" setup name"Person">import {type PersonInter} …...
76.读取计时器运行时间 C#例子 WPF例子
TimerManager:一个增强的定时器类,带时间管理功能 在使用定时器时,我们常常需要知道定时器的运行状态,比如它已经运行了多久,或者还剩下多少时间。然而,.NET 的 System.Timers.Timer 类本身并没有直接提供…...
React封装通用Table组件,支持搜索(多条件)、筛选、自动序号、数据量统计等功能。未采用二次封装调整灵活,包含使用文档
封装通用组件 一、封装思想二、react代码三、css代码四、实现效果五、使用文档 BasicTableModal 表格模态框组件1.组件简介2.功能特点3.使用方法基础用法宽度控制示例带筛选功能搜索功能示例自定义单元格渲染 4.API 说明PropsColumn 配置项Filter 配置项 5.注意事项 一、封装思…...
【JavaEE】-- 多线程(初阶)4
文章目录 8.多线程案例8.1 单例模式8.1.1 饿汉模式8.1.2 懒汉模式 8.2 阻塞队列8.2.1 什么是阻塞队列8.2.2 生产者消费者模型8.2.3 标准库中的阻塞队列8.2.4 阻塞队列的应用场景8.2.4.1 消息队列 8.2.5 异步操作8.2.5 自定义实现阻塞队列8.2.6 阻塞队列--生产者消费者模型 8.3 …...
WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示
wordpress插件介绍 “WP高级摘要插件”功能丰富,它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度,灵活调整展示字数;设定摘要最后的显示字符, 如常用的省略号等以提示内容未完整展示;指定允许在摘要中显示…...
论文阅读 EEG-Inception
EEG-Inception: A Novel Deep Convolutional Neural Network for Assistive ERP-Based Brain-Computer Interfaces EEG-Inception是第一个集成Inception模块进行ERP检测的模型,它有效地结合了轻型架构中的其他结构,提高了我们方法的性能。 本研究的主要目…...
FFmpeg入门:最简单的音频播放器
FFmpeg入门:最简单的音频播放器 欢迎大家来到FFmpeg入门的第二章,今天只做一个最简单的FFmpeg音频播放器;同样,话不多说,先上流程图 流程图 以上流程和视频播放器的解码过程基本上是一致的; 不同点在于 S…...
物联网感应层数据采集器实现协议转换 数据格式化
数据采集器的核心功能实现涉及多个技术层面的协同工作,以下是各模块的详细实现解析: 协议转换实现 协议解析引擎:采用插件式架构,例如: P r o t o c o l P a r...
基于Linux系统的物联网智能终端
背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...
8.1.STM32_OLED
4.STM32_OLED 跟着江协科大的视频,无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样,存在很多兼容性问题 归根结底就是驱动的问题! 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮,示例见文末 请针对自…...
Netty笔记9:粘包半包
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8…...
【算法方法总结·三】滑动窗口的一些技巧和注意事项
【算法方法总结三】滑动窗口的一些技巧和注意事项 【算法方法总结一】二分法的一些技巧和注意事项【算法方法总结二】双指针的一些技巧和注意事项【算法方法总结三】滑动窗口的一些技巧和注意事项 【滑动窗口】 数组的和 随着 右边指针 移动一定是 非递减 的,就是 …...
LabVIEW虚拟弗兰克赫兹实验仪
随着信息技术的飞速发展,虚拟仿真技术已经成为教学和研究中不可或缺的工具。开发了一种基于LabVIEW平台开发的虚拟弗兰克赫兹实验仪,该系统不仅能模拟实验操作,还能实时绘制数据图形,极大地丰富了物理实验的教学内容和方式。 …...
spring boot + vue 搭建环境
参考文档:https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建环境 一、浏览器二、jd…...
清华团队提出HistoCell,从组织学图像推断超分辨率细胞空间分布助力癌症研究|顶刊精析·25-03-02
小罗碎碎念 今天和大家分享一篇2025-02-21发表于nature communications的文章,内容涉及病理空转单细胞。 从组织学图像推断细胞空间分布对癌症研究意义重大,但现有方法存在标注工作量大、分辨率或特征挖掘不足等局限。研究旨在开发一种高效准确的方法。 …...
分布式锁—2.Redisson的可重入锁一
大纲 1.Redisson可重入锁RedissonLock概述 2.可重入锁源码之创建RedissonClient实例 3.可重入锁源码之lua脚本加锁逻辑 4.可重入锁源码之WatchDog维持加锁逻辑 5.可重入锁源码之可重入加锁逻辑 6.可重入锁源码之锁的互斥阻塞逻辑 7.可重入锁源码之释放锁逻辑 8.可重入锁…...
html+js 轮播图
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图示例</title><style>/* 基本样式…...
vue3:初学 vue-router 路由配置
承上一篇:nodejs:express js-mdict 作为后端,vue 3 vite 作为前端,在线查询英汉词典 安装 cnpm install vue-router -S 现在讲一讲 vue3:vue-router 路由配置 cd \js\mydict-web\src mkdir router cd router 我还…...
23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解
程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式࿰…...
Python 爬取唐诗宋词三百首
你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例,它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…...
C语言408考研先行课第一课:数据类型
由于408要考数据结构……会有算法题…… 所以,需要C语言来进行一个预备…… 因为大一贪玩,C语言根本没学进去……谁能想到考研还用得到呢?【手动doge(bushi) 软件用的是Clion,可以自行搜索教程下载使用。…...
03 HarmonyOS Next仪表盘案例详解(二):进阶篇
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...
探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)
文章目录 2.3 Polar 编解码2.3.1 Polar 码简介与发展背景2.3.2 信道极化理论基础对称容量与巴氏参数对称容量 I ( W ) I(W) I(W)巴氏参数 Z ( W ) Z(W) Z(W)常见信道信道联合信道分裂信道极化 本博客为系列博客,主要讲解各基带算法的原理与应用,包括&…...
基础篇(一)强化学习是什么?从零开始理解智能体的学习过程
强化学习是什么?从零开始理解智能体的学习过程 你是否曾好奇过,人工智能是如何在复杂的环境中学会做出决策的?无论是打游戏的AI,还是自动驾驶的汽车,还是最近很火的DeepSeek它们的背后都离不开一种强大的技术——强化…...
如何直接导出某个conda环境中的包, 然后直接用 pip install -r requirements.txt 在新环境中安装
1. 导出 Conda 环境配置 conda list --export > conda_requirements.txt这将生成一个 conda_requirements.txt 文件,其中包含当前环境中所有包的列表及其版本信息。 2. 转换为 requirements.txt 文件 grep -v "^#" conda_requirements.txt | cut -d …...
基于 HTML、CSS 和 JavaScript 的智能九宫格图片分割系统
目录 1 前言 2 技术实现 2.1 HTML 结构 2.2 CSS 样式 2.3 JavaScript 交互 3 代码解析 3.1 HTML 部分 3.2 CSS 部分 3.3 JavaScript 部分 4 完整代码 5 运行结果 6 总结 6.1 系统特点 6.2 使用方法 1 前言 在当今数字化的时代,图片处理需求日益增长。…...
委托者模式(掌握设计模式的核心之一)
目录 问题: 举例: 总结:核心就是利用Java中的多态来完成注入。 问题: 今天刷面经,刷到装饰者模式,又进阶的发现委托者模式,发现还是不理解,特此记录。 举例: 老板…...
MySQL-高级查询
查询处理 排序(默认不是按主键排序的) order by 字段1[,字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段,那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数࿰…...
