一次安卓逆向工程记录
记录一次最简单的安卓逆向过程。只是修改 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
搞定 ~