介绍
记录如何使用 ebpf 脱壳
过程
最近分析一款app, 某啡最新版. 本来以为很简单, 没想到踩了很多坑.
首先 jadx 打开 发现 com.stub.StubApp. 这里就猜到是 数字壳, 尝试用 frida 脱壳看看, 结果一 hook 就崩溃. 并且崩溃后必须重启, 否则即使不挂frida 这个app都无法正常打开.
我们看看是哪个so 导致的崩溃
1 | var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); |

结果崩溃在 libjgdtc.so, 并不是 libmsaoaid.so. ida 打开 libjgdtc.so, 也被混淆了, 无法查看内容.
怎么办呢, 想到了 blackDex, 之前用过, 有的时候还是很有效的, 结果试了发现不行.
于是就想到了fart. 但是我的测试机有各种环境,到时候再装环境太麻烦了。
正好一顿搜索看到了一个开源项目, https://github.com/LLeavesG/eBPFDexDumper
这个项目是基于ebpf 完成脱壳。 之前用过 基于 ebpf 的 stackplz, 非常好用, 内核插桩,一行指令hook libart 下的各种函数. 非常方便.
于是我看了下自己的测试机, 是 pixel 4, 内核为 4.14.150-gf3a84757f21f-ab6216664, 不支持.
于是我想到了我手里还有一台rock5b+. 看能否试试看.
于是装上 radxa 官方提供的镜像. 因为我加了一个固态硬盘, 数据都放在固态硬盘, 每次启动需要将固态挂在到目录下.
sudo mount /dev/nvme0n1p1 /media/ssd
我自己的数据都在 /media/ssd/ubuntu_data/mt 下
然后 通过 redroid 启动一个android 容器. 指定各种参数. 并且这个镜像还支持lsposed + justTrustme 本人亲测可用.
1 | docker run -d -p 5557:5555 -v /media/chilly/c5ab23a8-48d8-4d3b-98e7-692b498e1a98/ubuntu_data/android_2:/data --restart unless-stopped --name android_2 --privileged cnflysky/redroid-rk3588:lineage-20 androidboot.redroid_height=1920 androidboot.redroid_width=1080 androidboot.redroid_magisk=1 ro.ril.oem.imei=861503068361145 ro.product.manufacturer=OPPO ro.product.locale=zh-CN ro.product.model=OPPO A83js ro.product.brand=OPPO ro.product.name=A83js ro.product.device=M6763C ro.product.board=full_oppo6763_17101 ro.build.product=oppo6763_17101 androidboot.redroid_fake_wifi=1 |
然后本机
adb -s 172.31.xxx.xx:5557 shell
uname -r
5.10.0-1012-rockchip
可以看到是 手机显示的 5.10 的内核.
于是我们下载一个 eBPFDexDumper, 然后 adb -s ip:port push /data/local/tmp/
1 | chmox +x eBPFDexDumper |

然后整个 pull 出来, jadx 打开. 发现成功脱壳
