[TOC]
砸壳方法
一般命令行工具放于
/usr/bin
下在其他任何目录下都可以直接可以使用。
静态
clutch:此工具是命令行工具;在iOS11上clutch无法使用;
在微信6.5.3的版本现在用 clutch 是砸不了了,砸壳过程中报错:
It's not possible to dump watchOS 2 apps with Clutch 2.0.4 at this moment.
。
-
在GitHub上下载
clutch
的release包; -
将
clutch
拷贝到手机/usr/bin
目录下; -
将
clutch-2.0.4
重命名为clutch
,不能使用-
等符号; -
给
clutch
赋予执行权限:chmod +x clutch
;+x
是对所有用户都赋予可执行权限,而使用chmod xxx
则是单独对各组用户进行赋予不同的权限; -
列举手机上哪些APP未进行过砸壳处理,不需要砸壳的或已砸壳的不列举:
Clutch -i
; -
对指定的APP进行砸壳:
clutch -d <标号>
或clutch -d <APPID>
; -
完成后将砸壳的应用默认放于
DONE:/private/var/mobile/Documents/Dumped/xxx
字段对应的路径下。/private/var
与/var
是同一个目录; -
即可通过IFunBox将安装拷贝到Mac上或者通过指令;
动态
通过向宏DYLD_INSERT_LIBRARIES里写入动态库和进程的完整路径(因为只有在沙盒内的文件,才会对沙盒中的文件有读写权限),就可以在执行文件加载时将该动态库插入。
iPhone的DYLD存放路径:
/usr/lib/dyld
;动态库的加载运行流程(通过DYLD):加载系统动态库 --> 加载app可执行文件 --> 读取load commands段 --> 加载依赖的动态库。
-
动态库依附进程与动态库注入的区别:
- 英文单词:
依附:insert
,注入:inject
; - 运行内存:依附是在执行过程中对进程进行方法交换;而注入是通过的静态的可执行二进制文件进行修改
load commands
段数据从而将库与原文件进行关联; - 实施手段:依附:
DYLD_INSERT_LIBRARIES(系统)
;注入:yololib binary dylib file
,yololib三方
;
- 英文单词:
-
步骤
- 下来
dumpdecrypted
源码,通过make
指令编译生成动态库; - 将
dumpdecrypted.dylib
拷贝至手机; - 通过指令:
DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib /var/containers/Bundle/Application/41D1BA28-AAA6-47C0-833B-4EE843D08E5F/WeChat.app/WeChat
- 下来
-
注意
- 拷贝APP安装包:
scp -r -P 12345 root@localhost:/var/containers/Bundle/Application/41D1BA28-AAA6-47C0-833B-4EE843D08E5F/ ~/Desktop/
; - 将砸壳后的执行文件拷贝到Mac:
scp -r -P 12345 root@localhost:/var/mobile/Documents/WeChat.decrypted ~/Desktop
; - 打包ipa文件,
zip -ry 微信.ipa WeChat
; - 当遇到
killed 9
时,参考iOS 9.3.3中使用dumpdecrypted砸壳,killed:9;
- 拷贝APP安装包:
Theos
Theos
历史:Theos开始由Dustin L. Howett编写后由于DHowett离开SURikIT由开源社区维护,引文Theos简介。
作用:为iPhone系统写插件,他可以创建Tweak等项目;
官方wiki:wiki;
配置
-
ldid
- 作用:为插件deb包进行签名
- 安装:
$ brew install ldid
;
-
xz、Lzma
安装xz、Lzma压缩工具,避免打包时提示压缩错误。
$ # for macOS: $ brew install xz $ sudo cpan IO::Compress::Lzma
-
安装Theos
- clone的作用在于Theos项目包含有许多隐藏文件中的依赖引用,如果直接down下来不能进行正确配置,另外还需要使用
--recursive
字段。 - 环境变量,建议配置在opt文件中方便管理。
- 安装:
$ git clone --recursive https://github.com/theos/theos.git $THEOS
;
- clone的作用在于Theos项目包含有许多隐藏文件中的依赖引用,如果直接down下来不能进行正确配置,另外还需要使用
应用
使用Theos创建Tweak插件,进行微信登录密码的窃取;
-
安装Theos后使用其bin目录下的nic.py工具进行工程创建;
-
创建工程时配置内容
- Project Name:工程名,驼峰;
- Package Name:包名,全部小写,反DNS;
- Author/Maintainer Name [xxx]:xxx为默认选项;
- [iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:依附的目标进程
com.tencent.xin
; - List of...[SpringBoard]:直接回车;
-
工程文件架构分析
- control:包含创建项目时配置的各种字段;
- Makefile:编译配置,需要配置SSH连接的
THEOS_DEVICE_IP
和THEOS_DEVICE_PORT
字段,匹配映射的脚本中的配置,此2个字段将用于make install
时使用; - Tweak.xm:编写logos代码;
- xxxxx.plist:包含依附进程的APPID;
-
锁定微信密码输入框
- 通过cycript连接微信进程:
cycript -p WeChat
,进入cycript环境; - 导入常用指令
cmds.cy
文件; - 通过
JYCurrentVC()
得到CurrentVC(WCAccountLoginLastUserViewController)
,将之前用class-dump导出的WeChatHeaders在sublime中打开,找到关键m_passwordView
成员变量; - 通过对subviews打印hidden等调试步骤得到
#0x13f439c00->m_passwordView.subviews()[0].subviews()[0].subviews()[0]
即为密码输入框,#0x13f439c00->m_passwordLoginBtn
为登录按钮;
- 通过cycript连接微信进程:
-
锁定按钮点击的事件响应
- 通过按钮的
allTargets()
方法得到所有响应者; - 通过按钮的
.allControlEvents()
得到按钮的响应事件; - 通过
actionsForTarget:forControlEvent:
得到目标响应事件"onNext"
- 通过按钮的
-
编写logos
- 在Tweak.x中对
WCAccountLoginLastUserViewController -onNext
方法进行hook; - 取出对象的
m_passwordView
成员变量并通过view.subviews[0].subviews[0].subviews[0];
找到最终的UITextField
,打印即可;
- 在Tweak.x中对
-
安装到手机
- 编译
make
,可以检查logos语法的错误信息; - 打包
make package
,对中间产物进行打包,使用lzma压缩,每执行一次就会重新生成一个deb包; - 安装
make install
,通过SSH进行安装,在Cydia
中可以看到安装成功的插件; - 成功安装到手机后,使用微信登录即可获取到微信明文密码;
- 编译
-
插件中进行网络请求验证<u>18.06.14插入</u>
- 在上文的
onNext
方法使用NSURLConnection
与NSURLSession
均可进行网络访问; - 如在方法内使用get方式进行天气查询
@"http://www.weather.com.cn/adat/sk/101270101.html"
可以成功获取到返回数据; - 即验证了可以在插件中进行网络请求;
- 在上文的
常见可能遇到的坑
-
打包时报压缩方式错误
(IO::Compress::Lzma)
的解决2种方式:-
安装xz、lzma
-
修改
dm.pl
、deb.m
文件-
dm.pl:注释路径
/opt/theos/vendor/dm.pl/dm.pl
文件中第12、13行指定的压缩方式12 #use IO::Compress::Lzma; 13 #use IO::Compress::Xz;
-
deb.mk:修改路径
/opt/theos/makefiles/package/deb.mk
中的6 _THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= lzma
为
6 _THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
-
-
-
编译:
-
工程名:可以驼峰原则;
-
包命名:需要对所有字母都使用小写字母;
-
工程路径:不能在中文目录中,否则打包不成功;
-
清空缓存:使用
make clean
,如果清理缓存不成功则直接删除项目工程中的文件;
题外
砸壳工具史
关于砸壳工具史引用AloneMonkey
在IOSRE上的一段关于一条命令完成砸壳的话:
背景
最早的砸壳工具是stefanesser写的dumpdecrypted 16,通过手动注入然后启动应用程序在内存进行dump解密后的内存实现砸壳,这种砸壳只能砸主App可执行文件。
对于应用程序里面存在framework的情况可以使用conradev的dumpdecrypted 15,通过_dyld_register_func_for_add_image注册回调对每个模块进行dump解密。
但是这种还是需要拷贝dumpdecrypted.dylib,然后找路径什么的,还是挺麻烦的。所以笔者干脆放到MonkeyDev 58模板变成一个tweak的形式dumpdecrypted 7,这样填写目标bundle id然后看日志把文件拷贝出来就可以了。
但是还是很麻烦,需要拷贝文件自己还原ipa,然后有了KJCracks的Clutch 12通过posix_spawnp创建进程然后dump直接生成ipa包在设备,可以说是很方便了。这个是工具在使用的时候大部分应用会出报错,此外生成的包还需要自己拷贝。
一键dump
人都是想偷懒的,于是便有了本文将要介绍的frida-ios-dump 96,该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件,通过以下方式配置完成之后真的就是一条命令砸壳。
对工具史的总结:stefanesser
版dumpdecrypted
--> conradev
的dumpdecrypted
--> KJCracks
的Clutch
--> AloneMonkey
的 frida-ios-dump
。
DYLD花絮
- 文章1:通过DYLD_INSERT_LIBRARIES实现基于动态库的hook功能这篇文章中的重点:
- 支持动态库插入(Interposing)功能,是苹果加载器dyld在传统加载器的一个不同的地方。通过向宏DYLD_INSERT_LIBRARIES里写入动态库完整路径。就可以在执行文件加载时将该动态库插入。
- 其实Cydia的Substrate框架也是基于DYLD_INSERT_LIBRARIES来实现的。
-
iOS逆向入门实践 — 逆向微信,伪装定位(一)文章中的重点:
- 说当前版本的 clutch 不支持 dump watchOS2 的 APP;
-
DYLD_INSERT_LIBRARIES
是 Mac 中的环境变量(Linux 上对应的是 LD_PRELOAD)。在这个宏中写入动态库完整路径,就可以在执行文件加载时将该动态库插入。
-
iOS逆向-砸壳工具dumpdecrypted文中重点:
-
查找安装目录,在终端输入
ps -e
,查找微信的bundle id
,使用Cycript
连接进程,成功后,在进程内部调用APPPATCH
指令找到微信的Documents
路径; - 此时可能会出现kill 9,如果出现这个问题,可以使用“su mobile”命令切换用户权限,然后继续上面的命令,这样既可砸壳成功,最终在Document目录下得到砸壳后的WeChat.decrypted文件。
-
查找安装目录,在终端输入
网友评论