反编译、回编译、脱壳的简单测试
以前为了开发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会自动签名