反编译 APK 的基本步骤

本文详细介绍了如何反编译一个未加固的安卓APK,包括使用apktool、dex2jar和jd-gui等工具进行解压、反编译、阅读代码、修改逻辑和回编过程,最后还涉及重新签名和对齐,以实现对APP内部逻辑的修改和重新安装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反编译 APK 的基本步骤

本文简要说明一个 apk(未加固) 的反编译步骤以及所使用到的工具,下列工具在网上均可以下载到

  • apktool
  • dex2jar
  • jd-gui

1.编写一个简单的安卓 app

在此处编写一个简单的 app,并且该 app 没有进行过加固,并将 app 打包成 apk,例如此处的为 release-app.apk

2.将 release-app.apk 解压缩

将 release-app.apk 改扩展名为 release-app.zip(apk 其实是基于 zip 文件格式的文件),并执行解压缩,得到如下目录结构

在这里插入图片描述

  • AndroidManifest.xml:Android 的清单文件,该文件向系统提供应用的必要信息
  • classes.dex:classes 文件通过 DEX 编译后的文件格式,用于在 Dalvik 或 ART 上加载运行的文件
  • lib:存放不同 cpu 架构下的 so 库文件
  • META-INF:存放的是签名的信息,用来保证 apk 包的完整性和系统的安全
  • res:存放资源文件
  • resources.arsc:编译后的二进制文件。通常本地化资源存储在该文件中

3.将 classes.dex 文件反编译为 jar 文件

由于 dex 文件是汇编指令级别的,不可阅读,所以通过 dex2jar 工具将汇编代码转换为 jar 文件

$ d2j-dex2jar classes.dex

会在当前目录下生成一个 classes-dex2jar.jar 文件

4.使用 jd-gui 可视化阅读 classes-dex2jar.jar 文件内容

可以通过 jd-gui 来阅读你关注的代码逻辑

在这里插入图片描述

5.使用 apktool 反汇编 app-release.apk

如果想要修改 app 的内部逻辑,光是阅读代码逻辑是不够的,还需要进行内部逻辑的修改,这时,apktool 就派上了用场

$ apktool d app-release.apk -o release-out

可以得到 release-out 的内部结构大致如下:

在这里插入图片描述

  • AndroidManifest.xml:该文件是经过 apktool 处理过后的清单文件,具备可读性
  • apktool.yml:apktool 生成的文件,可不用关注
  • lib:存放不同 cpu 架构下的 so 库文件
  • original:里面存放原始 AndroidManifest.xml 和 META-INF
  • res:经过 apktool 处理后的资源文件
  • smail:claases.dex 反汇编后的代码(可以对 smail 文件进行修改来改变执行逻辑)

smail 文件的大体样式如下

.class public Lcom/example/ndkdemo/MainActivity;
.super Ljava/lang/Object;
.source "MainActivity.java"


# direct methods
.method static constructor <clinit>()V
    .locals 1

    const-string v0, "ndkdemo"

    .line 6
    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

    return-void
.end method

.method public constructor <init>()V
    .locals 0

    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method


# virtual methods
.method public native stringFromJNI()Ljava/lang/String;
.end method

smail 的汇编指令,可以自行在网上进行学习

6.回编 apk

对 smail 中相关逻辑进行修改,可对 apk 进行回编

$ apktool b -o repackaged.apk release-out

7.重新签名 apk 和对齐

$ keytool -genkey -v -keystore custom.keystore -alias mykeyaliasname -keyalg RSA -keysize 2048 -validity 10000

# 签名 apk
$ jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore custom.keystore -storepass mystorepass repackaged.apk mykeyaliasname

# 校验你创建的 apk
$ jarsigner -verify repackaged.apk

# 对齐 apk
$ zipalign 4 repackaged.apk repackaged-final.apk

8.重新安装 apk 到你的设备

$ adb install repackaged-final.apk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GettingReal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值