事出突然,需要对项目进行反编译并二次打包,查阅了许多资料,算是打包成功,再次做个简单的记录。
准备好需要的工具
dex2jar-2.0 https://sourceforge.net/projects/dex2jar/
apktool_2.4.1 https://ibotpeaches.github.io/Apktool/
jd-gui-1.6.6 http://java-decompiler.github.io/
baksmali-2.4.0 https://bitbucket.org/JesusFreke/smali/downloads/
smali-2.4.0 https://bitbucket.org/JesusFreke/smali/downloads/
首先解压要反编译的APK文件,导出classes.dex文件,并放置在dex2jar的根目录下,与d2j-dex2jar.bat保持同级,使用dex2jar指令拿到classes-dex2jar.jar文件。
指令:d2j-dex2jar.bat classes.dex
运行之后,在该目录下会生成classes-dex2jar.jar文件
这里我下载的是这样的jd-gui(jd-gui-1.6.6.jar),之前的是jd-gui.exe文件,可以直接运行,这里采用cmd命令行打开jd-gui
指令:java -jar jd-gui-1.6.6.jar
打开之前生成的classes-dex2jar.jar文件,就能看到代码(我这里的代码没有混淆过,看的比较清楚)
cmd定位至baksmali-2.4.0.jar文件下,并拷贝之前取出的classes.dex文件至该路径,将dex文件转为smali文件
指令:java -jar baksmali-2.4.0.jar d classes.dex
该指令执行完毕后,会在同级目录下生成out文件夹,包含所有的smali文件
这里可以利用Smali2JavaUI工具来查看,我改动的内容不多,仅是一个访问地址,所以很轻易的就找到了,具体的文件解析还需要更深入的了解。修改好内容后,使用smali-2.4.0.jar 将代码打包成dex文件。
指令:smali-2.4.0.jar assemble out -o classes.dex (out为上述生成的文件夹,classes.dex是要生成的dex文件)
PS:不知为何,执行后,cmd中没有任何输出语句,过一段时间后,classes.dex才会出现,一度以为失败了呢。。。。
将生成好的dex文件,替换原始的apk文件中的dex文件,并剔除META-INF文件中的 .RSA .SF 以及 .MF文件,修改完毕后,重新打包成压缩文件,并修改文件后缀为 .apk(new.apk)
预先准备一份要签名的文件,这里我用android studio直接生成的,所以比较方便
找到SDK中的build-tools文件夹,随便选一个api,这里我用的是29,拷贝一份new.apk至该目录下,打开cmd并定位至该目录下
指令:zipalign -v -p 4 new.apk new_out.apk(对齐并生成新的apk文件new_out.apk)
将new_out.apk文件以及准备好的签名文件拷贝至lib目录中,为了方便使用apksigner.jar
指令:java -jar apksigner.jar sign --ks demo.jks --ks-key-alias demo_alias new_out.apk(demo.jks为准备的签名文件,demo_alias为签名文件中的别名,new_out.apk是对齐之后的apk文件)
输入签名文件的密码后,即签名完成,是否签名成功可以使用该指令查看
指令:java -jar apksigner.jar verify -v new_out.apk(new_out.apk是签名后的文件)
至此二次打包完成,测试可以正常安装并使用。