目前幾種常用的反編譯工具如ApkIDE、APKDB、Androidkiller及較早版本的ApkToolBox 等反編譯某些安卓熱門apk會被一些安全軟件檢測含有木馬或惡意程序,產(chǎn)生誤判誤報。
原因是一些手機(jī)上的安全軟件如360等會將這些安卓熱門apk的非官方簽名列入了與安卓APK文件名一一對應(yīng)黑名單,解決辦法就是重新生成新的證書文件testkey.x509.pem和密鑰文件testkey.pk8,替換掉那些反編譯工具上被一些安全軟件列入黑名單的證書文件testkey.x509.pem和密鑰文件testkey.pk8,再重新對安卓APK反編譯后簽名即可。
需要jdk或jre支持,官方下載地址: https://www.oracle.com/technetwork/java/javase/downloads/
環(huán)境變量JAVA_HOME,要指向jdk或jre目錄,若電腦上環(huán)境變量沒有JAVA_HOME路徑,可在電腦上設(shè)置本機(jī)環(huán)境變量JAVA_HOME路徑
Windows 64位系統(tǒng)安裝*****-windows-x64為64位的jdk或jre以及Windows 32位系統(tǒng)安裝*****-windows-i586為32位的jdk或jre的Java路徑為 C:\Program Files\Java\ 如:
C:\Program Files\Java\jdk1.7.0_80 64位系統(tǒng)安裝 jdk-7u80-windows-x64 32位系統(tǒng)安裝 jdk-7u80-windows-i586 C:\Program Files\Java\jre7 64位系統(tǒng)安裝 jdk-7u80-windows-x64
C:\Program Files\Java\jdk1.8.0_192 64位系統(tǒng)安裝 jdk-8u192-windows-x64 32位系統(tǒng)安裝 jdk-8u192-windows-i586 C:\Program Files\Java\jre1.8.0_192 64位系統(tǒng)安裝 jdk-8u192-windows-x64
C:\Program Files\Java\jre1.7.0_80 64位系統(tǒng)安裝 jre-7u80-windows-x64 32位系統(tǒng)安裝 jre-7u80-windows-i586 C:\Program Files\Java\jre1.8.0_161 64位系統(tǒng)安裝 jre-8u161-windows-x64 32位系統(tǒng)安裝 jre-8u161-windows-i586
Windows 64 位系統(tǒng)安裝*****-windows-i586為32位的jdk或jre的Java路徑為 C:\Program Files (x86)\Java\ 如:
C:\Program Files (x86)\Java\jdk1.7.0_80 64位系統(tǒng)安裝 jdk-7u80-windows-i586 C:\Program Files (x86)\Java\jdk1.8.0_192 64位系統(tǒng)安裝 jdk-8u192-windows-i586 C:\Program Files (x86)\Java\jre1.7.0_80 64位系統(tǒng)安裝 jre-7u80-windows-i586 C:\Program Files (x86)\Java\jre1.8.0_161 64位系統(tǒng)安裝 jre-8u161-windows-i586
在電腦上可按以下方法設(shè)置環(huán)境變量:JAVA_HOME、PATH
JAVA_HOME:我的電腦(計(jì)算機(jī))->屬性->高級(高級系統(tǒng)設(shè)置)->單擊“環(huán)境變量”按鈕 ->單擊“系統(tǒng)變量”區(qū)域的“新建”按鈕->在“變量名”文本框中輸入JAVA_HOME 在“變量值”文本框中輸入JDK的安裝路徑(如:C:\Program Files\Java\jdk1.7.0_80),單擊確定
PATH: 在系統(tǒng)變量中查看PATH變量,如果存在PATH,則在最末尾多添加一個%JAVA_HOME%\bin;(直接添加,連;也加上,無需加空格之類的,以下相同) 如果不存在,則新建變量PATH,設(shè)定變量值為:%JAVA_HOME%\bin;
具體過程如下:
一、生成*****.keystorede如bug.keystore證書密鑰文件
1、在附件中以管理員權(quán)限運(yùn)行“命令提示符”,打開dos界面,根據(jù)電腦上安裝的jdk位數(shù)
Windows 64位系統(tǒng)安裝*****-windows-x64為64位的jdk以及Windows 32位系統(tǒng)安裝*****-windows-i586為32位的jdk 輸入以下代碼 cd C:\Program Files\Java\jdk*\bin Windows 64 位系統(tǒng)安裝*****-windows-i586為32位的jdk 輸入以下代碼 cd C:\Program Files (x86)\Java\jdk*\bin 切換到j(luò)dk的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
出現(xiàn)問題并填寫 您的名字與姓氏是什么? [Unknown]: localhost 您的組織單位名稱是什么? [Unknown]: test 您的組織名稱是什么? [Unknown]: test 您所在的城市或區(qū)域名稱是什么? [Unknown]: test 您所在的省/市/自治區(qū)名稱是什么? [Unknown]: test 該單位的雙字母國家/地區(qū)代碼是什么? [Unknown]: test CN=localhost, OU=test, O=test, L=test, STtest, C=test 是否正確? [否]: y
填寫相關(guān)信息后會在Java的bin目錄下生成密鑰文件 debug.keystore 就是我們需要的安卓Android簽名密鑰文件,(-validity 36500 表示證書的有效天數(shù)為36500天)
其中: KeystoreFile密鑰文件名為 debug.keystore -alias密鑰別名為 androiddebugkey -storepass密鑰密碼為 android -keypass android 表示密鑰密碼keypassPassword為 android 密鑰文件名debug.keystore、密鑰別名 androiddebugkey、 密鑰storepass和keypassPassword密碼 android 都可根據(jù)自己的需要設(shè)定
就能得到.jks格式 .keystore證書密鑰文件debug.keystore,可用apksigner或jarsigner兩種簽名代碼之一給反編譯后的安卓APK文件簽名就不會報毒了。
如果要用signapk方式簽名給反編譯后的安卓APK文件簽名就需要將.jks格式 .keystore證書密鑰文件debug.keystore轉(zhuǎn)換成testkey.x509.pem證書文件+testkey.pk8密鑰文件
二、jks格式 .keystore證書密鑰文件debug.keystore轉(zhuǎn)換成testkey.x509.pem證書文件+testkey.pk8密鑰文件的方法
轉(zhuǎn)換簽名文件需要OpenSSL環(huán)境支持
Openssl第三方下載地址: http:///products/Win32OpenSSL.html
根據(jù)OpenSSL的版本和安裝路徑添加OpenSSL環(huán)境變量,如安裝 Win64OpenSSL 則
在計(jì)算機(jī)->屬性->高級系統(tǒng)配置->高級->環(huán)境變量 編輯系統(tǒng)變量 變量名: PATH 在變量值中加入: C:\Program Files\OpenSSL-Win64\bin; 完成以上步驟后,開始驗(yàn)證是否設(shè)置正確 運(yùn)行cmd(開始,運(yùn)行,輸入cmd,回車),或點(diǎn)擊“附件”中的“命令提示符”, 輸入 openssl 回車出現(xiàn) openssl>
或輸入start openssl 彈出dos窗口 openssl>
就表明OpenSSL環(huán)境變量配置正確 或下載安裝Win32OpenSSL 或 Win64OpenSSL后,將OpenSSL-Win32或OpenSSL-Win64文件夾bin目錄中的所有文件復(fù)制到j(luò)ava下如jdk1.*.0_*的bin目錄中
然后將.jks格式 .keystore證書密鑰文件debug.keystore復(fù)制到j(luò)ava的bin目錄中 如: C:\Program Files\Java\jdk1.8.0_192\bin C:\Program Files\Java\jdk1.7.0_80\bin
方法一:
在附件中以管理員身份運(yùn)行運(yùn)行“命令提示符”,打開dos界面,輸入以下命令,如 cd C:\Program Files\Java\jdk1.8.0_192\bin cd C:\Program Files\Java\jdk1.7.0_80\bin
1. 將keystore文件轉(zhuǎn)換為pkcs12格式
keytool -importkeystore -srckeystore debug.keystore -destkeystore testkey.p12 -srcstoretype JKS -deststoretype PKCS12
按提示在dos窗口 輸入目標(biāo)密鑰庫口令 如:android 再次輸入新口令 如:android 輸入源密鑰庫口令 如:android 目標(biāo)密鑰庫口令一定要設(shè)置并且和源密鑰庫口令一樣,如: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-----
復(fù)制從“BEGIN CERTIFICATE”到“END CERTIFICATE”含有證書信息的文本內(nèi)容后,新建文本文檔,保存為 testkey.x509.pem 或?qū)摹癇EGIN CERTIFICATE”到“END CERTIFICATE”含有證書信息的文本內(nèi)容保留后,另存為 testkey.x509.pem 如下所示
-----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIEP5A+yjANBgkqhkiG9w0BAQsFADBgMQ0wCwYDVQQGEwRU ZXN0MQ0wCwYDVQQIEwRUZXN0MQ0wCwYDVQQHEwRUZXN0MQ0wCwYDVQQKEwRUZXN0 MQ0wCwYDVQQLEwRUZXN0MRMwEQYDVQQDEwpEb3VibGVtaW5lMCAXDTE5MDExMDIz Wrf1j0dvIk3FAMs7mLoYoRZVddKkK09OEEdotmXbXklmA+pXuaUxzBgs9NoDoUi4 8vF/rlqqx+3zEJDXehKq703BIJ0SxAY/RglGfUgmE5qFk/q0ZsuS/hAO1K8BhpiZ AKsjk5A= -----END CERTIFICATE-----
testkey.x509.pem 文件即是我們最后需要的證書文件
復(fù)制從“BEGIN RSA PRIVATE KEY”到“END RSA PRIVATE KEY”含有私鑰信息的文本內(nèi)容后,新建文本文檔,保存為 testkey.pem 或?qū)摹癇EGIN RSA PRIVATE KEY”到“END RSA PRIVATE KEY”含有私鑰信息的文本內(nèi)容保留后,另存為 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復(fù)制保存下來給apk簽名: java -jar signapk.jar testkey.x509.pem testkey.pk8 unsigned.apk signed.apk
方法二:
在附件中以管理員身份運(yùn)行運(yùn)行“命令提示符”,打開dos界面,輸入以下命令,如 cd C:\Program Files\Java\jdk1.8.0_192\bin cd C:\Program Files\Java\jdk1.7.0_80\bin
1. 把.jks轉(zhuǎn)換為pkcs12標(biāo)準(zhǔn)的證書+私鑰文件
keytool -importkeystore -srckeystore debug.keystore -srcstoretype JKS -srcalias androiddebugkey -srcstorepass android -srckeypass android -destkeystore testkey.p12 -deststoretype PKCS12 -destalias testkey -deststorepass android -destkeypass android
因?yàn)閜kcs12不支持keypass 所以-destkeypass如果單獨(dú)設(shè)置密碼的話 keytool會提示你 這個密碼不起作用 但是如果你不設(shè)置密碼的話 后面導(dǎo)出key的時候會報錯 所以這里必須要設(shè)置destkeypass 并且和deststorepass設(shè)置的一樣
或 keytool -importkeystore -srckeystore debug.keystore -destkeystore testkey.p12 -srcstoretype JKS -deststoretype PKCS12
按提示在dos窗口 輸入目標(biāo)密鑰庫口令 如:android 再次輸入新口令 如:android 輸入源密鑰庫口令 如:android 目標(biāo)密鑰庫口令一定要設(shè)置并且和源密鑰庫口令一樣,如:android
2. 從生成的pkcs12標(biāo)準(zhǔn)的證書+私鑰文件testkey.p12中,先提取得到含有證書信息的.x509.pem證書文件
openssl pkcs12 -nokeys -in testkey.p12 -passin pass:android -out testkey.x509.pem -passout pass:android -nokeys,就是指不要私鑰key信息,只要證書cert信息,直接導(dǎo)出含有證書信息的.pem文件,即為.x509.pem 證書文件
3. 把私鑰key信息提取出來,不過提取出來含有私鑰key信息的.pem文件是pkcs12標(biāo)準(zhǔn)的
openssl pkcs12 -nocerts -in testkey.p12 -passin pass:android -out testkey.pem -passout pass:android -nocerts,就是指不要證書cert信息,只要私鑰key信息,直接導(dǎo)出含有私鑰信息pkcs12標(biāo)準(zhǔn)的.pem文件
4. 把之前的pkcs12標(biāo)準(zhǔn)的私鑰.pem文件,轉(zhuǎn)換為pkcs8標(biāo)準(zhǔn),就得到.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復(fù)制保存下來給apk簽名: java -jar signapk.jar testkey.x509.pem testkey.pk8 unsigned.apk signed.apk
兩鐘方法不同之處是將pkcs12格式的.p12證書密鑰文件轉(zhuǎn)換成含證書信息和密鑰信息的.pem文件時
方法一未在openssl命令參數(shù)中添加拆分命令,一次性將證書和密鑰信息轉(zhuǎn)換在同一個.pem文件中 需要通過“記事本”等將含證書信息和私鑰信息文本信息的一個.pem文件拆分成兩個單獨(dú)的證書信息.pem文件和私鑰信息.pem文件
方法二則在openssl命令參數(shù)中,添加了拆分命令:-nokeys(不要私鑰key信息,只要證書cert信息)、-nocerts(不要證書cert信息,只要私鑰key信息) 分兩次將證書信息和密鑰信息轉(zhuǎn)換成兩個單獨(dú)的證書信息.pem文件和私鑰信息的.pem文件 無需再通過“記事本”等對已經(jīng)是單獨(dú)的證書信息.pem文件和私鑰信息.pem文件進(jìn)行拆分
方法三、利用SSL在線工具轉(zhuǎn)換
SSL在線工具-在線證書格式轉(zhuǎn)換|證書在線合并|p12、pfx、jks證書在線合成解析: http://www./jks_pkcs12.html
1. 打開SSL在線工具網(wǎng)站,將JKS格式的 debug.keystore證書密鑰文件“點(diǎn)擊上傳或拖拽到此處” 選擇“JKS”轉(zhuǎn)成“PEM” 在右邊2個框中,分別輸入私鑰密碼KEY,如 android (KEY,若私鑰加密對其進(jìn)行解密),也可不輸入這個私鑰密碼KEY , 和JKS密碼,如 android
結(jié)果,就能得到如
私鑰
-----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.分別將含有證書信息和私鑰信息的文本內(nèi)容復(fù)制到新建的2個文本文檔中,重命名為含有證書信息的 ***.x509.pem文件和含私鑰信息的***.pem文件 如證書文件testkey.x509.pem 和 私鑰文件testkey.pem
3. 把含私鑰信息testkey.pem文件轉(zhuǎn)換成.pk8格式私鑰文件
在附件中以管理員身份運(yùn)行運(yùn)行“命令提示符”,打開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復(fù)制保存下來給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反編譯后簽名就不會被安全軟件報毒了。
|