菜鸡啥都学点,啥都不精。

image-20250113134711544

工欲善其、事必先利其器

安卓APK逆向的工具

雷电模拟器运行APK

雷电模拟器,作为安卓模拟器的佼佼者,一直以来备受用户青睐。它不仅可以让你在PC上畅快运行安卓应用,还能提供与手机端接近的使用体验,让你在开发、调试乃至游戏娱乐中都能游刃有余。安装雷电模拟器其实并不复杂,但要确保顺利完成,还是有一些细节需要关注。

没用过,不清楚

https://www.ldmnq.com/

ADB的使用

ADB(Android Debug Bridge),简直是安卓开发者和逆向工程师的“瑞士军刀”。无论是调试、安装应用,还是进行日志分析,ADB都是不可或缺的工具。你可能会认为ADB只是一个命令行工具,然而它的强大远超你的想象。

没有用过,只使用GDB。

使用方法:ADB安装及使用详解(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客

下载地址:ADB下载地址

这里笔者也就配置了一下环境变量,然后看了看版本啥的

image-20250504131043362

具体的命令,没尝试过

JADX反编译APK

JADX是一款非常流行且功能强大的APK反编译工具,它能够将APK中的DEX文件(即Dalvik Executable文件)反编译成可读的Java源代码。JADX的优势不仅仅在于它的易用性,还在于它的反编译效果非常优秀,能够清晰地显示反编译后的Java代码,帮助开发者和安全人员深入理解应用的内部逻辑。

使用方法:APK反编译工具jadx - chuyaoxin - 博客园 (cnblogs.com)

下载地址:JADX下载地址

做过安卓题了解一点,看看加密逻辑,然解包啥的

GAD进行APK反汇编

GAD(Google Android Disassembler)是一个专注于APK底层字节码分析的工具。与JADX不同,GAD更多侧重于字节码级别的反汇编,它能够帮助安全研究人员和开发者深入到应用的最底层,查看其具体的机器码和执行逻辑。GAD特别适用于那些对字节码和汇编语言感兴趣的逆向工程师,它可以帮助我们获得应用中深层次的行为信息。

使用方法:[原创]GDA使用手册-Android安全-看雪-安全社区|安全招聘|kanxue.com

下载地址:GAD下载地址

没用过

image-20250504132816228

JEB进行APK反汇编

JEB的魅力在于其高精度的反汇编能力。它不仅能解析传统的DEX文件,还能处理各类复杂的文件格式,包括加固过的APK、经过混淆处理的代码,甚至是一些非标准的Android文件结构。它像一把锐利的刀刃,切开了应用的“外壳”,揭示其最核心的部分。

使用方法:第36讲: 使用Jeb工具反编译安卓APK_jeb反编译工具-CSDN博客

下载地址:JEB下载地址

没用过,简单安装一下java环境,就完了

IDA进行反汇编

Frida脱壳工具的使用

Frida 是一个强大的动态分析工具,广泛应用于反向工程和安全测试中,尤其是在对 Android 应用进行脱壳(解除保护)时,它能够帮助研究人员通过动态注入脚本来分析应用程序的行为。以下是使用 Frida 进行脱壳的环境配置和基本步骤。

Frida相关工具的安卓

1
2
3
4
>pip install frida         # 安装 Frida 主库
>#pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
>pip install frida-tools # 安装 Frida 的工具集,提供命令行工具
>pip install frida-dexdump # 安装 frida-dexdump,用于分析 APK 文件的 dex 内容

入门教程:[Frida入门教程] 一文搞定Frida环境搭建,基于逍遥模拟器(虚拟设备)和ADB(Android Debug Bridge)-CSDN博客

image-20250504141941152

APK解析基础

简单讲一下APK。

APK文件是Android操作系统中的应用程序包,它包含了应用的所有资源、代码和必要的配置文件。可以把APK看成一个容器,其中集成了Android应用所有的组成部分。

APK的基本结构

APK文件是以ZIP格式进行压缩打包的,因此,我们可以像操作普通的ZIP文件应用,使用解压工具对其进行解压,通过解压查看APK文件的目录结构,我们能够清晰了解每个组成部分的作用。

image-20250504151632487

我们简单拆一个包看一下其里边结构的目录文件。(题目:Palar靶场的Android)

image-20250504151950996

  • res

res/目录包含了Android应用所需的所有资源文件。与assets目录不同,res目录中的资源文件是经过编译的,按照不同类型的资源进行组织。

  • META-INF

**META-INF/**目录与Java的JAR文件类似,用于存放APK文件的元数据,如签名文件、校验信息等。

  • lib

lib/目录包含了本地库文件,通常是通过JNI(Java Native Interface)与C/C++编写的本地代码。这些库文件可以针对不同的硬件架构(如arm、x86等)进行编译,因此lib/目录下通常会为每个架构创建相应的子目录。这个目录中存放的本地库可以通过Java代码调用JNI接口实现与系统底层的交互。

  • resources.arsc

resources.arsc文件包含了应用程序的所有编译后的资源映射信息。这个文件并不存储实际的资源内容(如图片或字符串),而是存储资源与资源ID的映射关系。例如,它会保存应用中的字符串、颜色、尺寸、样式等信息以及这些资源的ID。通过这个文件,Android系统能够在应用运行时快速访问和加载所需的资源。

  • classes.dex

classes.dex文件包含了应用程序的可执行代码。它是应用的Dalvik字节码文件,也是Android应用在运行时通过Dalvik虚拟机ART解释执行的核心文件。每个Android应用中,所有的Java源代码都经过编译后形成一个或多个DEX文件,这些文件包含了应用的业务逻辑和代码实现。

在Android5.0之后,Google引入了ART代替传统的Dakvik虚拟机,ART的执行方式比Dalvik更高效,支持Ahead-of-time编译和即时编译策略。

拓展阅读一下,相关文档:

JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

安卓逆向学习—-smali,dex,java等文件之间转换关系

  • assets

assets目录包含了应用程序的原始资源文件,这些资源不经过编译,直接以原始形式存储。通常,开发者可以在该目录中存放字体文件、音频文件、HTML文件等,应用在运行时通过API来读取这些资源。例如,游戏可能会将所有的地图文件或纹理图像存放在此目录中。通过AssetManagerAPI,应用可以访问这些文件。

  • AndroidMainifest.xml(核心关键)

AndroidMainifest.xml是每个Android应用不可或缺的配置文件,他包含了应用的关键信息。我们可以把它看作是应用的“蓝图”或“说明书”,它向系统声明了应用的基本属性、组件以及权限等。

AndroidMainifest.xml包括以下重要的部分:

应用的包名:每个Android应用都有一个唯一的包名,通过包名来区分不同的应用。

应用的组件:声明应用包含哪些组件,以及这些组件的属性和功能。

权限声明:列出应用所需的权限,如访问网络、读取存储、使用相机等。

应用主题和图标:定义应用的UI样式和图标等。

最小SDK版本和目标SDK版本:确定能在什么版本的Android系统上运行。

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" android:compileSdkVersion="29" android:compileSdkVersionCodename="10" package="com.example.myapplication" platformBuildVersionCode="29" platformBuildVersionName="10">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="29"/>
<application android:theme="@style/Theme.MyApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:allowBackup="true" android:supportsRtl="true" android:roundIcon="@mipmap/ic_launcher_round" android:appComponentFactory="androidx.core.app.CoreComponentFactory">
<activity android:name="com.example.myapplication.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

解析一下关键字段:

  • mainifest:包含整个应用的包信息及权限定义
    • package:定义了应用的包名,通常为反向域名格式,如com.example.app。
    • android:versionCode:定义应用的版本号
    • android:versionName:定义应用版本名称
  • application:包含应用的核心配置,如主题、图标等
    • android:icon:定义应用的图标
    • android:label:定义应用的名称
    • android:theme:应用的UI主题
  • activity:声明应用的各个界面,以及这些Activity的属性和行为
    • android:name:Activity的类名
    • android:label:Activity的标签
    • android:theme:Activity特有的UI主题
  • uses-permission:声明应用所需要的权限,如访问网络、发送短信等
  • intent-filter:定义组件的功能和响应的事件,如Activity的启动方式或Broadcast Receiver接收的广播类型