工具准备:
源apk : 第三方文件管理器.apk(此处不详细说哪家apk,怕引起不必要的麻烦,此文仅作技术上的交流,如有侵权,请联系我,我马上删除此文!)
反编译/回编译工具:apktool-v2.0.0RC2.jar
dex反编译工具: dex2jar-0.0.9.15
jar文件查看工具: jd-gui.exe
平台:eclipse
需求分析:因主板不支持蓝牙功能,但es里有蓝牙选项,点击后,es一直卡死在那,最简单做法:把蓝牙选项屏蔽,没有源码,只有apk,因此要用到反编译工具
首先,分析该apk界面,发现蓝牙选项有一个蓝牙图标和蓝牙文件,那么可以从这两方面入手:
1、搜索所有用到该图标的代码(包括xml文件),逐一去掉
2、搜索所有用到“蓝牙”文件的代码(包括xml文件),逐一去掉
经过后来搜索,发现这里用图标来定位比较好
一、接下来,先把apk经过apktool.jar反编译成字节码:
cmd: java -jar apktool.jar d
ESFileExplorer.apk
得到 ESdanganliulanqi 目录(最好移出去)
该目录保存着所有资源文件(res目录)和字节码文件(smali目录),还有一个AndroidManifest.xml文件,当然还有一些其他的,但我们只用到这些
二、重命名
ESFileExplorer.apk ==> ESFileExplorer.zip (为了解压),把 ESFileExplorer.zip 解压出来,得到 ESFileExplorer 目录,
三、把刚解压出来的 classes.dex 反编译成java文件:
用 dex2jar-0.0.9.15 工具:
dex2jar-0.0.9.15\dex2jar-0.0.9.15\dex2jar classes.dex
得到 classes_dex2jar.jar 文件
四、用 jd-gui.exe 工具把刚得到的
classes_dex2jar.jar 保存成java文件:
用 jd-gui.exe 打开 classes_dex2jar.jar
保存后,得到 classes_dex2jar.src.zip 文件,解压。
四、打开eclipse,新建一个java项目,把刚解压出来的文件复制到新建项目src目录下
五、把最开始反编译出来的目录(
ESdanganliulanqi 注意:不是解压出来的)中的 res 目录复制到新建项目中,最好把AndroidManifest.xml一起复制进来
六、接下来就是重点:定位修改的地方
找到蓝牙图标:在 res\drawable-hdpi 搜索 blue
结果:
记下名字:sidebar_blue
在eclipse中,搜索
sidebar_blue字符串
结果:
在编译时,会把该名字变成id形式(整形),一般会在生成的R.java文件中找到对应关系,但这里因为加了混淆,所以找不到R.java文件,在values目录下,有public.xml文件,其实这个文件与R文件相似,所有drawable对应的id都在这里
找到了对应的id:
<public type="drawable" name="sidebar_blue" id="0x7f0201ee" />
接下来,找到使用该id的地方,这个id是十六进制的,但引用时,使用的是十进制的,所以如果直接用
0x7f0201ee 来搜索,是没结果的,应该转换成十进制的再来搜索,用计算器转换:2130837998
搜索字符串:2130837998
结果:
找到该 文件(package com.estrongs.android.ui.adapter;),发现使用该图标的方法名是:
最关键的地方:修改字节码:
根据刚刚发现的文件包名,在反编译目录中的字节码目录(
smali)找到相应的文件:
用文本编译工具打开:(我用的是UltraEdit)
在当前文件中搜索 2130837998,不好意思,没搜到,原因是字节码中,采用的是十六进制数,所以还得使用前面十六进制数来搜索:0x7f0201ee,找到了,好辛苦啊
这里前面有个 if-eqz v1, :cond_5
这个就是跳转代码,如果v1为0,就执行下面的代码,那么,如果v1不为0呢?自然就不会执行下面的代码,现在我们就是不要执行下面的代码,所以只要修改
if-eqz v1, :cond_5 为 if-nez v1, :cond_5 ,就可以了
修改完成后,保存
七、回编译
使用的工具:apktool.jar
返回到反编译目录,(此目录中,包含了前面修改过的字节码文件),回编译:
java -jar apktool.jar b ./ESFileExplorer
如果报错的话,找到报错的地方,把报错的属性去掉
最终在ES目录下,有个dist目录:
打开,里面有惊喜
八、安装ESFileExplorer.apk,报错,肯定的,要签名才行的,签名这里就不说了。