从反编译到打包对齐签名全流程
在看安卓逆向教程时,发现工具和环境基本都是windows环境的,而我平时都用的是Mac来开发安卓,积累了一些Mac上的使用经验。这次先分享下Mac上反编译的基本流程。
一、流程命令
0.环境准备
1.反编译
apktool d test.apk --only-main-classes
- 执行后会出现apk名字的文件夹,点进去可以看到清单文件、res、smali等资源。
点进去可以改清单文件里的内容。
2.打未签名的包
apktool b test
3.使用zipalign对齐包
~/Library/Android/sdk/build-tools/33.0.1/zipalign -p -f -v 4 test.apk test-zip.apk
4.检验包是否对齐
~/Library/Android/sdk/build-tools/33.0.1/zipalign -c -v 4 test-zip.apk
- 显示Verification succesful即为对齐成功
5.生成jks签名文件
keytool -genkey -alias test2 -keyalg RSA -keystore test2.jks
-
-alias test2 这里是别名,test2.jks是生成的文件名
-
输入命令按开始以后,就要确认密码和一系列信息,这些信息一般随便写。
-
如果在其他地方需要导出证书文件的话,可以执行下列命令
keytool -export -alias test2 -file test2_public_cert.cer -keystore test2.jk
其中,test2_public_cert.cer是要生成导出的证书文件名
6.用apksigner签名包
~/Library/Android/sdk/build-tools/33.0.1/apksigner sign --ks test2.jks --ks-key-alias test2 --out test-signed.apk test-zip.apk
7.检测签名包是否对齐
~/Library/Android/sdk/build-tools/33.0.1/zipalign -c -v 4 test-signed.apk
最后显示Verification succesful即为对齐成功。
- 这一步是保险起见,因为用jarsigner签名后就可能会显示对齐失败。
8.将手机连接电脑,确定打开开发模式
9.adb安装签名包
adb install test-signed.apk
- 输入命令后开始后会在手机上弹窗,要及时点击同意安装
官网安装链接 https://ibotpeaches.github.io/Apktool/install/
一定注意别下载错了平台,否则一定安装不成功
上面的1-4都容易理解和执行,
第四步看不到文件的话需要执行隐藏文件可见的命令。
第5步要确认两个文件是有执行权限的,首先确认是在/usr/loacl/bin目录下。
执行上面的chmod +x可能看不到成效(我没有成功...),此时可以尝试执行
chmod 777 apktool
然后继续执行
./apktool
此时如果出现Permission denied的话说明文件是没有执行权限的。
第6步 可以执行
apktool -v
来查看是否安装成功
三、常用方法
反编译
在apk所在文件夹运行命令
apktool d hongbao.apk --only-main-classes
- --only-main-classes可以防止编译已加密的dex文件
执行后会出现apk名字的文件夹,点进去可以看到清单文件、res、smali等资源
回编译
在上面反编译的文件夹内运行命令
apktool b hongbao
在hongbao文件夹内会多出build和dist文件夹,dist内有刚才生成的未签名app
给APP签名
签名需要用到keytool,没有安装的请下载安装,很简单。
目前签名的方式有几种,此处先用最简单的一种来,后面再完善这部分
keytool -genkey -keystore test.keystore -alias test -keyalg RSA -validity 10000
填写资料时基本是随便填的,记住密码和别名(如上面的test)就行
jarsigner -verbose -keystore test.keystore -signedjar gaga1.apk app-cm-319-oppo.apk 'test'
可用于没有签名和已经签名的apk,再次签名。
jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkin] [alias]
命令格式及参数意义:
-verbose -> 输出签名过程的详细信息
-keystore [keystorePath] -> 密钥的库的位置
-signedjar [apkOut] -> 签名后的输出文件名
[apkin] -> 待签名的文件名
[alias] -> 证书别名
示例:
D:\>jarsigner -verbose -keystore demo.keystore -signedjar jaq_demo_signed.apk jaq_demo.apk demo.keystore
注意:
需要签名的包和keystore要放在一个文件夹中,并且cmd也需要在这个文件夹路径下。否则失败。
生成jar文件并查看
- 首先进入到刚才解压缩生成的dex2jar-2.0文件夹下,执行命令
./d2j-dex2jar.sh /Users/yanzi/apk/hongbao.apk
执行后会在当前文件夹下生成类似hongbao-dex2jar.jar的文件
如果提示执行sh文件没有权限的话同上面一样执行
chmod 777 d2j-dex2jar.sh
- 进入到刚才解压缩生成的jd-gui-osx-1.4.0文件夹下,打开JD-GUI.app,将上面生成的jar文件拖进去打开看就可以看到java文件
查看APK签名信息
-
用jarsigner查看apk文件
jarsigner -verify -verbose -certs <your_apk_path.apk>
-
用keytool直接查看签名文件(前提是有签名文件),到keystore文件所在目录下,
keytool -list -v -keystore debug.keystore
-
查看三方应用或是系统应用签名用winrar打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件,通过keytool -printcert -file META-INF/CERT.RSA命令打印证书信息
四、可能遇到的问题
1. 缺少exported属性
Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present
2. 4byte边界对齐问题
Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary
3. jarsigner签名后出现4byte边界对齐问题
-
可能是高版本的安卓工具不再兼容jarsigner
-
解决方法:按官方推荐用apksigner签名