一 目标
无论输入什么都可以注册成功
二 环境
由于每个android版本不一样,所以反编译的结果可能有一些差异,下面是我的环境及版本
apktool版本: 2.6.1
反编译:apktool d apk路径
重打包:apktool b 项目目录
提供编译好apk地址: 链接: pan.baidu.com/s/13dUXnpfK… 提取码: b9ck
为了重打包签名不用每次再输入复杂的命令,使用python做了简化,地址:
三 分析
在res/values目录下有两个重要的文件,一个是strings.xml,另外一个是public.xml,一般情况下将资源字符串都定义在strings.xml中,apk在编译后将在public.xml文件中生成对应的ID,如果代码引用到这些资源字符串,使用的就是这个ID,所以只要能定定位到,就能找到函数的调用位置。
源码层
在MainActivity.class有一个匿名内部类,Toast引用了strings.xml下的两个静态字符串
所以,在反编译出来的时候,我们只需要找到 unsuccessed 对应ID在哪里被使用,我们的目标是不管输入任何字符串,进去的都是 successed 逻辑。
对于 checkSN 里面的逻辑,可以不用很关心,只需要知道它返回的是一个true和false的结果
反编译
以下是我反编译的目录结构,每个版本反编译出来可能有些不一样
全局搜索 unsuccessed,看看有没有这个字符串
可以看到在public.xml中有对应的ID:0x7f0e0085,然后搜索这个ID在哪里被引用
发现在MainActivity$1.smali中被引用,直接定位到引用位置
可以看到是从access$200方法进来的,可以再次定位access$200是在哪里被调用的
发现在MainActivity.smali中也有一个对应的静态方法access$200,而这个方法体里面调用的就是checkSN函数。
再次回到MainActivity$1.smali文件,有个if-nez指令,如果这个指令为v0,进入的的是cond_0函数体,所以要修改的就是该位置,将if-nez改为if-eqz,简单说就是不能函数不能执行到ID:0x7f0e0085所在的代码,这样就可以完成了破解
注意:重打包之后,需要重新添加证书,apk才能重新运行