以前为了开发Xposed插件,对app进行过脱壳或通过其它工具查看源代码的等操作,这次想实现对app的反编译和回编译,这里记录一下测试过程。

注:一些快捷查看源代码的工具

apk中代码:Smali2JavaUI、AndroidKiller

dex中代码:jadx-gui

jar中代码:jd-gui

Manifest文件代码:AXMLPrinter2

一、可反编译及回编译APK

用于未作加固处理及其它特殊处理的apk(测试apk“动漫之家2.7.017”)

1、工具

apktool_2.4.0.jar、jdk

2、反编译

apktool_2.4.0.jar d test.apk

反编译得到test文件夹,修改smali文件(IDEA安装java2smali插件,可直接将java转smali,方便测试修改)

3、回编译

apktool_2.4.0.jar b test

test就是反编译出来的文件夹名字
在test\dist目录下得到新的apk文件

4、生成签名文件

keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore

到jdk\bin目录下执行以上命令,生成签名文件,abc.keystore是签名文件

5、对新apk签名

jarsigner -verbose -keystore abc.keystore -signedjar test1.apk test.apk abc.keystore

copy新的apk文件到bin目录执行以上命令。

test1.apk是签名后的文件

test.apk是未签名文件

jarsigner是工具名称

-verbose表示将签名过程中的详细信息打印出来,显示在dos窗口中

注:这里是最基础的操作,通过AndroidKiller工具可实现UI界面操作,它内部操作也是与上面操作一致

二、可反编译但无法回编译APK

用于未加固的apk,但可能进行了一些特殊处理,通过方式一有可能回编译失败,而这种方式不用进行回编译,能减少出错机率。(测试apk“百度贴吧10.2.8.8”)

1、工具

baksmali-2.3.jar、smali-2.3.jar、AXMLEditor、winrar

2、修改classes.dex

用winrar直接打开test.apk,将classes.dex直接提取出来

java -jar baksmali-2.3.jar disassemble -o classes_smali classes.dex

通过baksmali将dex转为smali文件,其中classes_smali是输出的文件夹,classes.dex是提取处理的dex文件

3、修改AndroidManifest.xml

由于我的测试修改没有进行该操作,所有没有测试过程。但通过AXMLEditor工具是可以对apk中解压出来的Manifest文件直接修改的,

4、重新生成classes.dex

修改完smali文件后

java -jar smali-2.3.jar assemble classes_smali -o classes.dex

通过smali重新将smali文件转成dex文件,其中classes_smali是用于转换smali文件夹,classes.dex是新的dex文件。将新生成的classes.dex塞回test.apk

5、重新签名

删除test.apk中META-INF文件夹

jarsigner -verbose -keystore abc.keystore -signedjar test1.apk test.apk abc.keystore

通过jarsigner重新签名后安装才不会解析失败

三、无法直接反编译的APK

无法直接反编译就是apk加了壳,测试的apk用的是360加固,测试最终修改了代码也重新签名打包成功,但由于通过apktool反编译时,太多smali文件损坏,导致回编译后打开闪退,但修改的代码确实有效(测试apk“漫画人3.3.6”)

1、工具

Android Killer、apktool_2.4.0.jar、baksmali-2.3.jar

root后的手机(x86内核的不行)、FDex2、VirtualXposed、RE文件浏览器

2、脱壳拿到dex文件

手机安装test.apk、FDex2和VirtualXposed,VirtualXposed导入testAPP和FDex2,和普通Xposed一样安装启动FDex2插件,但是不需要重启手机,VirtualXposed内部实现了重启。

FDex2选中test的包名,记住提示的导出路径,重启testAPP,通过RE文件浏览器在FDex2的导出目录中复制dex文件,这里可能会有多个dex文件,全部复制到电脑。

注:除此方法外通过drizzleDumper貌似也能脱壳,但我这次测试过程中是失败的,它会无限生成dex文件,猜测是360加固升级了加固方式后导致的。

3、获取smali文件及修改

通过baksmali将所有dex文件转成smali文件夹(参考二.2),注意文件夹的命名:smali、smali_classes02、smali_classes03…后续以此类推。

这里有多个文件夹,但是只有其中一两个是需要修改文件所在的文件夹,根据包名可大概推断出需要修改的smali文件位置

4、修改AndroidManifest.xml

通过jadx等工具分析脱壳的dex文件,找到最原始的Application类路径

通过Android Killer打开test.apk,打开Manifest文件,将applicaiton中android:name项中的加固工具的Appcation类路径替换成原始Applicaiton路径

5、回编译

在Android Killer安装目录下projects\test\Project目录中,删除smali、smali_classes文件夹,将3中smali文件夹复制到路径下,切换到Android Killer刷新项目,此时也可在Android Killer修改smali代码。

修改完成后,左上角Android面板中,点击编译,重新生成apk,AndroidKiller会自动签名