去除小黄人快跑ver2.6.5签名校验的过程

除了在源代码中添加混淆或者阻止反编译的代码以外,现在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.html;另一种是将获取签名以及比较的过程都在native层,比如今天的小黄人快跑ver2.6.5;
   服务器签名校验的则是在本地获取现安装包的签名信息,然后通过key值的形式发送给服务器端进行校验,通过返回的值True or fault,来判断是否验证通过。比如BT种子搜索器ver1.5.7:
http://blog.sina.com.cn/s/blog_92b6d74d0102uyoh.html

 

上面分析了一大堆,下面我们就开始切入正题:对小黄人快跑ver2.6.5签名校验的去除。

首先很容易判定它是签名校验。包名为:com.gameloft.android.ANMP.GloftDMCN 我们搜索“signature”时,稍微调整一下常规,在文件夹 \smali\com\gameloft 中搜索,这样得到的结果就更直观:

去除小黄人快跑ver2.6.5签名校验的过程

出现6个结果,排除第二、四个结果,因为其中与signature有关的代码行,既没有判断操作,也没有返回值的指令。第一、五、六个都有的关键代码如下:

 #读取签名信息v2
    iget-object v2, v2, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
    #将v2的长度存入v3
    array-length v3, v2

从这两行就已经看出不是关键之处,签名的长度是远远不能作为签名校验的依据的。
其实对于第三个结果,verify([B)Z 有没有发现该方法中直接没有获取签名的动作,所以直接pass。那么smali文件里面signature的结果被我们全部pass了,那就该so文件了。

 

用notepad++定位到 \lib\armeabi-v7a 搜索关键词“signture”,会出现三个结果,libsmsiap.so与移动支付有关,首先排除。打开Libcipher.so 你会发现仍然只是获取签名,没有做比较。所以专注研究libdespicablemefree.so即可。其实直接搜索“[Landroid/content/pm/Signature”定位更准确。

去除小黄人快跑ver2.6.5签名校验的过程

利用IDA加载libdespicablemefree.so完成以后,通过图中的方法或者直接Shift+F12查看字符串,查找“signature”,

去除小黄人快跑ver2.6.5签名校验的过程

定位到如下图中,点击向上的箭头表示向上追溯引用的地方。来到

 去除小黄人快跑ver2.6.5签名校验的过程

需要做的修改为:

1、在 nativeGetApkSignature 最后的那个跳转更改为无限跳;
.text:002C3518                 BEQ             loc_2C3550
      2、在结束程序 kill 的函数中 让他直接跳转到 下一个函数
.text:0050AC20 loc_50AC20                              ; CODE XREF: sub_50AB64+A4j
.text:0050AC20                 MOV             R0, #0      //改为无限跳到:loc_50AC34
.text:0050AC24                 BL              nativeExit
.text:0050AC28                 BL              getpid  ; 获取程序PID
.text:0050AC2C                 MOV             R1, #2  ; sig
.text:0050AC30                 BL              kill    ; 关闭操作
    3、还有无限跳就是绕过:
.text:0050AC44                 BL              __stack_chk_fail ; 比较失败
无限跳到
.text:0050AC48 loc_50AC48                              ; CODE XREF: sub_50AB64+DCj
也就是方法尾了。

至此完成!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值