反编译apk,webview拦截url,替换图片资源,重新签名打包apk
接到一个需求:
对游戏中的一个图片logo进行拦截替换
问题点:
项目工程丢失,只有apk包
解决前准备工具:
1.apktool:反编译apk,apk重新打包;
2.Java2smail (android studio插件):将修改的Java代码编译成smail格式;
3.dex2jar:将classes.dex文件,反编译出源码(如果apk未加固),反编译出jar包
下载和安装 dex2jar
github下载地址:https://github.com/pxb1988/dex2jar
官方网站:https://sourceforge.net/projects/dex2jar/
4.jd-gui:可将jar包转化为java格式查看;
下载和安装 JD-GUI
github下载地址:https://github.com/java-decompiler/jd-gui
官网下载地址:http://java-decompiler.github.io/
5.jarsigner :将重新打包的apk进行签名,如果不签名,无法安装使用(jarsigner是JDK提供的针对jar包签名的通用工具,位于JDK/bin/jarsigner.exe)
解决步骤:
一.反编译apk,定位修改代码:
开始前,可把apktool路径加入环境变量path中,方便使用,在包含apk的目录下开命令窗口:
执行命令:
apktool d game.apk
或者直接运行
java -jar apktool.jar d game.apk
执行完后获得是smali格式的文件,问题来了,怎么定位代码啊,我不会Smali编程语言啊
这个时候dex2jar闪亮登场:
将game.apk修改后缀名为zip,解压后得到class.dex文件,将获取到的classes.dex复制到解压出来的工具dex2jar-0.0.9.15 文件夹内,在dex2jar.bat所在目录开命令窗口输入命令(可能有差异:dex2jar.bat classes.dex 我的是):
d2j-dex2jar.bat classes.dex
得到classes_dex2jar.jar文件,这个时候,就可以用jd-gui打开了
这个步骤的作用是方便我们定位代码位置,以及修改代码,通过查看代码可知代码中未添加shouldInterceptRequest方法,所以我们需要添加代码进行拦截;
我们可以看一下反编译出来的包的结构:
其中smali文件夹中就包含了项目代码,但是是 smali格式的,我们要修改也只能从这里修改、
由于不会smali语法的书写,所以我们直接通过Android studio 中带的插件Java2smali 将写好java代码用插件转换为smali语法,拷贝进来,替换原有smali代码
java代码 :
webview拦截url,替换图片
WebView mWebView = (WebView) findViewById(R.id.webview);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {
Uri scheme = Uri.parse(s);
return getwebResourceResponse(scheme);
}
public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
Uri scheme = webResourceRequest.getUrl();
return getwebResourceResponse(scheme);
}
});
private WebResourceResponse getwebResourceResponse(Uri uri) {
WebResourceResponse response = null;
String urlStr = uri.toString();
Log.i("checkUrl", urlStr);
if (urlStr.contains("/XXXX/logo.png")) {
Log.i("checkUrl", "-----------");
try {
InputStream is = getContext().getAssets().open("gamelogo/logo.png");
response = new WebResourceResponse("image/png", "UTF-8", is);
} catch (IOException e) {
e.printStackTrace();
}
}
return response;
}
转化后会生成文件,在生成的smail文件提取对应的代码,加入到反编译出来的smali代码中(找对位置修改添加是关键)
二.打包apk,进行签名
在上述操作完成后--------其实就是修改反编译出来的文件
在该目录下开命令窗口:
apktool b -f game -o game.apk
你会看到生成了一个新的apk,尝试安装,你会发现,失败了,因为没有签名,反编译后需要重新签名:
Eclipse或Android Studio在Debug时,对App签名都会使用一个默认的密钥库:
默认在C:\Users\用户名.android\debug.keystore
密钥库名: debug.keystore
密钥别名: androiddebugkey
密钥库密码: android
在 jarsigner.exe 所在路径下把 game.apk拷贝至该路径下,开命令窗口输入命令:
jarsigner -keystore debug.keystore -digestalg SHA1 -sigalg SHA1withRSA game.apk androiddebugkey
或者你觉得麻烦就把下面的这段代码保存至.bat文件,然后执行即可:
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
jarsigner -digestalg SHA1 -sigalg SHA1withRSA -keystore <debug.keystore所在路径> -storepass android -keypass android game.apk androiddebugkey
pause
然后修改的apk就可以安装了…收工
可能有不足,后续补充,如有问题,欢迎指出…