chapter2 如何分析android程序

98 阅读2分钟

一 目标

无论输入什么都可以注册成功

二 环境

由于每个android版本不一样,所以反编译的结果可能有一些差异,下面是我的环境及版本

image.png

apktool版本: 2.6.1

反编译:apktool d apk路径
重打包:apktool b 项目目录

提供编译好apk地址: 链接: pan.baidu.com/s/13dUXnpfK… 提取码: b9ck

为了重打包签名不用每次再输入复杂的命令,使用python做了简化,地址:

github.com/t0ruby/andr…

三 分析

在res/values目录下有两个重要的文件,一个是strings.xml,另外一个是public.xml,一般情况下将资源字符串都定义在strings.xml中,apk在编译后将在public.xml文件中生成对应的ID,如果代码引用到这些资源字符串,使用的就是这个ID,所以只要能定定位到,就能找到函数的调用位置。

源码层

image.png

在MainActivity.class有一个匿名内部类,Toast引用了strings.xml下的两个静态字符串

image.png

所以,在反编译出来的时候,我们只需要找到 unsuccessed 对应ID在哪里被使用,我们的目标是不管输入任何字符串,进去的都是 successed 逻辑。

对于 checkSN 里面的逻辑,可以不用很关心,只需要知道它返回的是一个true和false的结果

反编译

以下是我反编译的目录结构,每个版本反编译出来可能有些不一样

image.png

全局搜索 unsuccessed,看看有没有这个字符串

image.png

可以看到在public.xml中有对应的ID:0x7f0e0085,然后搜索这个ID在哪里被引用

image.png

发现在MainActivity$1.smali中被引用,直接定位到引用位置

image.png

可以看到是从access$200方法进来的,可以再次定位access$200是在哪里被调用的

image.png

发现在MainActivity.smali中也有一个对应的静态方法access$200,而这个方法体里面调用的就是checkSN函数。

再次回到MainActivity$1.smali文件,有个if-nez指令,如果这个指令为v0,进入的的是cond_0函数体,所以要修改的就是该位置,将if-nez改为if-eqz,简单说就是不能函数不能执行到ID:0x7f0e0085所在的代码,这样就可以完成了破解

注意:重打包之后,需要重新添加证书,apk才能重新运行