apk文件格式

.apk文件格式

APK(Android Package) 本质是一个zip压缩包,其文件格式通常为:
app.apk
├── AndroidManifest.xml
├── classes.dex
├── resources.arsc
├── res/
├── lib/
├── assets/
└── META-INF/

  1. AndroidManifest.xml

应用的配置清单,声明包名、版本、权限、四大组件(Activity/Service/BroadcastReceiver/ContentProvider)等。编译后为二进制格式,需用 apktool 等工具解码。

  1. classes.dex

Dalvik 字节码文件,包含应用的主要代码。

  1. resources.arsc

编译后的资源索引表,记录字符串、颜色、尺寸等资源与 ID 的映射关系。

  1. res/

存放未编译进 resources.arsc 的资源文件,如布局 XML、图片、动画等。其中的 XML 多为二进制格式。

  1. lib/

存放 Native 库(.so 文件),按 CPU 架构分目录:
armeabi-v7a、arm64-v8a
x86、x86_64

  1. assets/

存放原始资源文件,不会被编译,通过 AssetManager 访问。

  1. META-INF/

存放签名信息

常用jadx-gui进行反编译
一般先找AndroidManifest.xml里的package="com.xxx"语句和android:name="com.xxx",这两句的com...其实可以看作文件路径,用jadx打开后会在左侧看到com/这个目录,除了这两句其他的基本是自动生成的语句

极其重要的点!!!

  1. 在android系统下,.apk就是一个手机上的app,进入app时,执行的文件有:
    .dex和.so,二者有以下关系:

.dex是Java字节码,需要翻译后才能被机器执行,而打开app时会自动打开一个ART虚拟机用来翻译后CPU才能执行.dex。
.so是机器码,CPU能直接执行。(用IDA打开并F5可看到逻辑)

二者的关系:一般执行时先执行.dex当执行到要调用.so的语句时,.so开始执行

.so 和 Java 说什么话?—— JNI
JNI = Java Native Interface,是两个世界唯一的桥,双向的:
方向 1:Java 叫 .so 干活(最常见)
public native String decode(String in); // Java 只写声明,不带方法体
// .so 里实现它,函数名有固定格式:
Java_com_lynnette_girlhook_MainActivity_decode(...)
▎ 看到 Java 里的 native 关键字 = 逻辑在 .so 里 → 该上 IDA 了。

方向 2:.so 反过来改 Java
hook_java_method("...", "MainActivity", "check_if_correct", ...);
.so 主动去把 Java 方法的实现换掉。

因为二者的双向性,出题人可以在某个文件中写函数hook(劫持)另一个文件中的某个文件,也可以用Lua+加密 隐藏逻辑代码并写到.so中

hook
即劫持:在程序运行时,把某个函数“截住",插进自己的代码

Lua
一句话:一门轻量脚本语言+一个C写的解释器(约200KB,能塞进任何程序)

posted @ 2026-09-23 21:02  Yyytt  阅读(5)  评论(0)    收藏  举报