iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted
之前介绍了怎么操作越狱的iOS设备(以下简称为手机),但简单操作手机并不是目标,小程的目标是手机上特定的APP,比如微信、淘宝、QQ音乐等等,因为小程可以从这些APP上拿到一些有用的信息或资源--比如,“微信的那个页面是用什么控件来布局的?”、“QQ音乐的歌手头像,能批量地拿到吗?”,等等。
很明显,如果你知道目标APP的所有类的声明,你就可能直接观察到,或者推导到一些有用的信息。实际上,把目标APP的类信息拿到,是至关重要的一步,因为这一步的成功让你有了分析的资料,进而决定了后续的动作,比如借鉴目标APP的实现方案,或者进一步做注入的工作。
为了感性一点,小程先贴上一个APP的部分类的结构信息,然后来简单看看,可以分析到什么。
这是“花椒直播”APP的视频编码类:
花椒直播的某个类
现在的直播主要是看美女,不过这不是重点。重点是,直播是要开播的,开播就要录像,然后要把视频编码,再推到服务器。而这个类,就是“视频编码”的关键类(通过注入就能证实)。可以直接看到,它是用AVAssetWriter来实现视频编码的,也就是我们经常说的“硬件编码”,而不是用libx264之类的第三方库来做视频编码。还可以看到,在编码初始化时,指定了分辨率与码率,如果有必要,我们能查出是什么值。
这是“花椒直播”APP的崩溃汇报类(疑似):
花椒崩溃汇报类
可以看到,APP的ID跟版本可能是上报的信息,那又怎么样呢?如果我们想恶作剧,是可以做到不断的崩溃再启动再崩溃的,然后修改这两个信息的内容,是可以不断地跟分析数据的技术人员打招呼的。通过给某个产品制造异常,然后给分析异常的人发送某个明文信息,是很可能做到的。
以上这个例子,是在得到类的结构信息后,做出的一些“感性”的分析。
那么,怎么样才能得到类的结构信息呢?
本文介绍如何获取目标APP的类的结构信息。
其实,还是工具的使用。一个叫classdump,另一个叫dumpdecrypted。
一般情况下,使用classdump就可以解决问题。
小程用的是mac电脑。
(一)class-dump
class-dump或class-dump-z,都可以分析出类结构,使用上相似。
(1)获取
class-dump-z:
wget http://networkpx.googlecode.com/files/class-dump-z_0.2a.tar.gz
解压后,拷贝到bin目录:
sudo cp mac_x86/class-dump-z /usr/local/bin
class-dump:
http://stevenygard.com/projects/class-dump 查找并下载,或者直接:
下载 http://stevenygard.com/download/class-dump-3.5.tar.gz
把class-dump拷贝到/usr/local/bin目录,并chmod +x class-dump。
(2)使用
class-dump-z Payload/QQ.app/QQ > ../../dumpinfo --所有信息放到一个文件
class-dump -H Spotify.app -o ../headers --这种方式可以分出不同的文件
class-dump -A -a Spotify.app > ../../addressinfo --带有地址信息
根据函数的地址,可以用gdb或lldb来下断点调试。
class-dump也可以指定指令集,比如--arch arm64。
对于小程来说,一般这样使用class-dump: class-dump -A -a --arch arm64 target.app > ../dumpinfo
这样可以把所有的类信息放到dumpinfo文件,而且每个方法跟变量都是有地址的(方便之后可能进行的动态调试)。
但需要注意一个问题,classdump只能对没有加密的APP进行分析,如果APP是加密了的,那classdump是无能为力的(直接提示加密了!)。
哪些APP是加密状态的呢?有没有办法破解呢?
基本上,只有从AppStore下载的APP才是加密了的,其它通过PP助手、爱思等工具拿到的ipa安装包(实际是压缩包,里面有target.app),都是经过了破解。
小程觉得,不用管那么多,先用classdump来跑一下,如果提示加密,再来考虑破解。
破解的工具是clutch。
应该使用clutch的最新版本,特别是对于ios10.x的系统。
可以在https://github.com/KJCracks/Clutch/releases下载(下载-debug版本即可)。
把clutch拷贝到手机的/usr/bin目录,给权限:chmod +x clutch
这样使用clutch:
./Clutch -? --查看选项
./clutch -i --查看可以破解的软件
./clutch -d x --根据序号来破解某个APP
破解完,clutch会提示破解后的ipa包所在的目录。把ipa拷贝到电脑,就可以classdump了。
另一个分析类结构的工具是dumpdecrypted。
之所以引入dumpdecrypted,主要是因为小程发现:使用最新的clutch2.0.4-debug,未能破解微信6.5.12版本(也不能成功破解7.0版本)。甚至于,微信6.5.x版本,运行后,ps aux都找不到进程信息。
那怎么办呢?
最简单的办法,其实是,使用手机上的pp助手、爱思之类的工具,安装一个微信,这个微信就已经砸壳的了;或者,在电脑上通过上网或助手工具,下载一个微信ipa,一般也是解密了的。
如果非要用dumpdecrypted来弄一下,也是可以。小程把办法贴在下面,大家可以在需要时再阅读。
生成dumpdecrypted.dylib:
git clone https://github.com/stefanesser/dumpdecrypted
cd dumpdecrypted
make --生成dumpdecrypted.dylib
在手机cydia上搜索Filza,并安装。利用Filza找出微信的安装路径。(不能使用cycript,因为进程id都找不到。)
比如,微信安装目录:/var/mobile/Containers/Bundle/Application/4777DEE2-6805-45F7-B3D0-CB4277DD5389/WeChat.app
拷贝dumpdecrypted.dylib到手机:
scp dumpdecrypted.dylib root@xx.xx.xx.xx:/
启动微信(重要!),ssh到手机,cd到dumpdecrypted.dylib所在的目录,执行:
ldid -S dumpdecrypted.dylib
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/4777DEE2-6805-45F7-B3D0-CB4277DD5389/WeChat.app/WeChat
在当前目录生成WeChat.decrypted文件,即为破解后的文件。
scp WeChat.decrypted到pc,先观察一下这个文件:
file WeChat.decrypted --可以看到包括两个指令集:armv7跟arm64
otool -l WeChat.decrypted | grep crypt
WeChat.decrypted (architecture armv7):
cryptoff 16384
cryptsize 55377920
cryptid 1
WeChat.decrypted (architecture arm64):
cryptoff 16384
cryptsize 59883520
cryptid 0
可以看到,armv7是加密了的,而arm64是解密了的,所以在使用class-dump与hopper时,都应该选择arm64。
提取头文件:
class-dump -A -a --arch arm64 WeChat.decrypted > dumpinfo
dumpinfo里面为所有头文件信息,比如:MicroMessengerAppDelegate为AppDelegate类。
(二)效果演示
为了再“感性”一下,小程再贴一下“微信”的类结构,作为后续更多分析的热身。
微信在每次进入“附近的人”时,都会把手机的位置信息传递给这个类的方法:
设置位置信息的类与方法
从这里可以看出,只要注入到红框内的那个函数,把传递进来的位置更换成目标位置(比如定到大平洋),就可以看到你想要的“附近的人”。比如,定位到纽约,可以看到这样的人:
纽约某个县的附近的人
要实现这个效果,拿到类结构信息只是第一步,接下来还要定位目标类(甚至要调试),再写hook代码。
所谓“万达高楼平地起”,小程觉得,如果想往一个方向研究,那就应该有耐心,一步一步掌握好知识与技能。
总结一下,本文主要介绍了class-dump工具的使用,其它内容都是次要的。
这是有价值的吗?