反编译更改jar包代码

388 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

背景

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

实现步骤

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

我们找到需要修改的jar包,然后新建一个Android工程,将jar包引入,打包成apk 在这里插入图片描述

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

对应的指令为:

apktool d -r app-debug.apk

在这里插入图片描述

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

通过包名定位到对应的smali代码,然后修改 在这里插入图片描述 修改后 在这里插入图片描述

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

使用的指令为:

apktool b .

在这里插入图片描述 得到dex 在这里插入图片描述

5.将dex转换成为jar包

使用的指令

d2j-dex2jar.sh classes.dex

在这里插入图片描述 得到classes-dex2jar.jar包,用jd-gui打开,发现里面除了我们的jar包之外还有一些android库,不过没关系,只需要关注我们自己的库就好。 在这里插入图片描述 打开我们修改的路径,发现已经修改好了 在这里插入图片描述

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

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

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

使用的指令是:

zip -u xxx.jar xxx.class

在这里插入图片描述 打开jar包,我们发现原来的代码已经更改了 在这里插入图片描述