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

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

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

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

在 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 行。

可以看到 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 行原本的 == 变成 != 了,修改结果和我们预期的一样。

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