快乐生活 2013-10-14
0x01 昨天写了反编译,今天就写下签名的问题
0x02 apktool的重打包功能大家都知道,堪称神器,各类破解人事必备之良器,
用法不多说,只说签名容易遇到的问题
0x03 创建私钥仓库这个事情就不多说,方法很多,eclipse和keytool 都有类似功能
需要注意的是,这个私钥仓库一共有两个密码,一个是私钥仓库的密码(storepass),另一个则是仓库里面每一个私钥对应一个密码(keypass),都是需要记住的。一个私钥仓库可以有多个私钥。
换句话说每个私钥仓库创建的时候,这几个参数是要记录的
-storepass 123456789 私钥仓库的密码
-keypass 1987XXXX 私钥的密码
-keystore F:\\webattack\android\AndroidMasterKey_icefish.key 私钥仓库文件在哪
icefish 私钥的名称
0x04 下来就是签名的东西了,jarsigner
用法 jarsigner -help可以看到。
这里面比较关键的几个参数
-storepass -keypass -keystore 上面的都说了,
-verbose 输出详细信息
特别注意的是 -signedjar 这个参数,他一共有三个选项,第一个是签名后的apk文件名,第二个选项是需要签名的apk路径,第三个很关键,就是前面提到的私钥的名称了。
一个常见的如下所示
jarsigner -verbose -keystore F:\\webattack\android\AndroidMaster Key_icefish.key -storepass 123456789 -keypass 1987XXXX -signedjar Modify_signed. apk F:\\webattack\android\result\ModifyCompile\Modify.apk icefish
0x05 在实际使用中,我们成功打包,成功签名,然后Android机子上一装,报错:
10-14 07:06:50.223: W/PackageParser(61): java.lang.SecurityException: META-INF/ICEFISH_.SF has invalid digest for res/menu/main.xml in /data/app/vmdl-2089432299.tmp
甚至没有改动任何代码的直接签名都报这个错。
原因如下:
实质就是jdk7改变了jarsigner的默认选项,不再是SHA 128了,而是变成了SHA256,
这样Android 模拟器就验证不对了
解决办法就是再jarsigner的调用中在强制设置摘要算法
-digestalg SHA1 -sigalg MD5withRSA
这样就可以了。
adb shell cd system/app rm *.apk21. 获取管理员权限: adb root22. 启动Activity: adb shell am start -n 包名/包名+类名。