2-逆向Simple-Notes-以了解apk的结构
https://github.com/SimpleMobileTools/Simple-Notes
有帮助的资料
https://blog.huli.tw/2023/04/27/android-apk-decompile-intro-1/
apk?
apk本质上是zip
其构建过程大概是这样
源代码 (.java/.kt)
↓ 编译
字节码 (.class)
↓ dx/r8
DEX文件 (.dex)
↓ 打包
APK (ZIP) ← 加入资源、清单等
↓ 签名
签名APK ← 加入META-INF/
↓ 对齐
发布APK ← 优化文件对齐
AndroidManifest.xml?
该文件记录了app的信息,版本号,名称,权限之类的,由手机操作系统读取
META-INF?
存放了
CERT.RSA
CERT.SF
MANIFEST.MF
我简单理解为
MANIFEST.MF 验证所有程序文件未被篡改,对每个文件都做了hash散列
CERT.SF 验证MANIFEST.MF,给MANIFEST.MF作一次散列,然后文件条目的散列做二次散列,最后这些东西用私钥加密存放到CERT.RSA
CERT.RSA 验证开发者和CERT.SF的可靠真实,存放了对应的公钥
设备验证时:
- 从CERT.RSA提取证书和公钥
- 用公钥解密CERT.SF的签名,得到预期哈希H1
- 计算CERT.SF的实际哈希H2
- 如果 H1 == H2,证明CERT.SF是可信的
- 再用CERT.SF验证MANIFEST.MF
- 最后用MANIFEST.MF验证所有文件
那么为什么这个能保证apk不被篡改呢?
因为如果篡改了文件,那么MANIFEST.MF就必须改变
然后就需要重新计算CERT.SF
但是CERT.RSA的伪造,需要私钥对新的CERT.SF的签名,而私钥只在开发者的电脑上
res?
存放了非代码的文件,主要是图片和xml
unknown?
unknown/
├── ezvcard/ # 第三方vCard库的资源
├── freemarker/ # FreeMarker模板引擎
├── kotlin/ # Kotlin标准库资源
└── org/joda/time/ # Joda-Time时区数据
assets/dexopt
好像是,apk里的dex要即时编译才能在cpu的层面被执行,而这中间会有时间,因此预先编译部分重要信息作为缓存
classes.dex?
这个就是程序的核心了
我猜,对andriod的漏洞的挖掘,主要从这里着手
不过,如果是分析apk病毒之类的,可能要加大分析范围
如果apktool 不加—no-src 选项,就不会有这个文件,取而代之的是smali文件夹
dex?
字节码
我对它的理解
类似于.class 对于java虚拟机
类似于.pyc 对于python虚拟机
类似于机器码 对于真机
这个运行在andriod虚拟机上
收工