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、重启
410.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。

 

posted on 2020-12-07 11:52  leonlincq  阅读(765)  评论(0编辑  收藏  举报