iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted

简介: iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted之前介绍了怎么操作越狱的iOS设备(以下简称为手机),但简单操作手机并不是目标,小程的目标是手机上特定的APP,比如微信、淘宝、QQ音乐等等,因为小程可以从这些APP上拿到一些有用的信息或资源--比如,“微信的那个页面是用什么控件来布局的?”、“QQ音乐的歌手头像,能批量地拿到吗?”,等等。

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工具的使用,其它内容都是次要的。

这是有价值的吗?
原文地址https://www.cnblogs.com/freeself/p/10640998.html

相关文章
|
25天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
81 3
|
27天前
|
Android开发 开发者 UED
个人开发 App 成功上架手机应用市场的关键步骤
个人开发 App 成功上架手机应用市场的关键步骤
|
27天前
|
iOS开发 开发者
一键制作 iOS 上架 App Store 描述文件教程
一键制作 iOS 上架 App Store 描述文件教程
|
27天前
|
开发工具 数据安全/隐私保护 Android开发
【教程】APP 开发后如何上架?
【教程】APP 开发后如何上架?
|
25天前
|
Android开发 iOS开发 开发者
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
78 0
|
25天前
|
Java Android开发 开发者
【Uniapp开发】APP的真机调试指南,从开发到上架全过程
【Uniapp开发】APP的真机调试指南,从开发到上架全过程
34 3
|
25天前
|
开发者 iOS开发
iOS App上架新规解析:如何进行App备案
iOS App上架新规解析:如何进行App备案
83 0
游戏直播APP平台开发多少钱成本:定制与成品源码差距这么大
开发一款游戏直播APP平台所需的费用是多少?对于计划投身这一领域的投资者来说,首要关心的问题之一就是。本文将探讨两种主要的开发模式——定制开发与成品源码二次开发的成本差异及其优劣势。
|
27天前
|
iOS开发 开发者
【教程】uni-app iOS 打包解决 profile 文件与私钥证书不匹配问题
【教程】uni-app iOS 打包解决 profile 文件与私钥证书不匹配问题
|
30天前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
正如优秀的软件设计一样,uni-app把一些移动端常用的功能做成了独立的服务或者插件,我们在使用的时候只需要选择使用即可。但是在使用这些服务或者插件时一定要区分其提供的各种服务和插件的使用场景,例如其提供的【uni-starter快速开发项目模版】几乎集成了移动端所需的所有基础功能,使用非常方便,但是其许可协议只允许对接其uniCloud的JS开发服务端,不允许对接自己的php、java等其他后台系统。
136 2