设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 6090|回复: 0

[软件] 转看雪:【原创】调试小技巧:绕过安卓apk安装时的签名验证 hook挂Xposed框架插件

[复制链接]
 成长值: 72

签到天数: 4518 天

[LV.Master]伴坛终老

发表于 2017/2/19 01:16 | 显示全部楼层 |阅读模式 |Google Chrome 56.0.2924.87|Windows 10
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
标 题: 【原创】调试小技巧:绕过apk安装时的签名验证
作 者: flankersky
时 间: 2014-08-06,18:27:06
链 接: http://bbs.pediy.com/showthread.php?t=190876

小菜第一次发帖,不知道这篇文章有没有意义,大家多多包涵,多多指点。本文所说的小技巧的作用只有一个,就是能让你重打包某些有签名验证的apk用于调试,除此之外,确实没什么用处,大牛们可以直接飘过了。

1、
      事情是这样的,最近在调试一个apk,有签名验证,验证方法是将签名信息发往服务器验证的,所以不能进行重打包。更变态的是,签名信息的获取是在.so里调用Java层的getPackageInfo实现的。
      最初的想法就是能hook住getPackageInfo,替换掉里面的签名信息。试过用xposed hook 函数getPackageInfo,但是没有成功,咨询过高人说是“动态加载的.so是没法hook住的”,所以这种方法就作罢了。还想过.so注入,定制rom等方法,但因自己都没有做过,就没有尝试。

2、
      其实自己一直有个想法,就是能不能把重打包之后的apk里的签名信息(RSA文件)换成原apk的签名信息,如果这样能安装成功的话,是不是就能突破这种签名验证了。
      在网上看到了一篇文章http://wendal.net/321.html,说通过修改services.jar能“移除apk的签名验证机制”,于是就试验了一下,把重打包过的apk里的CERT.RSA文件替换为原先apk里的CERT.RSA,然后按照作者的方法修改了services.odex(网上有对odex的修改方法),结果还是没有安装成功,但是直接修改odex的方法还是很不错的。错误的原因可能还是因为修改的函数不对引起的。于是,根据安装时报出来的错误INSTALL_PARSE_FAILED_NO_CERTIFICATES,还有Logcat里的堆栈信息,去源码里去找。最后定位到了出错的位置是在android4.0\libcore\luni\src\main\java\org\apache\harmony\security\utils\JarUtils.java中的verifySignature函数,在函数的最后:
代码:
if(!sig.verify(sigInfo.getEncryptedDigest())) {
               throw new SecurityException("Incorrect signature");
            }


抛出了个异常,罪魁祸首就是这个异常,函数的意思应该是验证CERT.RSA里的签名信息正确与否,所以这里应该直接跳过就OK了。
观察源码,最后这部分代码是编译到了core.jar里,也就是/system/framework/core.odex里。
将code.odex反编译出来,找到\core\org\apache\harmony\security\utils\JarUtils.smali,在verifySignature函数中找到下面的位置,添加上红色的那句话。

代码:
  invoke-virtual {v0, v1}, Ljava/security/Signature;->verify([B)Z
    move-result v27
    const v27, 0x1
    if-nez v27, :cond_186


最后,重新编译成odex,替换掉原先的core.odex。
再按上面说的,将重打包过的apk里的CERT.RSA替换为原先apk里的CERT.RSA。就可以正确安装,并且获取的签名信息还是原先的apk的签名信息,可以愉快的进行调试了。。。

PS:
      直接修改odex据说是有风险的,所以,大家小伙伴们修改之后要是开不了机,不要来找我。上面的测试只在NEXUS 4上测试通过。
另外,这只是自己想出来的方法,不知道大家都是用的什么方法,希望大家不吝赐教啊。

--------------------------------------
2014-08-07 14:10

多谢@SpaceDye 提醒,我怎么就没想到写个xposed插件呢。
代码就几行,但能达到上面修改code.odex的效果。代码就直接贴出来了。
代码:
   public void initZygote(StartupParam startupParam) throws Throwable {
      
               XposedHelpers.findAndHookMethod("java.security.Signature",null,"verify", byte[].class,new XC_MethodHook(){
             protected void afterHookedMethod(MethodHookParam param) throws Throwable {
               XposedBridge.log("disabled verifysignature......");
               param.setResult(Boolean.TRUE);
          }   
               });


Xposed框架插件下载地址:https://pan.baidu.com/s/1nv4UkFf

[发帖际遇]: 小樱 发帖时在路边捡到 3 樱币,偷偷放进了口袋. 幸运榜 / 衰神榜
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2024/5/18 12:21 , Processed in 0.263183 second(s), 25 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表