从 MT 管理器提取安卓签名密钥

 

前言

一言以概之,有个人硬盘爆了,刚好他的密钥几乎没有备份,于是只能从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

参考资料