近期分析一個(gè)app,需要patch掉.so中的反調(diào)試功能。具體分析后,將bne(機(jī)器碼是D1)指令改成beq(機(jī)器碼是D0),然后用APK上上簽給apk簽名。安裝時(shí)出現(xiàn)了錯(cuò)誤:INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION

之前用APK上上簽從未出現(xiàn)過問題。打開DDMS,發(fā)現(xiàn)消息提示指向簽名未通過驗(yàn)證,只好以手工輸入指令的方式對apk簽名。
1、用JDK中的標(biāo)準(zhǔn)工具keytool生成私鑰
keytool.exe-genkey -v -keystore my-key.keystore -alias my_alias -keyalg RSA -keysize 2048-validity 10000
上述示例將提示輸入密鑰庫和密鑰的密碼,為密鑰提供DN。然后,它會(huì)將密鑰庫生成為名為my-key.keystore的文件,別名為my_alias。密鑰庫包含一個(gè)密鑰,有效期為10000天,別名將在給apk簽名時(shí)使用到。
2、apksigner用私鑰給apk簽名,此時(shí)需要輸入密鑰的密碼。
apksignersign --ks my-key.keystore --ks-key-alias my_alias --in catchme.apk --outcatchme-signed.apk
3、驗(yàn)證apk是否已簽名
apksignerverify -v --print-certs catchme-signed.apk
4、使用zipalign對齊apk
zipalign.exe-v 4 catchme-signed.apk catchme-aligned.apk
zipalign 確保所有未壓縮的數(shù)據(jù)以相對于文件開頭的特定字節(jié)對齊方式開始,從而減少應(yīng)用程序消耗的 RAM 量。
5、此時(shí)安裝apk就不會(huì)出現(xiàn)INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION錯(cuò)誤了。
注:keytool是jdk的標(biāo)準(zhǔn)工具,一般存放在JDK安裝路徑的bin目錄下。apksigner、zipalign是安卓SDK的工具,存放在SDK的build-tools目錄下。