# 破解密码

APP 要求我们输入正确的密码后才能看美女,可惜我们不知道密码,点击确定后它提示了 密码错误!!,我们就从这个提示入手。

alt

通过前面的修改,我们知道字符串 密码错误!! 在 arsc 文件中,我们去找一下并复制资源 ID:

alt

然后用 Dex编辑器++ 打开 dex 文件,以十六进制整数搜索刚刚复制的 ID:

alt

进入 MainActivity,菜单中选择转成 Java

alt

在 Java 代码中再次搜索资源 ID,可以定位到上图中的关键代码。

可以看到它是先计算我们输入的密码的 hashCode,判断它是否等于 0x075bcd15,是则启动一个 Activity,不是则弹出密码错误的提示。

由于不好算出哪个字符串的 hashCode 是 0x075bcd15,所以我们直接改判断,把等于改成不等于就行了。

先补充下 smali 的条件跳转分支语法知识:

if-eq vA, vB, :cond_**  如果vA等于vB则跳转到:cond_**
if-ne vA, vB, :cond_**  如果vA不等于vB则跳转到:cond_**
if-lt vA, vB, :cond_**  如果vA小于vB则跳转到:cond_**
if-ge vA, vB, :cond_**  如果vA大于等于vB则跳转到:cond_**
if-gt vA, vB, :cond_**  如果vA大于vB则跳转到:cond_**
if-le vA, vB, :cond_**  如果vA小于等于vB则跳转到:cond_**
if-eqz vA, :cond_**  如果vA等于0则跳转到:cond_**
if-nez vA, :cond_**  如果vA不等于0则跳转到:cond_**
if-ltz vA, :cond_**  如果vA小于0则跳转到:cond_**
if-gez vA, :cond_**  如果vA大于等于0则跳转到:cond_**
if-gtz vA, :cond_**  如果vA大于0则跳转到:cond_**
if-lez vA, :cond_**  如果vA小于等于0则跳转到:cond_**

如果忘记了这些指令,可以在 Smali 代码编辑界面点击右上角菜单 指令查询 随时查阅。

我们回到 smali 代码中,搜索资源 ID,定位到 151 行。

alt

可以看到 150 行是一个位置标签 :cond_49,由于我们搜索的资源 ID 代表的是密码错误,所以当密码错误时,它才会跳转到这里,于是我们往上找 :cond_49,看它是从哪里跳过来的。

我们可以在 132 行看到:

if-ne p0, v1, :cond_49

它表示如果 v0 不等于 v1 就跳转到提示密码错误的代码,否则继续往下执行。也就是说,v0 不等于 v1 时,密码错误;v0 等于 v1 时,密码正确。所以我们把代码改成:

if-eq p0, v1, :cond_49

这样当我们输入错误的密码时,它反而会判断成密码正确了。

为了验证我们修改的正确性,再次点击菜单中的转成 Java ,此时显示的仍是上次的反编译结果,需要点击菜单中的重新加载再次进行反编译。你会看到 35 行原本的 == 变成 != 了,修改结果和我们预期的一样。

alt

最后我们保存代码并编译 dex,更新 apk 文件并安装,打开 APP 随便输入密码点击确定,就可以看到美女啦!