• 背景
  • 实现步骤
  • 1.新建工程,将jar包引入,打包成apk
  • 2.使用apktool,将apk转换成smali文件
  • 3.找到对应的位置,修改smali代码
  • 4.将修改完成的工程,使用apktool将smali打包成dex
  • 5.将dex转换成为jar包
  • 6.从jar包当中找到对应的class文件,解压,并存放在对应的目录当中
  • 7.使用zip -u命令更新原来的jar包


背景

在某些特殊的场景,我们需要将jar包反编译然后修改里面的源码来实现我们自己的功能。
博主前段时间就遇到了这样的问题。由于隐私监控越来越严格,博主所在的部门也对App进行了严格的隐私自查,发现有些sdk读取隐私字段的频率过高,因此需要找到对应的团队更新sdk;可是对于有些年久失修的sdk,没有团队维护了,如何才能快速的满足隐私监管的要求呢?
这里就可以使用反编译的方法,更改sdk里面的逻辑。
反编译所需要使用到的工具如下:
apktool:能够将apk转换成smali文件
dex2jar:能够将dex转换成jar包
jd-gui:方便查看class和jar文件

实现步骤

1.新建工程,将jar包引入,打包成apk

我们找到需要修改的jar包,然后新建一个Android工程,将jar包引入,打包成apk

jar 反编译成java 文件 jar包可以反编译成源码吗_反编译

2.使用apktool,将apk转换成smali文件

对应的指令为:

apktool d -r app-debug.apk

jar 反编译成java 文件 jar包可以反编译成源码吗_java_02

3.找到对应的位置,修改smali代码

通过包名定位到对应的smali代码,然后修改

jar 反编译成java 文件 jar包可以反编译成源码吗_反编译_03


修改后

jar 反编译成java 文件 jar包可以反编译成源码吗_jar_04

4.将修改完成的工程,使用apktool将smali打包成dex

使用的指令为:

apktool b .

jar 反编译成java 文件 jar包可以反编译成源码吗_android_05


得到dex

jar 反编译成java 文件 jar包可以反编译成源码吗_jar_06

5.将dex转换成为jar包

使用的指令

d2j-dex2jar.sh classes.dex

jar 反编译成java 文件 jar包可以反编译成源码吗_java_07


得到classes-dex2jar.jar包,用jd-gui打开,发现里面除了我们的jar包之外还有一些android库,不过没关系,只需要关注我们自己的库就好。

jar 反编译成java 文件 jar包可以反编译成源码吗_jar 反编译成java 文件_08


打开我们修改的路径,发现已经修改好了

jar 反编译成java 文件 jar包可以反编译成源码吗_java_09

6.从jar包当中找到对应的class文件,解压,并存放在对应的目录当中

zip解压classes-dex2jar.jar包,删除android库,保留我们自己的库,并和原先的jar包放在同一个目录下

jar 反编译成java 文件 jar包可以反编译成源码吗_反编译_10

7.使用zip -u命令更新原来的jar包

使用的指令是:

zip -u xxx.jar xxx.class

jar 反编译成java 文件 jar包可以反编译成源码吗_反编译_11


打开jar包,我们发现原来的代码已经更改了

jar 反编译成java 文件 jar包可以反编译成源码吗_java_12