遇到问题
在使用apktool做apk逆向工程时,我们一般都需要将apk反编译为smail,然后将要加入其中的SDK也编译成smail,然后将二者合并起来之后打包成一个新的apk,其中将SDK的jar编译为smail需要两步
-
使用dx工具将jar转为dex,dx的工具在AndroidSDK中可以找到,dx.jar。
dx --dex --output=out sdk.jar sdk2.jar...
out要输出的smail目录
sdk.jar sdk2.jar… sdk的jar文件,可以是多个
-
将dex文件转为smail,使用baksmail,下载地址:https://bitbucket.org/JesusFreke/smali/downloads/
而我在使用dx编译jar文件的时候出现了如下错误:
问题分析
提示invalid opcode ba 请求–min–sdk–version=26,当前为13
尝试第一次
那就将版本升到26,找到方法,在命令中加入–min–sdk–version=26参数,编译成功
然后使用baksmail将dex转成smail文件,报错信息如下:
java -jar baksmail.jar -o out classes.dex
盲猜是因为上面使用26的api编译的dex太高级了,解析不了
尝试第二次
那就升级baksmail工具,下载网址:https://bitbucket.org/JesusFreke/smali/downloads/
下载最新的2.5.2版本再编译,嚯嚯嚯,语法不对
尝试第三次
那就使用新语法再编译,编译通过,回编译apk,找不到文件
java -jar baksmail.jar d classes.dex -o out
进入反编译文件中找,有啊,这不在这吗,怎么就找不到了
冷静分析,有行号提示,进去看看
emm,看不懂,盲猜。。。猜不到
经过将SDK使用AS引用编译出来的demo反编译成smail和我直接反编译SDK的smail文件对比
哦~,那我知道了,就是lambda表达式没被编译成功呗,是哪一步出了问题
jar转dex?使用的是dx --min–sdk–version=26,那就将版本号提一提,降一降,emmm,都没用
dex转smail?可是baksmail我已经提到最新了呀,而且这东西就算真有问题我也看不懂,改不动
那就改dx吧,听说有个可替代工具叫d8,专门针对java8做的优化,可以一试
尝试第四次
使用d8新工具,命令也不一样了,找了半天的使用方式:
d8 --lib android.jar --output out sdk.jar sdk2.jar...
android.jar也是AndroidSDK中找的,android8.0以上最好
out要输出的smail目录
sdk.jar sdk2.jar… sdk的jar文件,可以是多个
jar转dex成功,dex转smail成功,查看smail文件,发现lambda文件出来了,回编译,成功
至此,打包就告一段落了,可太难了,用了我三天时间
不过不要以为解决了,运行起来直接报找不到R文件,可我回编译的时候重新生成过R文件啊,就在apk包名下。哦~是SDK包名下的R文件找不到,那就参考我的另一篇文章吧 Android逆向工程之aar包转jar包找不到R文件的问题
总结
当我们使用dx工具去编译jar时,可能会出现本文描述的问题,具体就是api 26之前是不支持Lambda的,而dx工具默认使用的是13,然而提了版本之后打出来的dex,baksmail又识别不了,也许不是识别不了,是我技术不到家,没找对方法
AndroidSDK下除了dx工具之外,还提供了一个d8工具,应该是专门针对java8以上的语法做的工具,所以如果jar的使用了java8之上的语法,那使用d8编译准没错
逆向工程路漫漫啊,估摸着我也只知道个皮毛!!!