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工具的使用,其它内容都是次要的。
iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted的更多相关文章
- qt-qml移动开发之在ios上开发和部署app流程简单介绍
qt5.3已经全面支持移动开发,除了mac,windows,linux.还支持ios,android,wp,meego等移动平台,本教程是作者依据自己的经验,从头讲怎么样在ios上公布自己的app.因 ...
- iOS逆向开发(3):锁定APP的目标类与函数 | reveal | lldb | debugserver | 远程调试
之前介绍了怎么获取APP的所有类的结构信息,这个有什么用呢?用处大了,比如以这一步为基础,下一步通过注入来做更多研究工作. 注入的最小单位是函数,实际上,编译执行的程序在编译后,类就不复存在了,留下来 ...
- iOS逆向开发(1):基础工具 | ssh | scp | socat
小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗? 小程:理解为逆向行驶也没错.一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段. iOS上的逆向开发,是一件有趣的事情 ...
- iOS逆向开发(8):微信自动添加好友
这一次,小程演示怎么让一个APP自动地运行,从而代替手工的操作.同样以"微信"以例,实现在一个微信群里面,对所有的成员,自动地一个一个地发出添加好友的请求. 知识点还是之前介绍的东 ...
- iOS逆向开发(4):注入目标函数 | fishhook | MobileSubstrate | MSHookFunction | iOSOpenDev
从获得APP的所有类声明,到锁定目标类与函数,现在是时候注入函数了. 所谓"注入函数",小程的意思是让APP执行到小程写的代码中,跟"钩子"的概念一致.小程把个 ...
- NX二次开发-UFUN获取一个图层类别的tag UF_LAYER_ask_category_tag
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...
- Android开发之获取APP的应用程序名称以及版本名称信息java工具类
//跟App相关的辅助类 public class AppUtils { private AppUtils() { /* cannot be instantiated */ throw new Uns ...
- iOS逆向开发(6):微信伪造位置
仍然以微信为例,实战地练习一下使用Reveal.iOSOpenDev等工具注入APP的流程,积累经验.这一系列的文章都是学习过程的总结,不带任何商业目的. 本文解决一个问题:如何伪造一个经纬度,在微信 ...
- iOS逆向开发(5):微信强制升级的突破 | 多开 | 微信5.0
接下来的几篇文章,小程以微信为例,实战地演示一下:如何注入iOS的APP.其中使用到的知识,基本在前面的文章中都有介绍到. 小白:小程,我想用回旧版本的微信! 小程:为什么要用旧版本微信呢? 小白:你 ...
随机推荐
- springmvc 简单使用
一.配置(使用)流程 1.新建maven工程,在pom.xml中导入相关包,重要的是springmvc包,servlet包,jstl包 <dependencies> ...
- 别人的Linux私房菜(16)计划任务
计划任务的种类: at,执行一次就结束的命令 crontab,用户任务循环执行的任务的命令.系统任务编辑/etc/crontab来完成. atd让at生效.crond或cron让crontab生 ...
- 实战操作——通过wireshark查看任意qq好友IP
今天有群里好友问我如何查看别人IP,查IP这个东西对于一些刚入门的小白来说可能是一个比较高大上的玩意,但是实际上只需一个网络协议分析工具就OK,废话不多说,下面开始实践 实验对象:任意QQ好友 操作工 ...
- MySQL PROFILE 跟踪语句各阶段性能开销
PROFILE 可以跟踪查询语句各个阶段 Time,IO,CPU,MEMORY 等资源使用情况,比较详细.所以系统一般不会记录太多.启用是全局的,所以每个连接都保持语句的资源使用情况. 查看 PRO ...
- sjms-4 行为型模式
行为型模式 责任链模式 内容:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.角色:抽象处理者(Hand ...
- Exp7 网络欺诈防范
Exp7 网络欺诈防范 20154305 齐帅 一.实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网站 (2)ett ...
- 浅析列表页请求优化(history API)
最近搞了下列表页请求的功能,并做了一下调研整理,记此文备忘. 列表页请求的功能到处可见,比如在博客园. 点击相应的页码,页面返回相应的内容,看上去似乎大同小异,但是一些小的细节还是可以区分优劣. fu ...
- 解决 Files 的值"<<<<<<< HEAD"无效。路径中具有非法字符
通常我们使用版本控制后会出现诸如此类的问题,此时从vs工具找错误和调试是无法找到问题的,也不影响项目的运行,但是有错误就是得解决.原因是版本控制导致文件的路径出现问题. 解决 Files 的值&quo ...
- python 特别的生成器表达式
Ⅰ起因 学习python的同学通常会遇到这样一道经典生成器测试题: def gen(): for i in range(4): yield i base = gen() for n in (2,10) ...
- Redis和memcached缓存技术
缓存的定义:缓存就是在内存中存储的数据备份,当数据没有发生本质变化的时候,我们避免数据的查询操作直接连接数据库,而是去 内容中读取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度 ...