目前几种常用的反编译工具如ApkIDE、APKDB、Androidkiller及较早版本的ApkToolBox 等反编译某些安卓热门apk会被一些安全软件检测含有木马或恶意程序,产生误判误报。
原因是一些手机上的安全软件如360等会将这些安卓热门apk的非官方签名列入了与安卓APK文件名一一对应黑名单,解决办法就是重新生成新的证书文件testkey.x509.pem和密钥文件testkey.pk8,替换掉那些反编译工具上被一些安全软件列入黑名单的证书文件testkey.x509.pem和密钥文件testkey.pk8,再重新对安卓APK反编译后签名即可。
需要jdk或jre支持,官方下载地址: https://www.oracle.com/technetwork/java/javase/downloads/
环境变量JAVA_HOME,要指向jdk或jre目录,若电脑上环境变量没有JAVA_HOME路径,可在电脑上设置本机环境变量JAVA_HOME路径
Windows 64位系统安装*****-windows-x64为64位的jdk或jre以及Windows 32位系统安装*****-windows-i586为32位的jdk或jre的Java路径为 C:\Program Files\Java\ 如:
C:\Program Files\Java\jdk1.7.0_80 64位系统安装 jdk-7u80-windows-x64 32位系统安装 jdk-7u80-windows-i586 C:\Program Files\Java\jre7 64位系统安装 jdk-7u80-windows-x64
C:\Program Files\Java\jdk1.8.0_192 64位系统安装 jdk-8u192-windows-x64 32位系统安装 jdk-8u192-windows-i586 C:\Program Files\Java\jre1.8.0_192 64位系统安装 jdk-8u192-windows-x64
C:\Program Files\Java\jre1.7.0_80 64位系统安装 jre-7u80-windows-x64 32位系统安装 jre-7u80-windows-i586 C:\Program Files\Java\jre1.8.0_161 64位系统安装 jre-8u161-windows-x64 32位系统安装 jre-8u161-windows-i586
Windows 64 位系统安装*****-windows-i586为32位的jdk或jre的Java路径为 C:\Program Files (x86)\Java\ 如:
C:\Program Files (x86)\Java\jdk1.7.0_80 64位系统安装 jdk-7u80-windows-i586 C:\Program Files (x86)\Java\jdk1.8.0_192 64位系统安装 jdk-8u192-windows-i586 C:\Program Files (x86)\Java\jre1.7.0_80 64位系统安装 jre-7u80-windows-i586 C:\Program Files (x86)\Java\jre1.8.0_161 64位系统安装 jre-8u161-windows-i586
在电脑上可按以下方法设置环境变量:JAVA_HOME、PATH
JAVA_HOME:我的电脑(计算机)->属性->高级(高级系统设置)->单击“环境变量”按钮 ->单击“系统变量”区域的“新建”按钮->在“变量名”文本框中输入JAVA_HOME 在“变量值”文本框中输入JDK的安装路径(如:C:\Program Files\Java\jdk1.7.0_80),单击确定
PATH: 在系统变量中查看PATH变量,如果存在PATH,则在最末尾多添加一个%JAVA_HOME%\bin;(直接添加,连;也加上,无需加空格之类的,以下相同) 如果不存在,则新建变量PATH,设定变量值为:%JAVA_HOME%\bin;
具体过程如下:
一、生成*****.keystorede如bug.keystore证书密钥文件
1、在附件中以管理员权限运行“命令提示符”,打开dos界面,根据电脑上安装的jdk位数
Windows 64位系统安装*****-windows-x64为64位的jdk以及Windows 32位系统安装*****-windows-i586为32位的jdk 输入以下代码 cd C:\Program Files\Java\jdk*\bin Windows 64 位系统安装*****-windows-i586为32位的jdk 输入以下代码 cd C:\Program Files (x86)\Java\jdk*\bin 切换到jdk的bin目录:C:\Program Files\Java\jdk*\bin 或 C:\Program Files (x86)\Java\jdk*\bin
在dos窗口输入:keytool -genkey -alias androiddebugkey -keyalg RSA -validity 36500 -keysize 2048 -keystore debug.keystore -keypass android -storepass android
出现问题并填写 您的名字与姓氏是什么? [Unknown]: localhost 您的组织单位名称是什么? [Unknown]: test 您的组织名称是什么? [Unknown]: test 您所在的城市或区域名称是什么? [Unknown]: test 您所在的省/市/自治区名称是什么? [Unknown]: test 该单位的双字母国家/地区代码是什么? [Unknown]: test CN=localhost, OU=test, O=test, L=test, STtest, C=test 是否正确? [否]: y
填写相关信息后会在Java的bin目录下生成密钥文件 debug.keystore 就是我们需要的安卓Android签名密钥文件,(-validity 36500 表示证书的有效天数为36500天)
其中: KeystoreFile密钥文件名为 debug.keystore -alias密钥别名为 androiddebugkey -storepass密钥密码为 android -keypass android 表示密钥密码keypassPassword为 android 密钥文件名debug.keystore、密钥别名 androiddebugkey、 密钥storepass和keypassPassword密码 android 都可根据自己的需要设定
就能得到.jks格式 .keystore证书密钥文件debug.keystore,可用apksigner或jarsigner两种签名代码之一给反编译后的安卓APK文件签名就不会报毒了。
如果要用signapk方式签名给反编译后的安卓APK文件签名就需要将.jks格式 .keystore证书密钥文件debug.keystore转换成testkey.x509.pem证书文件+testkey.pk8密钥文件
二、jks格式 .keystore证书密钥文件debug.keystore转换成testkey.x509.pem证书文件+testkey.pk8密钥文件的方法
转换签名文件需要OpenSSL环境支持
Openssl第三方下载地址: http:///products/Win32OpenSSL.html
根据OpenSSL的版本和安装路径添加OpenSSL环境变量,如安装 Win64OpenSSL 则
在计算机->属性->高级系统配置->高级->环境变量 编辑系统变量 变量名: PATH 在变量值中加入: C:\Program Files\OpenSSL-Win64\bin; 完成以上步骤后,开始验证是否设置正确 运行cmd(开始,运行,输入cmd,回车),或点击“附件”中的“命令提示符”, 输入 openssl 回车出现 openssl>
或输入start openssl 弹出dos窗口 openssl>
就表明OpenSSL环境变量配置正确 或下载安装Win32OpenSSL 或 Win64OpenSSL后,将OpenSSL-Win32或OpenSSL-Win64文件夹bin目录中的所有文件复制到java下如jdk1.*.0_*的bin目录中
然后将.jks格式 .keystore证书密钥文件debug.keystore复制到java的bin目录中 如: C:\Program Files\Java\jdk1.8.0_192\bin C:\Program Files\Java\jdk1.7.0_80\bin
方法一:
在附件中以管理员身份运行运行“命令提示符”,打开dos界面,输入以下命令,如 cd C:\Program Files\Java\jdk1.8.0_192\bin cd C:\Program Files\Java\jdk1.7.0_80\bin
1. 将keystore文件转换为pkcs12格式
keytool -importkeystore -srckeystore debug.keystore -destkeystore testkey.p12 -srcstoretype JKS -deststoretype PKCS12
按提示在dos窗口 输入目标密钥库口令 如:android 再次输入新口令 如:android 输入源密钥库口令 如:android 目标密钥库口令一定要设置并且和源密钥库口令一样,如:android
或 keytool -importkeystore -srckeystore debug.keystore -srcstoretype JKS -srcalias androiddebugkey -srcstorepass android -srckeypass android -destkeystore testkey.p12 -deststoretype PKCS12 -destalias testkey -deststorepass android -destkeypass android
2. 将PKCS12 dump成pem
openssl pkcs12 -in testkey.p12 -nodes -out testkey.rsa.pem
按提示在dos窗口 Enter Import Password: 如:android
testkey.rsa.pem 可以直接用文本格式查看
用“记事本”打开 testkey.rsa.pem 文件,可查看其中的证书(CERTIFICATE)和 私钥(PRIVATE KEY ),可能有RSA KEY 这个不用管,如下所示
Bag Attributes friendlyName: testkey localKeyID: 54 69 6D 65 20 31 35 34 37 37 33 30 35 37 36 33 31 39 Key Attributes: <No Attributes> -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfp3ZTr57zhvQW wvmmB1dGleMHq+Kg67SCx1Yy7Bf95Dz8Tipt2FzEdfEEkQvDcXhpkVqgc95Q/7eu 5mGh61LY7V8qzTU7sBc4Yy9xMIjraL8Jd7fGSEH5n6iZe6O9UJTNfGTdIzYrHaGx XCl5S9G1t8Qbsziherzacm7hURjZpPK0wqre0ONjTJIPNicU287WUjb4GW159S7e BVSmi8IJHxk9TPLH1Dz5GqOvgU84x4JPZ/ikwiKXAoGANP7EYVnig81kQtqjRdaQ /f5Y6UGqURGw8hGDDTssXAuVAyb4bDokH4DSrEvdprO6TuFqFIeDn56V6hvXhWSH +Fguhg2r4mzX8LQsJmKozcsUY+DrY/eP+1b+nU+uOzSCwanEGyrESRYVCznH3kYY CTnpBXQscLijgmac/rPhGiM= -----END PRIVATE KEY----- Bag Attributes friendlyName: testkey localKeyID: 54 69 6D 65 20 31 35 34 37 37 33 30 35 37 36 33 31 39 subject=C = Test, ST = Test, L = Test, O = Test, OU = Test, CN = Doublemine
issuer=C = Test, ST = Test, L = Test, O = Test, OU = Test, CN = Doublemine
-----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIEP5A+yjANBgkqhkiG9w0BAQsFADBgMQ0wCwYDVQQGEwRU ZXN0MQ0wCwYDVQQIEwRUZXN0MQ0wCwYDVQQHEwRUZXN0MQ0wCwYDVQQKEwRUZXN0 MQ0wCwYDVQQLEwRUZXN0MRMwEQYDVQQDEwpEb3VibGVtaW5lMCAXDTE5MDExMDIz LE70Z9yAszLB3HNI7VSEea7WY5KBKUHLZlA2y/8idL4hqqPeKOJ/+/82NBHBlByn Wrf1j0dvIk3FAMs7mLoYoRZVddKkK09OEEdotmXbXklmA+pXuaUxzBgs9NoDoUi4 8vF/rlqqx+3zEJDXehKq703BIJ0SxAY/RglGfUgmE5qFk/q0ZsuS/hAO1K8BhpiZ AKsjk5A= -----END CERTIFICATE-----
复制从“BEGIN CERTIFICATE”到“END CERTIFICATE”含有证书信息的文本内容后,新建文本文档,保存为 testkey.x509.pem 或将从“BEGIN CERTIFICATE”到“END CERTIFICATE”含有证书信息的文本内容保留后,另存为 testkey.x509.pem 如下所示
-----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIEP5A+yjANBgkqhkiG9w0BAQsFADBgMQ0wCwYDVQQGEwRU ZXN0MQ0wCwYDVQQIEwRUZXN0MQ0wCwYDVQQHEwRUZXN0MQ0wCwYDVQQKEwRUZXN0 MQ0wCwYDVQQLEwRUZXN0MRMwEQYDVQQDEwpEb3VibGVtaW5lMCAXDTE5MDExMDIz Wrf1j0dvIk3FAMs7mLoYoRZVddKkK09OEEdotmXbXklmA+pXuaUxzBgs9NoDoUi4 8vF/rlqqx+3zEJDXehKq703BIJ0SxAY/RglGfUgmE5qFk/q0ZsuS/hAO1K8BhpiZ AKsjk5A= -----END CERTIFICATE-----
testkey.x509.pem 文件即是我们最后需要的证书文件
复制从“BEGIN RSA PRIVATE KEY”到“END RSA PRIVATE KEY”含有私钥信息的文本内容后,新建文本文档,保存为 testkey.pem 或将从“BEGIN RSA PRIVATE KEY”到“END RSA PRIVATE KEY”含有私钥信息的文本内容保留后,另存为 testkey.pem 如下所示
-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfp3ZTr57zhvQW wvmmB1dGleMHq+Kg67SCx1Yy7Bf95Dz8Tipt2FzEdfEEkQvDcXhpkVqgc95Q/7eu 5mGh61LY7V8qzTU7sBc4Yy9xMIjraL8Jd7fGSEH5n6iZe6O9UJTNfGTdIzYrHaGx BVSmi8IJHxk9TPLH1Dz5GqOvgU84x4JPZ/ikwiKXAoGANP7EYVnig81kQtqjRdaQ /f5Y6UGqURGw8hGDDTssXAuVAyb4bDokH4DSrEvdprO6TuFqFIeDn56V6hvXhWSH +Fguhg2r4mzX8LQsJmKozcsUY+DrY/eP+1b+nU+uOzSCwanEGyrESRYVCznH3kYY CTnpBXQscLijgmac/rPhGiM= -----END PRIVATE KEY-----
3. 生成pk8格式的私钥
openssl pkcs8 -topk8 -outform DER -in testkey.pem -inform PEM -out testkey.pk8 -nocrypt 或 openssl pkcs8 -topk8 -in testkey.pem -inform PEM -passin pass:android -out testkey.pk8 -outform DER -nocrypt
即可生成testkey.pk8 私钥文件,然后将先前制作的证书文件证书文件testkey.x509.pem和密钥文件testkey.pk8复制保存下来给apk签名: java -jar signapk.jar testkey.x509.pem testkey.pk8 unsigned.apk signed.apk
方法二:
在附件中以管理员身份运行运行“命令提示符”,打开dos界面,输入以下命令,如 cd C:\Program Files\Java\jdk1.8.0_192\bin cd C:\Program Files\Java\jdk1.7.0_80\bin
1. 把.jks转换为pkcs12标准的证书+私钥文件
keytool -importkeystore -srckeystore debug.keystore -srcstoretype JKS -srcalias androiddebugkey -srcstorepass android -srckeypass android -destkeystore testkey.p12 -deststoretype PKCS12 -destalias testkey -deststorepass android -destkeypass android
因为pkcs12不支持keypass 所以-destkeypass如果单独设置密码的话 keytool会提示你 这个密码不起作用 但是如果你不设置密码的话 后面导出key的时候会报错 所以这里必须要设置destkeypass 并且和deststorepass设置的一样
或 keytool -importkeystore -srckeystore debug.keystore -destkeystore testkey.p12 -srcstoretype JKS -deststoretype PKCS12
按提示在dos窗口 输入目标密钥库口令 如:android 再次输入新口令 如:android 输入源密钥库口令 如:android 目标密钥库口令一定要设置并且和源密钥库口令一样,如:android
2. 从生成的pkcs12标准的证书+私钥文件testkey.p12中,先提取得到含有证书信息的.x509.pem证书文件
openssl pkcs12 -nokeys -in testkey.p12 -passin pass:android -out testkey.x509.pem -passout pass:android -nokeys,就是指不要私钥key信息,只要证书cert信息,直接导出含有证书信息的.pem文件,即为.x509.pem 证书文件
3. 把私钥key信息提取出来,不过提取出来含有私钥key信息的.pem文件是pkcs12标准的
openssl pkcs12 -nocerts -in testkey.p12 -passin pass:android -out testkey.pem -passout pass:android -nocerts,就是指不要证书cert信息,只要私钥key信息,直接导出含有私钥信息pkcs12标准的.pem文件
4. 把之前的pkcs12标准的私钥.pem文件,转换为pkcs8标准,就得到.pk8私钥文件
openssl pkcs8 -topk8 -in testkey.pem -inform PEM -passin pass:android -out testkey.pk8 -outform DER -nocrypt 或 openssl pkcs8 -topk8 -outform DER -in testkey.pem -inform PEM -out testkey.pk8 -nocrypt
即可生成testkey.pk8 私钥文件,然后将先前制作的证书文件证书文件testkey.x509.pem和密钥文件testkey.pk8复制保存下来给apk签名: java -jar signapk.jar testkey.x509.pem testkey.pk8 unsigned.apk signed.apk
两钟方法不同之处是将pkcs12格式的.p12证书密钥文件转换成含证书信息和密钥信息的.pem文件时
方法一未在openssl命令参数中添加拆分命令,一次性将证书和密钥信息转换在同一个.pem文件中 需要通过“记事本”等将含证书信息和私钥信息文本信息的一个.pem文件拆分成两个单独的证书信息.pem文件和私钥信息.pem文件
方法二则在openssl命令参数中,添加了拆分命令:-nokeys(不要私钥key信息,只要证书cert信息)、-nocerts(不要证书cert信息,只要私钥key信息) 分两次将证书信息和密钥信息转换成两个单独的证书信息.pem文件和私钥信息的.pem文件 无需再通过“记事本”等对已经是单独的证书信息.pem文件和私钥信息.pem文件进行拆分
方法三、利用SSL在线工具转换
SSL在线工具-在线证书格式转换|证书在线合并|p12、pfx、jks证书在线合成解析: http://www./jks_pkcs12.html
1. 打开SSL在线工具网站,将JKS格式的 debug.keystore证书密钥文件“点击上传或拖拽到此处” 选择“JKS”转成“PEM” 在右边2个框中,分别输入私钥密码KEY,如 android (KEY,若私钥加密对其进行解密),也可不输入这个私钥密码KEY , 和JKS密码,如 android
结果,就能得到如
私钥
-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA36d2U6+e84b0FsL5pgdXRpXjB6vioOu0gsdWMuwX/eQ8/E4q bdhcxHXxBJELw3F4aZFaoHPeUP+3ruZhoetS2O1fKs01O7AXOGMvcTCI62i/CXe3 xkhB+Z+omXujvVCUzXxk3SM2Kx2hsbFUEp7EkL6s/D7U2YodPVXWqdAMoREcAjrb pMIilwKBgDT+xGFZ4oPNZELao0XWkP3+WOlBqlERsPIRgw07LFwLlQMm+Gw6JB+A 0qxL3aazuk7hahSHg5+eleob14Vkh/hYLoYNq+Js1/C0LCZiqM3LFGPg62P3j/tW /p1Prjs0gsGpxBsqxEkWFQs5x95GGAk56QV0LHC4o4JmnP6z4Roj -----END RSA PRIVATE KEY-----
证书
-----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIEP5A+yjANBgkqhkiG9w0BAQsFADBgMQ0wCwYDVQQGEwRU ZXN0MQ0wCwYDVQQIEwRUZXN0MQ0wCwYDVQQHEwRUZXN0MQ0wCwYDVQQKEwRUZXN0 MQ0wCwYDVQQLEwRUZXN0MRMwEQYDVQQDEwpEb3VibGVtaW5lMCAXDTE5MDExMDIz Wrf1j0dvIk3FAMs7mLoYoRZVddKkK09OEEdotmXbXklmA+pXuaUxzBgs9NoDoUi4 8vF/rlqqx+3zEJDXehKq703BIJ0SxAY/RglGfUgmE5qFk/q0ZsuS/hAO1K8BhpiZ AKsjk5A= -----END CERTIFICATE-----
2.分别将含有证书信息和私钥信息的文本内容复制到新建的2个文本文档中,重命名为含有证书信息的 ***.x509.pem文件和含私钥信息的***.pem文件 如证书文件testkey.x509.pem 和 私钥文件testkey.pem
3. 把含私钥信息testkey.pem文件转换成.pk8格式私钥文件
在附件中以管理员身份运行运行“命令提示符”,打开dos界面,输入以下命令,如 cd C:\Program Files\Java\jdk1.8.0_192\bin cd C:\Program Files\Java\jdk1.7.0_80\bin
openssl pkcs8 -topk8 -outform DER -in testkey.pem -inform PEM -out testkey.pk8 -nocrypt 或 openssl pkcs8 -topk8 -in testkey.pem -inform PEM -passin pass:android -out testkey.pk8 -outform DER -nocrypt
即可生成testkey.pk8 私钥文件,然后将先前制作的证书文件证书文件testkey.x509.pem和密钥文件testkey.pk8复制保存下来给apk签名: java -jar signapk.jar testkey.x509.pem testkey.pk8 unsigned.apk signed.apk
最后用上述三种方法之一得到的证书文件testkey.x509.pem 和私钥文件testkey.pem 替换掉反编译工具上被一些安全软件列入黑名单的证书文件testkey.x509.pem和密钥文件testkey.pk8,再重新对安卓APK反编译后签名就不会被安全软件报毒了。
|