Android逆向工程之dx工具jar2dex失败,使用d8

遇到问题

在使用apktool做apk逆向工程时,我们一般都需要将apk反编译为smail,然后将要加入其中的SDK也编译成smail,然后将二者合并起来之后打包成一个新的apk,其中将SDK的jar编译为smail需要两步

  1. 使用dx工具将jar转为dex,dx的工具在AndroidSDK中可以找到,dx.jar。

    dx --dex --output=out sdk.jar sdk2.jar...

    ​ out要输出的smail目录

    ​ sdk.jar sdk2.jar… sdk的jar文件,可以是多个

  2. 将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编译准没错

逆向工程路漫漫啊,估摸着我也只知道个皮毛!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值