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

    爆破密码 - 图1

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

    爆破密码 - 图2

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

    爆破密码 - 图3

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

    爆破密码 - 图4

    在 Java 代码中再次搜索资源 ID,可以定位到上图中的关键代码。可以看到它是先计算我们输入的密码的 hashCode,判断它是否等于 0x075bcd15,是则启动一个 Activity,不是则弹出密码错误的提示。

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

    先补充下 smali 的条件跳转分支语法知识,其实网上一搜就有了。

      1. if-eq vA, vB, :cond_** 如果vA等于vB则跳转到:cond_**
      2. if-ne vA, vB, :cond_** 如果vA不等于vB则跳转到:cond_**
      3. if-lt vA, vB, :cond_** 如果vA小于vB则跳转到:cond_**
      4. if-ge vA, vB, :cond_** 如果vA大于等于vB则跳转到:cond_**
      5. if-gt vA, vB, :cond_** 如果vA大于vB则跳转到:cond_**
      6. if-le vA, vB, :cond_** 如果vA小于等于vB则跳转到:cond_**
      7. if-eqz vA, :cond_** 如果vA等于0则跳转到:cond_**
      8. if-nez vA, :cond_** 如果vA不等于0则跳转到:cond_**
      9. if-ltz vA, :cond_** 如果vA小于0则跳转到:cond_**
      10. if-gez vA, :cond_** 如果vA大于等于0则跳转到:cond_**
      11. if-gtz vA, :cond_** 如果vA大于0则跳转到:cond_**
      12. if-lez vA, :cond_** 如果vA小于等于0则跳转到:cond_**

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

    爆破密码 - 图5

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

    我们可以在 126 行看到:

      1. if-ne v0, v1, :cond_43

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

      1. if-eq v0, v1, :cond_43

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

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

    爆破密码 - 图6

    最后我们保存代码并编译 dex,退出 Dex 编辑器++,更新完后重新签名安装,打开 APP 随便输入密码点击确定,就可以看到美女啦!