首页
论坛
专栏
课程

[原创]调试小技巧:绕过apk安装时的签名验证

2014-8-6 18:27 54894

[原创]调试小技巧:绕过apk安装时的签名验证

2014-8-6 18:27
54894
小菜第一次发帖,不知道这篇文章有没有意义,大家多多包涵,多多指点。本文所说的小技巧的作用只有一个,就是能让你重打包某些有签名验证的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
   [COLOR="Red"] const v27, 0x1[/COLOR]
    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);
					}   
               });


[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

上传的附件:
最新回复 (23)
非洲大表哥 2014-8-6 21:56
2
0
屌,学习了!
appview 2014-8-6 22:49
3
0
最新在学习安迪,mark
SpaceDye 2014-8-7 09:14
4
0
可以写个Xposed插件,更为灵活,貌似现成的也有了。
忆海拾贝 2014-8-7 14:01
5
0
是有的,这个叫 DisableSignatrueCheck 的插件。话说,Xposed插件怎么开发。
flankersky 2014-8-7 14:16
6
0
已更新,多谢提醒。 另外,确实有个插件是叫DisableSignatrueCheck ,但他hook的是compareSignatures函数,应该是对重打包系统的应用是有用的(我没试,猜的)。
flankersky 2014-8-7 14:17
7
0
哈哈,共同学习。
pwelyn 2014-8-9 20:05
8
0
这个不错 支持一下
JoyFei 2 2014-8-10 11:51
9
0
mark,感谢分享,,,,=(:
JoyFei 2 2014-8-10 11:56
10
0
楼主把带有签名认证的apk,发出来吧.
OnlyEnd 2014-8-10 18:14
11
0
Xposed的确是个非常好非常方便的框架
yangningbo 2014-8-11 01:09
12
0
mark mark
华仔在吗 2014-8-12 11:33
13
0
mark,感谢分享啊
kaoyange 1 2014-8-12 16:27
14
0
厉害,下来慢慢研究
子弹在飞 2014-8-13 10:53
15
0
最近也遇到类似问题,首先拜谢!请问楼主在调试哪款app遇到此问题的呢?
淡然出尘 2014-8-14 12:02
16
0
看了帖子有一个疑问:为什么有签名验证就不能重新打包尼..顶多就是不能正常打开软件啊
flankersky 2014-8-14 12:13
17
0
那是我说错了。可以打包。只不过不能正常运行。
tastypear 2014-8-14 23:37
18
0
装个幸运破解器,里面有个功能叫“核心破解”
biyetianya 2014-8-30 17:44
19
0
支持一下,
lsniagaraI 2014-9-30 13:59
20
0
mark
ygtat 2017-4-25 11:52
21
0
mark
pzz 2017-10-12 17:34
22
0
谢谢,学习了
Simol彡 2018-1-3 13:30
23
0
天天逛论坛,总觉得大家起点真高!一口一个小白小菜。学习四天的我貌似完全看不懂!那我是巨白?
tianzying 2018-1-10 08:19
24
0
mark
游客
登录 | 注册 方可回帖
返回