# 一次安卓逆向工程记录

Original: <https://lifelonglearn.ing/android-reverse-engineering>

Author: [奶爸](https://lifelonglearn.ing/users/3b04650c-8231-499b-8ef0-381fc4d7efb0)

Published: 2022-09-01T13:05:49Z

Updated: 2026-09-27T06:57:43Z

Version: 1

记录一次最简单的安卓逆向过程。只是修改 App 内的一个数值即可达到效果。

## 准备工具

* ​**vscode**​：编辑 smali 中间代码使用
* ​**jadx**​：反编译 dex 查看 java 代码、定位 smali 使用
* ​**apktool**​：解包打包 APK

## 逆向过程

### 解包

在 **apktool** 所在文件夹执行一下命令

```shell
java -jar apktool_2.6.1.jar d apk文件.apk
```

### 定位

使用 **jadx** 打开 APK 搜索相关的文本，比如「您的金币不够了，请充值」。

找到这个资源的ID，搜索这个资源ID，比如找到以下逻辑

```java
if (user.getBalance() < 200) {
  new AlertDialog(gameActivity.getContext()).builder().setCancelable(true).setMsg(gameActivity.this.getString(R.string.balance_not_enough)
}
```

定位到逻辑之后我们可以在 vscode 中打开解压的文件夹，搜索这个方法名。

### 修改

比如说 `public int getBalance()`，返回值是个 `int`，根据 smali 语法，应该搜索 `getBalance()I` 来定位这个方法位置（`I`就是返回类型`int`） 根据 smali 语法我们将 `getBalance()` 方法的返回值永远定格到 ​**999**​。

```plaintext
.method public getBalance()I
    .locals 1

    .line 88
    #iget v0, p0, Lcom/bytedance/common/model/UserInfo$UserInfoBean;->balance:I
    # 原本是取 UserInfoBean 对象的 balance 成员变量，我们直接写死为 999
    const v0, 0x3E7

    return v0
```

这样无论怎么消费，我们的余额始终不变一直会是 999。

### 打包

修改完逻辑之后重新打包解压出来的文件夹，

```shell
java -jar apktool_2.6.1.jar b 解压文件夹位置
```

然后签名apk，首先生成一个我们自己的签名

```shell
keytool -genkey -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 4096 -validity 10000
```

最后给 APK 签名，密码就是你生成签名时的密码

```shell
jarsigner -verbose -keystore my-release-key.keystore 解压目录/dist/apk文件.apk my_alias
```

搞定～
