Android逆向基础——APK的格式

article/2025/9/19 1:16:57

Android 安装包常以apk(android Package)、xapk为后缀,本质是一个压缩包,包内存存放运行着应用程序安装必要的所有资源、代码。可直接修改后缀为zip解包。

解包后目录大致如下:

assets

资源文件,通过context.getAssets();获得,通常存放扩展资源。

lib

JNI二进制动态库,用于与C++互相调用。通过 System.loadLibrary("")加载。

META-INF

签名文件夹,应用程序打包后需要签名

CERT.RSA

CERT.SF

MANIFEST.MF

res

应用程序资源,区别于Assets,一般为应用程序内资源,每个资源会在R类内被标注一个ID,通过getResources().*(R.*.资源名)、findViewByID等可获得响应的资源对象。

drawable

layout

menu

图片

布局

菜单

classes.dex

可执行文件

AndroidManifest.xml

配置文件

resources.arsc

R类会编译成这个文件,它负责将资源ID与资源文件联系起来

对于逆向我们更关心AndroidManifest、classes.dex、lib这三个。

1. AndroidManifest.xml文件描述了该app如何被安装与运行。

对于漏洞挖掘,逆向分析有着重要的引导作用,这里引入一个CTF的manifest文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" package="com.zhuotong.kanxuectf2" platformBuildVersionCode="23" platformBuildVersionName="6.0-2438415"><uses-sdk android:minSdkVersion="15" android:targetSdkVersion="16"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.READ_LOGS"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.GET_TASKS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.SET_WALLPAPER"/><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/><application android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:label="@string/app_name" android:icon="@drawable/icon" android:allowBackup="true" android:supportsRtl="true"><activity android:name="android.support.p001v4.app.o000000o" android:excludeFromRecents="true" android:launchMode="singleInstance" android:windowSoftInputMode="adjustPan"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activity-alias android:label="@string/second_activity_name" android:icon="@drawable/baah" android:name="android.support.v4.app.Q496512831" android:enabled="false" android:excludeFromRecents="true" android:launchMode="singleInstance" android:targetActivity="android.support.v4.app.o000000o"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity-alias><provider android:name="android.support.p001v4.app.OO0OOOO0" android:authorities="com.zhuotong.net"/></application>
</manifest>

根节点为manifest,其中package属性描述着应用程序的包名。

uses-sdk 节点描述着所使用的sdk版本信息。

uses-permission描述应用程序申请使用的权限。当使用android中的权限时,都以android.permission开头

application 节点描述程序内部功能,如四大组件:

activity、provider、receiver、service。

他们都拥有intent-filter子节点,用于使用intent激活它们时对intent进行过滤。

其中categoryandroid.intent.category.LAUNCHER时,表示被描述的Activity为主界面。且name为程序入口点。

此处为android.support.p001v4.app.o000000o

2. classes.dex是一个dalvik可执行程序,内部存放着app的Java代码编译后的dalvik字节码

他被Android 虚拟机所识别、执行。是逆向中最重要的文件。

通过jadx等逆向软件查看到的代码就出自于这些classes.dex中。dex有时不止一个,当代码够多时按照classes2.dex、classes3.dex以此类推。

Android app静态分析工具都是对这些dex文件进行反编译,分析。可以理解为Android系统中的汇编。

Android 虚拟机有两种,分别是dalvik与ART。

Dalvik是Google公司自己设计用于Android平台的虚拟机。是一个翻译并执行dalvik指令的虚拟机。

在Android 4.4后新加入ART,在Dalvik基础上进行优化,将dalvik代码编译成本地机器码,执行效率大大提升。同时不需要更改dex的格式,对dalvik指令兼容。

注意:dalvik与jvm不一样且不互相兼容。

3. lib内会存放app中使用的二进制动态链接库文件。比如System.loadLibrary

它们是linux中的so库,是标准的ELF文件,不过它们对导出函数的命名规则与定义有特殊的要求。

如果想通过so库实现Java中的native函数,在c中需要将导出函数名按照类到方法的全路径写,并且用"_"替换路径中的"."

比如com.example.test.ctf03.JNI.getResult方法导出函数名需要写成Java_com_example_test_ctf03_JNI_getResult。

而且该方法会有一个固定的参数:JNIEnv *env。这个参数表示着Java的环境并且提供了许多调用Java代码与反射的方法。

比如:

 jobject (JNICALL *NewObject)

      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);

 jclass (JNICALL *GetObjectClass)

      (JNIEnv *env, jobject obj);

 jmethodID (JNICALL *GetMethodID)

      (JNIEnv *env, jclass clazz, const char *name, const char *sig);

 jobject (JNICALL *CallObjectMethod)

      (JNIEnv *env, jobject obj, jmethodID methodID, ...);

 jobject (JNICALL *GetObjectField)

      (JNIEnv *env, jobject obj, jfieldID fieldID);

 void (JNICALL *SetObjectField)

      (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);

至于jfieldID、jmethodID有对应的方法可以通过名称来获得。(GetxxxID)

同时从java的类型到C里变成了

typedef unsigned char   jboolean;

typedef unsigned short  jchar;

typedef short           jshort;

typedef float           jfloat;

typedef double          jdouble;

typedef jint            jsize;

class _jobject {};

class _jclass : public _jobject {};

class _jthrowable : public _jobject {};

class _jstring : public _jobject {};

class _jarray : public _jobject {};

class _jbooleanArray : public _jarray {};

class _jbyteArray : public _jarray {};

class _jcharArray : public _jarray {};

class _jshortArray : public _jarray {};

class _jintArray : public _jarray {};

class _jlongArray : public _jarray {};

class _jfloatArray : public _jarray {};

class _jdoubleArray : public _jarray {};

class _jobjectArray : public _jarray {};

简单的实战:

通过JADX逆向APK:

拖入apk后的,有源代码与资源文件,源代码中的代码是通过DEX文件反编译而来,而资源文件是整个apk解压后的目录。

第一件事就是打开Manifest文件查找入口点与主界面

看到只有com.example.test.ctf02.MainActivity下有android.intent.category.LAUNCHER。

找到对应代码,其中onCreate方法是在创建时初始化的函数,没有构造函数时它将会是第一个执行的函数。

接下来就是对Java代码的审计工作了。


http://chatgpt.dhexx.cn/article/9uwQoyhn.shtml

相关文章

JS逆向笔记-记录某测试论坛的js逆向练习

这个网站应该是专门练习的&#xff0c;因为有个地方说不太通&#xff0c;在此只能算是练习&#xff0c;记录下&#xff0c;方便以后进行查阅。 首先访问主页&#xff1a; 他会设置一个cookie值&#xff0c;并且会把加密的salt 带出来。还有个叫lt的东西也会用html的形式传出来。…

Matlab逆向归纳法,逆向归纳法

逆向归纳法(backward induction)是求解动态博弈均衡的方法 [编辑] 什么是逆向归纳法 逆向归纳法(backward induction)是求解动态博弈均衡的方法。所谓动态博弈是指博弈参与人的行动存在着先后次序&#xff0c;并且后行动的参与人能够观察到前面的行动。逆向归纳法在逻辑上是严密…

逆向工程

逆向工程 数据库部分逆向工程说明导入文件 reverseProject添加相应jar包修改这个工程三个 .xml 文件都要修改的地方修改generatorConfig.xml文件 工程终点-运行GeneratorSqlMap.java文件 在使用mybatis时需要根据数据表创建实体类&#xff0c;pojo类的映射文件以及sql语句和Dao…

逆向 实战

逆向实操 汇编 《汇编语言》,王爽 《天书夜读》邵坚磊等 《Intel汇编指令集手册》 基础 学习汇编的原则 不推荐写纯汇编程序,一般都是通过_asm{}方式嵌入部分汇编代码学习汇编的目的是:解底层&#xff0c;调试&#xff0c;逆向分.c-编译->.s-汇编→.o(linux平台)/.obj(wi…

微信逆向分析(一)——逆向分析的原理

逆向的简单理解 正向开发&#xff0c;是先写代码&#xff0c;再编译成软件。而逆向分析&#xff0c;到手的只有软件。从软件入手&#xff0c;推测对应的代码&#xff0c;需要了解一下编译之后的软件是怎么跑起来的。 软件运行过程 1、软件加载到内存。 2、CPU读取内存的指令…

【JavaScript 逆向】网易易盾滑块逆向分析

声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 案例目标 验证码&#xff1a;aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9qaWdzYXc 以上均做了脱敏处理&#xff0c;Base64 编码及解码方式&#xf…

【JavaScript 逆向】今日头条 jsvmp,_signature 参数分析

前言 现在一些网站对 JavaScript 代码采取了一定的保护措施&#xff0c;比如变量名混淆、执行逻辑混淆、反调试、核心逻辑加密等&#xff0c;有的还对数据接口进行了加密&#xff0c;这次案例是通过补环境过 jsvmp。 声明 本文章中所有内容仅供学习交流&#xff0c;相关链接…

【JavaScript 逆向】拼多多 anti_content 参数逆向解析

前言 现在一些网站对 JavaScript 代码采取了一定的保护措施&#xff0c;比如变量名混淆、执行逻辑混淆、反调试、核心逻辑加密等&#xff0c;有的还对数据接口进行了加密&#xff0c;这次案例是通过补环境过加密。 声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做…

CTF逆向基础

更多资源请进入&#xff1a;https://github.com/SycloverTeam/SycRevLearn 查看。 1 IDA定位main函数 运行T1.exe。 将可执行程序放入IDA中&#xff0c;并查找字符。 双击。 按F5&#xff0c;进入代码。 可以对函数进行重新命名&#xff0c;此时也已经得到了flag。 2 …

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

您可能之前看到过我写的类似文章&#xff0c;为什么还要重复撰写呢&#xff1f;只是想更好地帮助初学者了解病毒逆向分析和系统安全&#xff0c;更加成体系且不破坏之前的系列。因此&#xff0c;我重新开设了这个专栏&#xff0c;准备系统整理和深入学习系统安全、逆向分析和恶…

逆向--基础知识篇

基础知识 可执行文件 计算机中可以被直接执行的程序被称之为可执行文件&#xff0c;可执行文件中是由指定操作系统的可执行文件格式规范与当前CPU机器指令码组成。不同的操作系统、不同的CPU之间的可执行文件都可能存在或多或少的差异。本篇主要以Windows操作系统、x86架构的…

逆向入门到入土

第一章 概述 学了几个月的逆向&#xff0c;记得10月份国庆节刚开始学的时候 感觉找flag蛮有意思&#xff0c;看着一个up主的视频&#xff0c;那时候c语言也没怎么学&#xff0c;所以就单纯他怎么做&#xff0c;我自己怎么做&#xff0c;后面去一些ctf靶场做了几道题&#xff0…

BNU1064:人品问题

“人品既不能被创生&#xff0c;也不能被消灭。只能从一个人转移到另一个人&#xff0c;从一个层面转化到另一个层面&#xff0c;而在转移和转化的过程当中&#xff0c;人品的总和保持不变。” 至此引出人品学(Characterics)三定律&#xff1a; 第一定律&#xff1a;即人品守恒…

开发者的人品问题

程序员都知道&#xff1a;绝大多数编程中的问题&#xff0c;最终都是自己的人品问题。当遇到奇怪的问题时&#xff0c;我们总是喜欢怀疑系统、怀疑编译器、怀疑网络、怀疑硬件……就是不愿意怀疑自己的人品。熬过几个不眠之夜后&#xff0c;最终还是发现自己的代码存在人品问题…

A. 人品问题

A. 人品问题 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: Main Submit Status PID: 1064 Font Size: - “人品既不能被创生&#xff0c;也不能被消灭。只能从一个人转移到另一个人&#xff0c;从…

BNU 1082 人品问题

这个题我是1A 突然觉得自己好叼 #include<bits/stdc.h> int main() {printf("25\n");return 0; }

人品问题

Description 网上出现了一种高科技产品——人品测试器。只要你把你的真实姓名输入进去&#xff0c;系统将自动输出你的人品指数。yzx不相信自己的人品为0。经过了许多研究后&#xff0c;yzx得出了一个更为科学的人品计算方法。这种方法的理论依据是一个非常重要的结论&#xff…

人品差的人,开口闭口都是这些话,一定不要深交!

说话之道&#xff0c;也是为人之道。 言语是思想的发声&#xff0c;从一个人的话里&#xff0c;往往可以听出其内心的声音。 从而初步判断出一个人的人品如何&#xff0c;是否值得交往。 那些人品差的人&#xff0c;开口闭口都离不开以下三种话&#xff0c;身边若有此类人&a…

adb logcat 命令行用法

本文为转载。 作者 :万境绝尘 转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 adb logcat --help 命令, 就可以显示该命令的帮助信息; [plain] view plain copy octopusoctopus:~$ ad…

java logcat_logcat -- 基本用法

1.Log类是一个日志类&#xff0c;我们可以在代码中使用logcat打印出消息 常见的日志记录方法有&#xff1a; v(String,String) --verbose 显示全部信息 d(String,String) -- debug 显示调试信息 i(String,String) -- information 显示一般信息 w(String,String) -- warning 显…