iOS逆向:记录(2021.07.08更)
0.记录 逆向开发过程中,接触到的 Theos、deb打包、shell、iOS root权限、iOS守护进程 相关。
1、使用 thoes 的 make package install 或者 MonkeyDev 在xcode直接编译,是可以直接下载到手机上的。
但有时候要自己安装deb包,可以在终端执行。
1)、移动到根目录
scp /Users/用户名/demo.deb root@同一Wi-Fi下的越狱手机IP:/
如需加端口号,如 USB映射
scp -P 2222 /Users/用户名/demo.deb root@127.0.0.1:/
用越狱app,Filza直接安装。
或者用越狱app,Terminal手机终端执行( 同理,用电脑 ssh root 后,输入指令也是可以 )
dpkg -i /demo.deb
2)、移动到Cydia的自动安装目录(需要重启)
scp /Users/用户/demo.deb root@同一Wi-Fi下越狱手机ip:/var/root/Media/Cydia/AutoInstall/
软件重启
2-1)、获得控制权
ssh root@同一Wi-Fi下的越狱手机ip
2-2)、输入手机设备ssh密码
一般默认 alpine ,可修改,如果使用过 ssh-copy-id 到手机,不用输密码,参照 “iOS逆向:1、THEOS 、Tweak 插件 -- 环境搭建” -> “分支” 、 “7-2”
2-3)、重启
reboot
2、桌面app莫名消失,甚至连私有类“LSApplicationWorkspace”也找不到安装的app,或,安装完自己写的插件、app,没看到图标,取得root手机权限后,刷新UI
su mobile -c uicache
3、ssh -v 可打印信息
ssh -v root@同一Wi-Fi下的越狱手机
4、iPhone 10.3.x,cydia安装了OpenSSL,电脑终端 ssh root@同一Wi-Fi下的越狱手机,卡住、不动、没反应
1、cydia 添加源:http://cydia.ichitaso.com/ 2、下载 dropbear 3、重启 4、10.3.x为不完美越狱,重启后非越狱状态,重新运行越狱App(重启后等待30秒-1分钟,最好。) 5、ssh root@同一Wi-Fi下的越狱手机,应该能连上了
参考自:https://www.jianshu.com/p/91e0c22a6ea7
5、提取从 cydia 源下载的deb包
5-1)、9.0 完美越狱的,可以在该目录下
/var/cache/apt/achieve
5-2)、10 的需要在该目录下
/var/mobile/Library/Caches/com.saurik.Cydia/archives
另附:通过电脑 爱思助手 查看 文件,手机端 cydia 需要先安装 apple file conduit"2"。10 以上不完美越狱的,如重启过,需要重新安装一次。
6、分析别人代码
6-1)、deb解包
dpkg-deb -x /Users/xxx/xxx/xxx.deb /Users/xxx/xxx/xxx/
6-2)、IPA解包
命名.zip,双击
7、遍历最近一分钟内,修改过的文件、文件夹(前提:进入 ssh root )
find / -mmin -1 -name "*"
8、app+插件开发,打包脚本。
一开始,app用 MonkeyDev 开发,后续又改回到 Theos。如 app 用 MonkeyDev 开发,没有Makefile,需要修改ip获取方法。
#!/bin/bash echo "======================= 自动打包下载 开始 =======================" basepath=$(cd `dirname $0`; pwd) cd ${basepath} rm -f ./zzz.deb rm -rf ./Package echo "删除旧文件完成..." mkdir ./Package cp -a ../xxx/xxx/.theos/_/Applications ./Package/Applications cp -a ../xxx/xxx/.theos/_/DEBIAN ./Package/DEBIAN cp -a ../yyy/yyy/Package/Library ./Package/Library echo "复制新文件完成..." find ./Package -name ".DS_Store" -depth -exec rm -f {} \; dpkg-deb -Zgzip -b Package zzz.deb echo "打包完成..." ip="" while read line do strA=$line strB="THEOS_DEVICE_IP" result=$(echo $strA | grep "${strB}") if [[ "$result" != "" ]] then ip=${line#*=} fi done < ../xxx/xxx/Makefile ip=${ip// /} echo "ip 为 ${ip}" scp ./zzz.deb root@${ip}:/ echo "安装中..." ssh root@${ip} dpkg -i /zzz.deb ssh root@${ip} uicache ssh root@${ip} killall -9 SpringBoard echo "======================= 自动打包下载 完成 ======================="
9、ctr + D 退出。
10、dpkg -l 查看安装的软件
dpkg -r name 卸载安装的软件
卸载完,可考虑 uicache 或 killall -9 SpringBoard 。
11、shell 命令(记录一些用到的命令,以后有空去学,再另开一篇)。
1)、读写权限
chmod 777 /xxx/xxx.plist
2)、 用户组权限
chown root:admin /xxx
3)、查找中间为 book 的所有文件、文件夹
find / -name “*book*”
12、frida-ios-dump
1)、手机端。
cydia,先添加软件源
build.frida.re
再根据版本自行选择安装。
注:这里一个坑,困扰了我大半天
提示 code(1),安装失败,从字面上查,是内存不够,但实际上是 iOS10 不带XZ,需要自行安装,需另添加软件源
apt.bingner.com
再安装,XZ Utils。
当然,查了内存不够的做法,也不是一无所获,了解了几个知识点:
1、好像iOS12还是几,后面版本就不区分系统盘内存。
2、可以用 Filza 把文件夹移动到/var/mobile/stash(存储的意思)/你的文件夹,然后再 你的文件夹 原来的上一级,新建链接,到 /var/mobile/stash(存储的意思)/你的文件夹 里。
2)、电脑端。
待整理操作顺序。
13、iOS守护进程/daemon
参考,这篇文章 https://iosre.com/t/run-a-daemon-as-root-on-ios/212 。
0)、开始创建第一个demo
1)、每次打开终端,都需要对路径进行“宏定义”一次(第二行才是创建)
export THEOS=/opt/theos
$THEOS/bin/nic.pl
2)、然后根据返回的列表,输入 iphone/tool 的序号
3)、然后是 项目名、包名、开发者 回车。
4)、这个时候,会在 /Users,生成 项目名的文件夹。(为什么是/Users ? 因为,每次打开终端,都默认 /Users ,除非,自己再 cd )
5)、对 main.m 编程
#import <stdio.h> #import <CoreFoundation/CoreFoundation.h> #import <Foundation/Foundation.h> static void Reboot(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { NSLog(@"iOSRE: reboot----------"); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" // system("reboot"); #pragma GCC diagnostic pop } int main(int argc, char *argv[], char *envp[]) { // @autoreleasepool { printf("-------------->>>>>Hello world!\n"); NSLog(@"iOSRE: iOSREd is launched!"); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, Reboot, CFSTR("my-daemon-reboot-text"), NULL, CFNotificationSuspensionBehaviorCoalesce); CFRunLoopRun(); // keep it running in background return 0; // } }
注:system C函数,从xcode几开始就无法编译了,需要下载旧的xcode版本,或者用 dlsym 、posix_spawn替代也行,这里不展开
先注释掉,只要我们抓取到log,知道成功就行了
6)、打开makefile,填入如下
export THEOS = /opt/theos export THEOS_DEVICE_IP = 同一Wi-Fi下越狱手机的ip 放最后 after-install:: install.exec "killall -9 SpringBoard"
7)、用终端创建文件夹、plist。
cd 到刚才daemon项目生成的位置 mkdir -p ./Layout/Library/LaunchDaemons/ cd ./Layout/Library/LaunchDaemons/ touch 包名.plist chmod 644 包名.plist
8)、此时双击plist,应该会提示为nil,无法打开,可以使用Sublime Text
9)、复制下面代码到plist文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>KeepAlive</key> <true/> <key>Label</key> <string>包名</string> <key>Program</key> <string>/usr/bin/项目名</string> <key>RunAtLoad</key> <true/> </dict> </plist>
注:Label 改成你的包名,Program,改成你 Makefile 的 INSTALL_PATH 路径,否则,可能启动失败
在这里被坑了,参考文章的版本可能比较旧,plist路径是/usr/bin
而我的版本,生成的 Makefile 的 INSTALL_PATH 路径为/usr/location/bin,如果上面代码复制到plist,不改路径,对不上了。
10)、可添加一些参数(暂未验证)
<key>ProgramArguments</key> <array> <string>arg1</string> <string>arg2</string> <string>more args...</string> </array>
11)、在cd 到项目文件夹,直接打包下载 make package install
注:参考文章,可能是旧版本的原因,打包的文件用户组不是 root/wheel ,需要下载其他工具修改,新版不用,这里略过
12)、测试
12-1)、重启,不完美越狱需要再重新越狱。
12-2)、进入ssh root,然后ps -e | grep 项目名,看看有没有运行
111 ?? 0:00.01 /usr/bin/项目名
222 ttys000 0:00.00 grep 项目名
如果出现类似上面为成功,如果出现下面为失败,可能哪个步骤出错。
222 ttys000 0:00.00 grep 项目名
12-3)、成功的话,进入cript,cript自行安装。
cycript -p SpringBoard np = @encode(unsigned int(*)(char const*))(dlsym(RTLD_DEFAULT, "notify_post")) np("my-daemon-reboot-text")
注:发送的消息 "com.naken.iosred.reboot" 要和刚才的.m 接受通知一致。
这时打开控制台 consol.app,一边发送通知 np("my-demon-reboot-text"),一边查看log。