首页
社区
课程
招聘
[原创]APK反破解之二:Android APK 签名比对
发表于: 2011-7-20 22:42 54666

[原创]APK反破解之二:Android APK 签名比对

2011-7-20 22:42
54666

转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html

Android APK 签名比对

    发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制在Android应用和框架中有着十分重要的作用。

    例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证APK签名与Framework签名一致,等等。在《APK Crack》一文中,我们了解到,要破解一个APK,必然需要重新对APK进行签名。而这个签名,一般情况无法再与APK原先的签名保持一致。(除非APK原作者的私钥泄漏,那已经是另一个层次的软件安全问题了。)

    简单地说,签名机制标明了APK的发行机构。因此,站在软件安全的角度,我们就可以通过比对APK的签名情况,判断此APK是否由“官方”发行,而不是被破解篡改过重新签名打包的“盗版软件”。

Android签名机制

    为了说明APK签名比对对软件安全的有效性,我们有必要了解一下Android APK的签名机制。为了更易于大家理解,我们从Auto-Sign工具的一条批处理命令说起。

    在《APK Crack》一文中,我们了解到,要签名一个没有签名过的APK,可以使用一个叫作Auto-sign的工具。Auto-sign工具实际运行的是一个叫做Sign.bat的批处理命令。用文本编辑器打开这个批处理文件,我们可以发现,实现签名功能的命令主要是这一行命令:

java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
private static Manifest addDigestsToManifest(JarFile jar)
for (JarEntry entry: byName.values()) {
	String name = entry.getName();
	if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
  		!name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&
           	(stripPattern == null ||!stripPattern.matcher(name).matches())) {
                
		InputStream data = jar.getInputStream(entry);
                while ((num = data.read(buffer)) > 0) {
                    md.update(buffer, 0, num);
                }
                Attributes attr = null;
                if (input != null) attr = input.getAttributes(name);
                attr = attr != null ? new Attributes(attr) : new Attributes();
                attr.putValue("SHA1-Digest", base64.encode(md.digest()));
                output.getEntries().put(name, attr);
  	}
}
Manifest manifest = addDigestsToManifest(inputJar);
je = new JarEntry(JarFile.MANIFEST_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
manifest.write(outputJar);
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey);
je = new JarEntry(CERT_SF_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureFile(manifest,
new SignatureOutputStream(outputJar, signature));

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
2
好文章。
可以介绍一下openssl工具,挺好用的。
2011-7-21 22:49
0
雪    币: 488
活跃值: (185)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
3
谢谢!论坛里反应不热烈,我还以为大家对这个不感兴趣呢。
我的计划是先把反破解的主要思路的系列文章写完,每个分支展开要大家一起努力啊~~
2011-7-22 08:41
0
雪    币: 80
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
加油加油,楼上的和楼上的楼上,加下QQ呗,交流交流…………
2011-7-22 08:54
0
雪    币: 488
活跃值: (185)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
我好像加你了吧?你的签名不是“哥不曾寂寞,因为有寂寞陪着哥”么?...
2011-7-22 09:11
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
非常喜欢你写的帖子
感谢分享
2011-8-14 18:42
0
雪    币: 270
活跃值: (117)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
学习了,前几天看了zenix的去广告教程,签名没搞定
2011-9-7 09:53
0
雪    币: 73
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢楼主写的这些文章 讲的很清楚 受益匪浅
2011-9-19 21:09
0
雪    币: 546
活跃值: (1672)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
好帖没人呢顶,兄弟。我来**
2011-12-3 09:44
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好东西=.= 顶一个
2011-12-19 10:48
0
雪    币: 35
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错,挺好的,讲的简单易懂。
2015-8-13 18:15
0
游客
登录 | 注册 方可回帖
返回
//