前言
一言以概之,有个人硬盘爆了,刚好他的密钥几乎没有备份,于是只能从MT管理器里提取一个出来,就当是某种forensics吧。
正文
注意,以下内容仅适用于在MT管理器导入时没有开启“使用密码保护”或“使用 MT 账号保护”的密钥。
首先找到这个文件,一般是在/sdcard/MT2/keys/
或/sdcard/Android/data/bin.mt.plus/MT2/keys/
下,名字是xxx.key
。
binwalk跑一遍,并提取文件:
$ binwalk -D='.*' xxx.key
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
8 0x8 PEM certificate
1150 0x47E Private key in DER format (PKCS header length: 4, sequence length: 1215
1176 0x498 Private key in DER format (PKCS header length: 4, sequence length: 1189
$ ls _xxx.key.extracted/
8 47E 498
然后猜一下文件类型,并用openssl转换一下:
openssl rsa -in 47E > main.pem
openssl x509 -in ../xxx.key >> main.pem
openssl pkcs12 -export -in main.pem -out main.p12 -name myname
# myname 即为密钥别名
# 这里会要求输入密码,这个密码将同时是 密钥库密码 和 密钥密码
完成后的main.p12
就是密钥库了,可以用keytool查看(此程序位于Android Studio/jbr/bin/
):
keytool -list -v -keystore main.p12
转换成keystore
:
keytool -v -importkeystore -srckeystore main.p12 -srcstoretype PKCS12 -destkeystore main.jks -deststoretype JKS
命令行签名:
# check
zipalign -c -v 4 app-release.apk
# align & sign
zipalign -p -f -v 4 app-release.apk aligned.apk # 一般只需在 build.gradle 的 buildTypes->release 中添加 `zipAlignEnabled true` 即可,不用像这样手动 align
apksigner sign --ks main.jks -v --out signed.apk aligned.apk
# verify
apksigner verify --print-certs -v signed.apk
zipalign -c -v 4 signed.apk
参考资料
上篇科学苗子游记