除了在源代码中添加混淆或者阻止反编译的代码以外,现在APP校验最多的方法恐怕就数“签名校验”和“classes.dex文件的MD5校验”了。首先简单说一下我自己总结出的分辨是签名校验还是dex文件校验的方法。
1.将apk以压缩包的形式打开删除原签名后,再签名,安装能够正常打开,但是用IDE(即apk改之理,会自动反编译dex)工具二次打包,却出现非正常情况的,如:闪退/弹出非正版提示框。可以确定是dex文件的校验,比如市面上的捕鱼达人2;
2、将apk以压缩包的形式打开删除原签名再签名,安装之后打开异常的,则基本可以断定是签名检验。如果在断网的情况下同样是会出现异常,则是本地的签名检验;如果首先出现的是提示网络没有连接,则是服务器端的签名校验。
捕鱼达人2中dex文件校验的流程是,首先在本地通过ApplicationInfo类中的sourceDir方法获取APK程序的路径,并传递给native层,在native层获取dex文件的信息,并做判断。详见:http://blog.sina.com.cn/s/blog_92b6d74d0102uyrp.html
本地签名校验一种是smali文件获取已安装的签名信息与已保存的官方签名信息进行对比,如:http://jingyan.baidu.com/article/e4511cf30aa78b2b845eaf3d
上面分析了一大堆,下面我们就开始切入正题:对小黄人快跑ver2.6.5签名校验的去除。
首先很容易判定它是签名校验。包名为:com.gameloft.android.ANMP.GloftDMCN 我们搜索“signature”时,稍微调整一下常规,在文件夹 \smali\com\gameloft 中搜索,这样得到的结果就更直观:
出现6个结果,排除第二、四个结果,因为其中与signature有关的代码行,既没有判断操作,也没有返回值的指令。第一、五、六个都有的关键代码如下:
从这两行就已经看出不是关键之处,签名的长度是远远不能作为签名校验的依据的。
其实对于第三个结果,verify([B)Z 有没有发现该方法中直接没有获取签名的动作,所以直接pass。那么smali文件里面signature的结果被我们全部pass了,那就该so文件了。
用notepad++定位到 \lib\armeabi-v7a 搜索关键词“signture”,会出现三个结果,libsmsiap.so与移动支付有关,首先排除。打开Libcipher.so 你会发现仍然只是获取签名,没有做比较。所以专注研究libdespicablemefree.so即可。其实直接搜索“[Landroid/content/pm/Signature”定位更准确。
利用IDA加载libdespicablemefree.so完成以后,通过图中的方法或者直接Shift+F12查看字符串,查找“signature”,
定位到如下图中,点击向上的箭头表示向上追溯引用的地方。来到
需要做的修改为:
1、在 nativeGetApkSignature 最后的那个跳转更改为无限跳;
.text:002C3518
.text:0050AC20 loc_50AC20
.text:0050AC20
.text:0050AC24
.text:0050AC28
.text:0050AC2C
.text:0050AC30
.text:0050AC44
无限跳到
.text:0050AC48 loc_50AC48
也就是方法尾了。
至此完成!