iOS逆向工程
什么是iOS逆向工程?
iOS应用逆向工程,是指从目标应用的界面及功能表现入手,使用不同的工具和理论知识分析其实现原理,得出应用的代码结构、整体设计、功能实现、执行流程等,然后利用iOS的系统知识和语言特性,借鉴或修改原有实现流程的技术。
iOS逆向工程能做什么?
- 借鉴别人的设计和实现,实现自己的功能;
- 分析恶意软件,一些杀毒软件公司用来分析恶意软件,发出预警避免用户中招;
- 破解使用权限;
- 安全审计,从逆向的角度实现安全保护。
iOS逆向分析方法有哪些?
网络分析
借助Charles等抓包工具,分析目标App的所有网络请求。对其进行逆向数据分析,学习优秀的API设计规范,根据抓包分析的数据格式,通过脚本语言或其他方式伪造网路请求修改数据。
苹果官方文档提供了NSURLProtocol,可以对HTTP请求进行拦截(只能拦截NSURLConnection、NSURLSession、UIWebView的请求,不能拦截WKWebView)。
静态分析
在不执行iOS应用的前提下,对应用进行程序分析的一种方法,一般会配合分析工具进行分析。
静态分析分为以下三种:
- 文件系统结构的分析
- 本地文件的静态分析
- 二进制文件反汇编的静态分析
动态分析
在iOS应用运行过程中,进行动态分析的一种方法。动态获取程序在运行时的参数传递、执行流程及寄存器内存等信息。
动态分析常用的几种方式:
- 借用UI分析工具Reveal,查看目标App的布局,或在手机上安装FLEX来查看层级结构
- 使用Cycript动态调试App,查找目标方法
- LLDB + debugserver 动态调试
iOS逆向开发流程
- 砸壳解密应用程序,class-dump二进制文件导出头文件;
- 界面入手,查看当前界面布局及控制器;
- 发现相关类,使用静态分析、动态调试分析关键函数的实现逻辑
- hook相关类中的目标函数,模拟或篡改函数逻辑;
- 制作插件,并安装到设备查看效果。
什么是越狱?
越狱是指通过分析iOS系统的代码,找出iOS系统的漏洞,绕过系统的安全权限检查,最终获取系统root权限的过程。未越狱,则所有的操作只能局限于沙盒(Sandbox),越狱后可以获取root权限、访问设备的整个文件系统。
因越狱程度不同,分三种:
- 引导式越狱
- 不完美越狱(iOS系统9.3(含)以上)
- 完美越狱(iOS系统9.3以下)
文件结构
越狱后手机的文件结构.jpg
主要文件介绍:
Applications: 存放系统App和来自Cydia的App,不含AppStore下载的App;
Developer: 供开发者使用;
Library: 系统资源,用户设置;
/Library/LaunchDaemons 是启动daemon程序;
/Library/MobileSubstrate,存放了所有基于Cydia Substrate的插件;
System: 系统的重要组成部分
/System/Library/Carrier Bundles 存放运营商的一些配置
/System/Library/Frameworks、/System/Library/PrivateFrameworks 是系统中公开的和未公开的framework
/System/Library/CoreServices/SpringBoard.app 是桌面管理器,用户和系统直接交互的部分
/System/Library/PerferenceBundles 是系统设置中的一些设置项
Cydia Substrate
Cydia Substrate 是一个框架,允许第三方开发者在越狱系统的方法里打一些运行时补丁和扩展一些方法,是开发越狱插件的基石。
主要包括三个模块:MobileHooker、MobileLoader、Safe mode
MobileHooker
用来替换系统函数,即为Hook。提供了以下两个函数:
@param class : 要Hook的Objective-C函数的类名
@param selector : 要Hook的Objective-C函数的message
@param replacement : hook后新的对应该message的执行逻辑,即替换后的函数地址
@param result : 对应该message的原函数的地址,若无需调用原函数则该参数可以设为NULL
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
@param function : 要Hook的函数地址,值得注意的是该地址不一定限于函数头,也可以是函数内部的任一代码地址
@param replacement : Hook后要替换的函数地址
@param p_original : 指向Hook地址的指针,用来保存被Hook函数替换掉的汇编指令,方便执行完自己的代码逻辑后能够继续执行原函数的逻辑,若不需要调用原函数,则此处可以设为NULL
void MSHookFunction(void* function, void* replacement, void** p_original);
MSHookMessageEx
MSHookMessageEx官方注解
用来hook Objective-C 函数,其原理是调用Objective-C中高级的运行时函数API:class_getInstanceMethod、method_setImplementation、method_exchangeImplementations等来替换原函数的逻辑
void method_exchangeImplementations(Method m1, Method m2);
用于交换两个函数的实现,内部逻辑:
IMP imp1 = method_getImplementation(m1);
IMP imp2 = method_getImplementation(m2);
method_setImplementation(m1, imp2);
method_setImplementation(m2, imp1);
MSHookFunction
MSHookFunction官方注解
作用于C/C++函数,C/C++不提供runtime这种高级API来直接替换方法,因此实现Hook更困难。其原理:通过汇编指令完成的,在进程执行到function时转而执行replacement,同时保存function的指令及其返回地址,使得用户可以选择性地执行function,并保证进程能够在执行完replacement后继续正常运行。
15445141384739.jpg
15445141486369.jpg
进程先执行一些指令,当执行到Function A,Hook 了 函数 A ,要用 函数 B 替换。
在原本应该执行函数 A 的地方跳转到函数 B 的位置继续执行 函数B 。
同时函数 A 的代码被 MobileHooker保存下来,在执行函数 B 的过程中,可以选择是否执行函数 A ,以及何时执行函数 A 。
在 函数 B 执行完成后,会继续执行剩下的指令。
MobileLoader
作用:让应用程序加载第三方dylib
原理:系统启动时,launchd进程将 MobileLoader 加载到内存;
MobileLoader 利用 DYLD_INSERT_LIBRARIES 环境变量将自己加载进设备的各个进程;
遍历/Library/MobileSubstrate/DynamicLibraries/目录下的文件,根据和每个dylib同名的plist文件确定该dylib的作用范围;
若当前进程满足进程范围,则会使用dlopen函数动态加载对应的dylib。
SafeMode
注入别的进程并改变其原有逻辑存在一定风险,难免会造成程序崩溃现象。如果崩溃的是SpringBoard等系统进程,则会造成系统崩溃。为了避免这类情况,SafeMode会捕获SIGABRT、SIGILL、SIGBUS、SIGSEGV、SIGSYS这几种信号。捕获到目标信号的SafeMode会进入安全模式,在安全模式下所有的dylib都会被禁用,便于修复系统。
开发工具简介—Theos
Theos创建的工程包括以下几个文件:
Makefile:指定工程中用到的文件、框架、库等信息
Tweak.xm:编写hook代码的文件,支持Logos和C/C++语法
.plist:用于指定需要注入的目标文件的BundleID
control:指定deb包的一些信息,包括文字、描述、版本号
Logos语法 (三个最基本,最常用的指令)
%hook: 指定需要hook的class,必须以%end结尾
%log:在%hook内部使用,将函数的类名、参数等信息写入syslog
%orig:在%hook内部使用,执行被hook函数的原代码。如果不使用%orig,则原函数的代码不会执行;也可使用%orig(arg),替换原函数中的参数
其他指令: %new,%group,%c等







网友评论