主要学习资料:《iOS应用逆向工程(第二版)》
-
class-dump
下载地址:http://stevenygard.com/projects/class-dump
下载class-dump-3.5.dmg后,将dmg文件里面的class- dump复制到“/usr/bin” ,然后再Terminal 中执行“sudo chmod 777/usr/bin/class-dump”赋予其执行权限。然后问题来了。
复制的时候 提示我没有权限,于是想chmod一下,悲剧的是还是不行。网上查了一下发现原来是Rootless 搞得鬼。OS X 10.11 加入了Rootless,默认创建的用户还是属于admin用户组 也能切换到root用户,但是加以了限制.使得某些操作只有苹果的应用可以 被许可(通过代码签名来判断).所以第三方应用即使是运行在root权限中, 有一些操作也无法完成。
关闭Rootless 的方法就是 重启电脑,听到嘟一声后(赶紧哦)按住cmd+r进入安全模式(这里还有一个坑,用的是mac mini 美式键盘,试了好几次没成功。之后进键盘设置 -> 更改键盘类型,重新识别了一次键盘,搞定。)
找到实用工具,也就是命令窗口 ternimal,输入
csrutil disable 关闭
csrutil enable 打开
csrutil status 查看状态
最后重启即可class-dump的对象是 framework的库文件 或者 app的可执行文件。这里我:
MAC:~ LJ$ cd /Users/renjinkui/Desktop/classDump-Test/LJTrack.app MAC:LJTrack.app LJ$ class-dump -S -s -H LJTrack -o /Users/renjinkui/Desktop/classDump-Test/
-S 是将方法排序,-s 是将类名,分类名排序,
-H 则是生成头文件,-o 后面接生成头文件的位置,没有则头文件放到当前目录。
好了class-dump 基本就搞定了。
class-dump --arch armv7s Victim.decrypted
指定哪个架构 需要被解析
-
Theos
https://github.com/theos/theos 下载地址
直接下载theos,放到/opt/theos 文件夹下
终端安装法:
MAC:~ LJ$ export THEOS=/opt/theos MAC:~ LJ$ sudo git clone git://github.com/DHowett/theos.git $THEOS
改变theos 文件夹的所属关系:
sudo chown $(id -u):$(id -g) /opt/theos
设置环境变量:
设置 ~/.bash_profile 文件 在文件最后面加上: export PATH=/opt/theos/bin/:$PATH
配置ldid (下载地址:http://joedj.net/ldid)
github 源码地址:https://github.com/rpetrich/ldid
原理文章: http://www.saurik.com/id/8
把它放到 /opt/theos/bin/下
sudo chmod 777 /opt/theos/bin/ldid 赋予权限配置CydiaSubstrate,
运行自动化脚本: sudo /opt/theos/bin/bootstrap.sh substrate(最新版的 theos 里面已经没有这个脚本了,可以跳过执行脚本这一步)
巨坑啊!!!
接下来要做的就是从 iOS 上已经安装的 Cydia Substrate 上复制 cydiaSubstrate 文件到 theos 上
(首先在Cydia中搜索安装:CydiaSubstrate)
文件位于 iOS 上的
“/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate”,
将其拷贝到 OSX 上,然后重命名为 libsubstrate.dylib 后
放到 “/opt/theos/libsubstrate.dylib” 中配置dpkg-deb:
deb 是越狱开发安装包的标准格式,而 dpkg-deb 是操作 deb 文件的工具,
有了这个工具,Theos 才能将工程正确地打包成 deb 包
从 https://raw.githubusercontent.com/DHowett/dm.pl/master/dm.pl下载dm.pl,将其重命名为 dpkg-deb 后,
放到 “/opt/theos/bin/“ 目录下,然后设置它的可执行权限sudo chmod 777 /opt/theos/bin/dpkg-deb
(发现 最新的theos 里面已经有dm.pl 文件了...)为了保持一致,也copy一个出来,改个名字,再放进去。
另外一种 安装dpkg:
https://www.macports.org/install.php 下载OSX 对应版本的pkg安装包
安装完成后, 运行: sudo port selfupdate
确保MacPorts 升级到最新版 再运行: sudo port install dpkg(有点慢哦)配置Theos NIC templates:(Theos 工程模板)
下载地址: <https://github.com/DHowett/theos-nic- templates/archive/master.zip>
发现 最近的Theos 里面已经包含了其中的四种了,只有一个sbsettingstoggle.nic.tar 没有,直接copy 进去。使用Theos 创建工程
MAC:Code-Test LJ$ nic.pl =========>启动NIC
NIC 2.0 - New Instance Creator
[1.] iphone/activator_event
[2.] iphone/application_modern
[3.] iphone/cydget
[4.] iphone/flipswitch_switch
[5.] iphone/framework
[6.] iphone/ios7_notification_center_widget
[7.] iphone/library
[8.] iphone/notification_center_widget
[9.] iphone/preference_bundle_modern
[10.] iphone/sbsettingstoggle
[11.] iphone/tool
[12.] iphone/tweak
[13.] iphone/xpc_service
Choose a Template (required): 12 =========>选择一个模板来创建,tweak模板
Project Name (required): iOSRE =========>工程名字
Package Name [com.yourcompany.iosre]: com.iosre.iosreproject ===>deb包名
Author/Maintainer Name [LiJie]: lijie =========> tweak作者名字
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.apple.springboard =========>tweak作用对象的bundle identifier
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: SpringBoard =========>tweak 安装后需要重启的应用,进程名
Instantiating iphone/tweak in iosre/...
Done.
生成的工程iosre,里面包含四个文件:
1. Makefile: 指定工程用到的文件,框架,库等
(Application,Tweak, Tool 三种类型的程序 分别对应的.mk文件:
application.mk, tweak.mk, tool.mk)
如果提示找不到文件common.mk,则include改成:include /opt/theos/makefiles/common.mk
2. Tweak.xm: 默认生成的原文件
(%hook, %log, %orig 三个基本的预处理命令)
%hook: 指定需要hook的class, 以%end结尾
%orig: 执行被hook的函数
%orig(x,x): 执行被hook的函数的,同时修改函数的参数
%log : 在%hook里面使用,将函数类名,参数,等信息写入syslog
%group 将%hook分组,以%end结尾, 一个group可以包含多个hook
%init group必须配合init使用,用于初始化group,再hook 或者 ctor内调用
%ctor: (构造函数,后没有显式调用)系统会自动生成ctor,并在其中调用init
%new : hook内部使用,给class添加函数(类似class_addMethod),%end结尾
%c : 动态获取一个类的定义(objc_getClass, NSClassFromString)
详细资料: <http://iphonedevwiki.net/index.php/Logos>
3. control: 记录了deb包管理系统所需要的基本信息,会被打包到deb包里
4. iOSRE.plist: 记录了一些配置信息
(Filter有不同的array时,需要添加 Mode:(String)Any 键值对)
生成好工程之后,就是编译 -> 打包 -> 安装了。
1. 编译命令: make
(这个时候,项目就会多出一个obj文件夹,里面有一个.dylib文件,就是tweak的核心部分)
2. 编译 + 打包命令: mark package (也就是想make 再 dpkg-deb)
这个时候就会生成一个 .deb的文件,就是最终的发布安装包。
3. 编译 + 打包 + 安装: make package install
图像安装: 通过iFunBox 吧deb拖到iOS ,然后用iFile安装。最后再重启。
或者: SSH命令,iOS 必须安装OpenSSH。首先,在MakeFile文件最后 加上"THEOS_DEVICE_IP = 本机IP",告诉Theos 测试设备的IP地址。然后命令行输入:"make package install" 命令来完成编译,打包,安装。
不需要多次输入密码的方法:
1. 找到上面路径 里面的known_hosts文件里面的 iOS的 IP那一行。(完整删掉哦)
2. 生成 authorized_keys
先: ssh-keygen -t rsa
再: cp /Users/****/.ssh/id_rsa.pub ~/authorized_keys
3. 配置iOS:
以root身份登录iOS中,输入:"ssh-keygen", 生成"/var/root/.ssh"目录;
然后exit 退出登录,
再输入: "scp ~/authorized_keys root@192.168.1.**:/var/root/.ssh"。即可
4. 清理:
make clean, 清除工程命令(删除了,Theos编译 打包留下的文件 obj,_,)
-
Reveal
Reveal是可以查看我们自己的appUI布局。但是也是可以看其他App的哦。
-
安装Reveal Loader:
在Cydia 中,搜索并安装Reveal Loader。下载时会自动,下载一个libReveal.dylib的文件(最新版本 只剩下一个RevealServer.framework 文件了)。下载完,在iOS上/Library/ 目录下有没有 RHReavealLoader文件夹,没有就手动新建一个,并把libReveal.dylib(RevealServer.framework)文件(在,"Show Reveal Library in Finder")拷贝进去。
配置Reveal Loader, 直接进设置 -> Reveal->Enabled Applications 打开需要查看的App。
在未越狱机上的使用:(真机可以通过USB 或者 局域网联调)
在文件:/Users/renjinkui/.lldbinit 里面加上:
command alias reveal_load_sim expr (void*)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework/RevealServer", 0x2);
command alias reveal_load_dev expr (void*)dlopen([(NSString*)[(NSBundle*)[NSBundle mainBundle] pathForResource:@"RevealServer.framework/RevealServer" ofType:@""] cStringUsingEncoding:0x4], 0x2);
command alias reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
command alias reveal_stop expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStop" object:nil];
这四个语句分别代表了:
在模拟器,和在真机上加载Reveal动态库。(最新版,已经可以自动加载动态库 和 开始Reveal了。)
开始Reveal 和 结束Reveal。
command alias 第一个跟别名,后面跟命令。
dlopen 是打开动态库,在framework里面则要定位到"***.framework/***"。
dlsym 是获取函数地址
dlclose 关闭
RevealServer.framework 拷贝到工程里面的时候,会有崩溃提示说,(not found image)找不到图片的,就要在这里 加上RevealServer.framework。
IDA 的界面通过 空格进行切换(Graph 或者 Text):
满足条件的分支: 绿色线、
不满足条件的: 红色线、
没有分支的: 蓝色线。
-
iFunBox
越狱的iPhone ,需要先安装 App File Conduit2.
iFunBox 才能浏览全系统的文件。
-
dyld_decache
下载地址: https://cloud.github.com/downloads/kennytm/Miscellaneous/dyld_decache%5Bv0.1c%5D.bz2
iOS 3.1 后,库文件的位置:
/System/Library/Caches/com.apple.dyld/dyld_shared_
dyld_shared_cache_armv7、
dyld_shared_cache_armv7s或
dyld_shared_cache_arm64
dyld_decache 用于提取库里面的二进制文件。
赋予权限:
chmod +x /path/to/dyld_decache\[v0.1c\]
提取二进制文件:
/path/to/dyld_decache\ [v0.1c\] -o /where/to/store/decached/binaries/ /path/to/dyld_shared_cache_armx
提取的二进制文件,都放在了/where/to/store/decached/binaries/里面