iOS逆向系列6_iOS工具集

待整理

1、简介

前几篇文章介绍了iOS逆向工程的OSX工具,为了完成iOS逆向工程,还需要在iOS上安装、配置一系列工具,将两个平台联动起来。以下的操作均在iPhone 5,iOS 8.1中完成。

相关链接: Cydia Substrate http://www.cydiasubstrate.com/

2、CydiaSubstrate

CydiaSubstrate是绝大部分tweak正常工作的基础,它由MobileHooker、MobileLoader和Safe mode组成

2.1 MobileHooker

MobileHooker的作用是替换系统函数,也就是所谓的hook,它主要包含以下两个函数:

	void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
	void MSHookFunction(void* function, void* replacement, void** p_original);

MSHookMessageEx 作用于Objective-C函数,通过调用method_setImplementation函数将[class selector]的实现改为replacement,达到hook的目的。举个简单的例子,向一个NSString对象发送hasSuffix:消息(即调用[NSString hasSuffix:]),正常情况下它的实现是判断NSString对象有没有某个后缀;如果把这个实现替换成hasPrefix:的实现,那么NSString对象在收到hasSuffix:消息后,实际进行的操作是“口是心非”地判断这个NSString对象有没有某个前缀(prefix)。

之前提到的Logos语法主要是对此函数作了一层封装,让编写针对OC函数的hook代码变得更简单直观了,但其底层实现仍完全基于MSHookMessageEx。对于OC函数的hook,推荐使用更一目了然的Logos语法。如果对MSHookMessageEx本身的使用感兴趣,可以去看它的官方文档,或者Google搜索“cydiasubstrate fuchsiaexample”。参考:http://www.cydiasubstrate.com/

MSHookFunction MSHookFunction的三个参数的作用分别是:替换的原函数、替换函数,以及被MobileHooker保存的原函数。 它作用于C和C++函数,通过编写汇编指令,在进程执行到function时转而执行replacement,同时保存function的指令及其返回地址,使得用户可以选择性地执行function,并保证进程能够在执行完replacement后继续正常运行。

释义:进程先执行一些指令后,先执行函数A,再接着执行剩下的指令。如果钩住(hook)了函数A(即上面说的function),想用函数B(即replacement)替换它,那么进程的执行流程就变成:进程先执行一些指令,在原本应该执行函数A的地方跳转到函数B的位置执行函数B,同时函数A的代码被MobileHooker保存了下来。在函数B中,可以选择是否执行函数A,以及何时执行函数A,在函数B执行完成后,则会继续执行剩下的指令。

symbol 在计算机中,一个函数的指令被存放在一段内存中,当进程需要执行这个函数时,它必须知道要去内存的哪个地方找到这个函数,然后执行它的指令。也就是说,进程要根据这个函数的名称,找到它在内存中的地址,而这个名称与地址的映射关系,是存储在“symbol table”中的——“symbol table”中的symbol就是这个函数的名称,进程会根据这个symbol找到它在内存中的地址,然后跳转过去执行。

可参阅资料: http://www.cydiasubstrate.com/api/c/MSFindSymbol/

http://msdn.microsoft.com/en-us/library/windows/hardware/ff553493(v=vs.85).aspx

http://en.wikibooks.org/wiki/Reverse_Engineering/Mac_OS_X#Symbols_Types

2.2 MobileLoader

MobileLoader的作用是加载第三方dylib。在iOS启动时,会由launchd将MobileLoader载入内存,然后MobileLoader会根据dylib的同名plist文件指定的作用范围,有选择地在不同进程里通过dlopen函数打开目录/Library/MobileSubstrate/DynamicLibraries/下的所有dylib。这个plist文件的格式已在Theos部分详细讲解,此处不再赘述。对于大多数初级iOS逆向工程师来说,MobileLoader的工作过程是完全透明的,此处仅作简单了解即可。

2.3 Safe mode

应用的质量良莠不齐,程序崩溃在所难免。因为tweak的本质是dylib,寄生在别的进程里,一旦出错,可能会导致整个进程崩溃,而一旦崩溃的是SpringBoard等系统进程,则会造成iOS瘫痪,所以CydiaSubstrate引入了Safe mode,它会捕获SIGTRAP、SIGABRT、SIGILL、SIGBUS、SIGSEGV、SIGSYS这6种信号,然后进入安全模式。

在安全模式里,所有基于CydiaSubstrate的第三方dylib均会被禁用,便于查错与修复。但是,并不是拥有了Safe mode就能高枕无忧,在很多时候,设备还是会因为第三方dylib的原因而无法进入系统,症状主要有:开机时卡在白苹果上,或者进度圈不停地转。在出现这种情况时,可以同时按住home和lock键硬重启,然后按住音量“+”键来完全禁用CydiaSubstrate,待系统重启完毕后,再来查错与修复。当问题被成功修复后,再重启一次iOS,就能重新启用CydiaSubstrate了,非常方便。

3、Cycript

Cycript是由saurik推出的一款脚本语言,可以看作是Objective-JavaScript。

Cycript具备脚本语言的便利,可以直接用来写App,而且在Cycript中可以测试函数,明显节省时间。这是一门语法简单而功能强大的语言。

更多详细资料可参阅它的官网http://www.cycript.org

4、LLDB与debugserver

1.1 LLDB

如果说IDA是倚天剑,那么LLDB就是屠龙刀,两者在iOS逆向工程中的地位不相上下,难分伯仲。LLDB全称为“Low Level Debugger”,是由苹果出品,内置于Xcode中的动态调试工具,不但通吃C、C++、Objective-C,还全盘支持OSX、iOS,以及iOS模拟器。LLDB的功能可以概括为以下四点:

  • 在指定的条件下启动程序;
  • 在指定的条件下停止程序;
  • 在程序停止的时候检查程序内部发生的事;
  • 在程序停止的时候对程序进行改动,观察程序的执行过程有什么变化。

LLDB没有图形界面,使用时看着Terminal中黑压压的一片文字,初学者很容易被吓跑,但是一旦掌握其基本用法,配合IDA双管齐下,就能解决很多难倒大片初学者的问题,投资回报极高。LLDB是运行在OSX中的,要想调试iOS,还需要另一个工具的配合,它就是debugserver。

1.2 debugserver

debugserver运行在iOS上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。在默认情况下,iOS上并没有安装debugserver。需要配置debugserver+LLDB,动态调试别人的App,发挥它们在逆向工程中的真正威力。

1.3 LLDB的使用

常用的LLDB命令:

1.image list

“image list”与GDB中的“info shared”类似,用于列举当前进程中的所有模块(image)。因为ASLR(Address Space Layout Randomization,详见http://theiphonewiki.com/wiki/ASLR)的关系,每次进程启动时,同一进程的所有模块在虚拟内存中的起始地址都会产生随机偏移。所以要使用“image list-o-f”命令操作。

2.breakpoint

“breakpoint”与GDB中的“break”类似,用于设置断点。

因为逆向工程中的调试涉及的多是汇编代码,所以大多数情况下都是在某一条汇编指令上下断点,在函数上下断点的情况很少。

3.print

LLDB的主要功能之一是“在程序停止的时候检查程序内部发生的事”,而这个功能正是通过“print”命令完成的,它可以打印某处的值。

4.nexti与stepi

“nexti”与“stepi”的作用都是执行下一条机器指令,它们最大的区别是前者不进入函数体,而后者会进入函数体。它们可分别简写为“ni”与“si”,是调试时使用最多的指令之一。

5.register write

“register write”命令用于给指定的寄存器赋值,从而“对程序进行改动,观察程序的执行过程有什么变化”。

LLDB脱胎于GDB,虽然两者的命令有差别,但用法和思路是一脉相承的。要想完整地熟悉LLDB的使用,推荐阅读“Peter’s GDB tutorial”和“RMS’s gdb Debugger Tutorial”(Google一下)。IDA宜静,LLDB宜动,熟练地使用这两个工具是成为逆向高手的必经之路。

1.4 LLDB使用小提示

1.调试的二进制文件必须从iOS中提取

IDA分析的二进制文件必须与LLDB调试的二进制文件相同,这样偏移前基地址、ASLR偏移、偏移后基地址才能对应得上。IDA分析的二进制文件可以通过dyld_decache工具从本机获取;从其他渠道(如SDK、模拟器等)提取的文件一般不能用作动态调试。

2.LLDB中的简化输入

在使用LLDB时,如果想重复执行上一条指令,直接按回车键就可以了;如果想查看以前执行过的指令,按方向键的向上和向下键就可以了。 LLDB的命令都很简单,但怎么用简单的命令去解决复杂的问题,却不简单。

5、dumpdecrypted

前面在介绍class-dump时提到过,从AppStore下载的App(以下简称StoreApp)是被苹果加密过的(从其他渠道下载的一般没有加密),可执行文件被套上了一层保护壳,而class-dump无法作用于加密过的App。在这种情况下,想要获取头文件,需要先解密App的可执行文件,俗称“砸壳”。dumpdecrypted就是由越狱社区的知名人士Stefan Esser(@i0n1c)出品的一款砸壳工具,被越狱社区广泛运用在iOS逆向工程研究中。

6、 OpenSSH

OpenSSH会在iOS上安装SSH服务 ,以给外界提供一个通过ssh接入iOS的途径。

这里用得最多的一般只有2个命令:ssh和scp,前者用于远程登录,后者用于远程拷贝文件。 两种命令的用法都比较简单直观。在安装OpenSSH后需要注意修改默认登录密码”alpine”。iOS上的用户有2个,分别是root和mobile。主义需要修改密码。如果没有修改默认密码,Ikee等病毒就有可能通过ssh以root用户身份登录iOS,拿到最高权限。这个后果是非常严重的:iOS中的所有数据,包括短信、电话本、AppleID的账号密码等敏感信息泄露的风险将大大增加,你的设备可能会被入侵者玩弄于股掌之间,为所欲为。因此,在安装OpenSSH之后一定要记得修改默认密码!

7、usbmuxd

很多朋友是通过WiFi连接使用SSH服务的,因为无线网络的不稳定性及传输速度的限制,在复制文件或用LLDB远程调试时,iOS的响应很慢,效率不高。iOS越狱社区的知名人士Nikias Bassen(@pimskeks)开发了一款可以把本地OSX/Windows端口转发到远程iOS端口的工具usbmuxd,使我们能够通过USB连接线ssh到iOS中,大大增加了ssh连接的速度,也方便了那些没有WiFi的朋友。

8、iFile

iFile是iOS上一款非常强大的文件管理App,可以看作是iOS版的Finder。它能进行各种文件操作,从最简单的浏览,到编辑、剪贴、复制,还可以安装deb文件,十分方便。

9、MTerminal

MTerminal是开源的iOS版Terminal,基本功能一应俱全。其用法与Terminal区别不大,只是屏幕和键盘小了点。笔者认为MTerminal最实用的场景是在没有电脑的环境下利用碎片时间,结合Cycript进行代码测试。

10、syslogd to/var/log/syslog

syslogd是iOS中记录系统日志的守护进程,“syslogd to/var/log/syslog”的作用是把日志给写入“/var/log/syslog”文件中

支持一下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码支持一下

打开支付宝扫一扫,即可进行扫码打赏哦