🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
APP 要求我们输入正确的密码后才能看美女,可惜我们不知道密码,点击确定后它提示了“密码错误!!”,我们就从这个提示入手。 ![](https://box.kancloud.cn/5db6f098ceb6d2322f7e4e7e5dc47e0d_540x960.png =270x) 通过前面的修改,我们知道字符串“密码错误!!”在 arsc 文件中,去 arsc 文件中搜一下,复制资源 ID。 ![](https://box.kancloud.cn/e950493faeed73a7369aba96a82d8313_540x960.png =270x) 然后用 Dex编辑器++ 打开 dex 文件,以十六进制整数搜索刚刚复制的 ID。 ![](https://box.kancloud.cn/d8ef832b05112ec83eb641099ab49262_540x960.png =270x) 进入 MainActivity,菜单中选择**转成 Java **。 ![](https://box.kancloud.cn/026d7210d39675b6dca52e9a245b6aac_540x960.png =270x) 在 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 代码中,搜索资源 ID,定位到 139 行。 ![](https://box.kancloud.cn/edbf3cdd20a4832da38fdb32d02503ab_540x960.png =270x) 可以看到 138 行是一个位置标签 :cond_43,由于我们搜索的资源 ID 代表的是密码错误,所以当密码错误时,它才会跳转到这里,于是我们往上找 :cond_43,看它是从哪里跳过来的。 我们可以在 126 行看到: ``` if-ne v0, v1, :cond_43 ``` 它表示如果 v0 不等于 v1 就跳转到提示密码错误的代码,否则继续往下执行。也就是说,v0 不等于 v1 时,密码错误;v0 等于 v1 时,密码正确。所以我们把代码改成: ``` if-eq v0, v1, :cond_43 ``` 这样当我们输入错误的密码时,它反而会判断成密码正确了。 为了验证我们修改的正确性,再次点击菜单中的**转成 Java **,此时显示的仍是上次的反编译结果,需要点击菜单中的**重新加载**再次进行反编译。你会看到 41 行原本的 == 变成 != 了,修改结果和我们预期的一样。 ![](https://box.kancloud.cn/e280ffd61569a960b5d63095c9f478fb_540x960.png =270x) 最后我们保存代码并编译 dex,退出 Dex 编辑器++,更新完后重新签名安装,打开 APP 随便输入密码点击确定,就可以看到美女啦!