APP 要求我们输入正确的密码后才能看美女,可惜我们不知道密码,点击确定后它提示了“密码错误!!”,我们就从这个提示入手。
通过前面的修改,我们知道字符串“密码错误!!”在 arsc 文件中,去 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 代码中,搜索资源 ID,定位到 139 行。
可以看到 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 行原本的 == 变成 != 了,修改结果和我们预期的一样。
最后我们保存代码并编译 dex,退出 Dex 编辑器++,更新完后重新签名安装,打开 APP 随便输入密码点击确定,就可以看到美女啦!