author:: 奶爸 source:: 一次安卓逆向工程记录 | 终身学习 clipped:: 2022-09-14 published::

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

准备工具

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

逆向过程

解包

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

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

定位

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

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

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

.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。

打包

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

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

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

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

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

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

搞定~