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的可靠真实,存放了对应的公钥

设备验证时:

  1. 从CERT.RSA提取证书和公钥
  2. 用公钥解密CERT.SF的签名,得到预期哈希H1
  3. 计算CERT.SF的实际哈希H2
  4. 如果 H1 == H2,证明CERT.SF是可信的
  5. 再用CERT.SF验证MANIFEST.MF
  6. 最后用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虚拟机上


收工