刚刚加入新公司,领导让熟悉一些反编译相关的知识点,并在反编译后对文件做修改、打包,现在做一些记录。
一、apktool反编译和打包、签名
第一步:下载apktool.bar和apktool.jar,下载jar之后记得改下名字
第二步:将所在位置加入到环境变量中。
第三步:执行反编译命令apktool d test.apk
第四步:查看smali文件,并将自己生成的smali文件进行替换
这里的smali文件用到了android studio中的一个第三方插件java2smali 插件地址
https://github.com/ollide
这个插件可以将java文件转换为smali文件,不用我们自己写smali文件了。
第五步:执行打包命令 apktool b test,并在test文件夹下的dist目录下获取生成的apk。
第六步:因为现在的apk是没有签名的,所以执行签名,如果想要覆盖安装的话,必须和之前的签名一致,签名后安装运行
生成签名文件命令,按提示输入内容或者回车
keytool -genkeypair -alias test.keystore -keyalg RSA -validity 500000 -keystore test.keystore
- alias 别名
-validity 有效期签名命令
jarsigner -verbose -keystore test.keystore -signedjar test_signed.apk test.apk test.keystore
二、使用dex2jar反编译apk,并用jd-jui查看
下载地址
dex2jar下载地址:https://sourceforge.net/projects/dex2jar/
jd-jui下载地址:http://jd.benow.ca/
相关命令
dex转jar命令
d2j-dex2jar classes.dexjar转dex命令
d2j-jar2dex classes-jar2dex-dex2jar.jar
说明:
参考http://www.jianshu.com/p/eb766d2bb837中的步骤,我最后没能成功运行apk,在此仅做一下记录,方便日后查看。我的具体步骤如下:
第一步:解压apk,得到dex,并转为jar
第二步:修改目标java文件,并打包成新的apk,并按照第一步得到修改后的class文件。
第三步:将第二步得到的修改的class文件覆盖到第一步得到的jar包中。
第四步:将jar包转为dex,并覆盖到原始的apk文件中。
第五步:对apk重新签名安装,提示UNEXCEPT_EXCEPTION异常
其他:我发现第四步在将jar转为dex后,dex包明显比之前变小,不知道是不是这个原因造成的最后无法运行。
三、对METE-INF文件夹和keystore签名的简单理解。
METE-INF文件夹:用来记录apk的文件信息和文件的完整性、安全性。
MAINFEST.MF:摘要文件,程序会遍历Apk包中的所有文件,对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码,将结果写入文件当中。如果改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。
CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用keystore中的私钥进行加密。在安装时只能使用keystore的公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件
CERT.RSA:文件中保存了公钥、所采用的加密算法等信息。
说明:系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的。
结论:从上面的总结可以看出,META-INFO里面的说那个文件环环相扣,从而保证Android程序的安全性。(只是防止开发者的程序不被攻击者修改,如果开发者的keystore被他人获取,apk有可能被篡改)
其他:对于未经签名的apk,通过压缩软件解压后,在METE-INF文件夹下,会看到只有MAINFEST.MF清单文件,签名后,才会有CERT.RSA和CERT.SF文件。
SHA-1与MD5的比较
MD5:(message-digest algorithm 5)信息-摘要算法
SHA-1:(Secure HashAlgorithm) 安全哈希算法
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
1. 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位,SHA-1对强行攻击有更大的强度。
2. 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3. 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。