android反编译apk,webview拦截url,替换图片资源,重新签名打包apk

反编译apk,webview拦截url,替换图片资源,重新签名打包apk

接到一个需求:

对游戏中的一个图片logo进行拦截替换

问题点:

项目工程丢失,只有apk包

解决前准备工具:

1.apktool:反编译apk,apk重新打包;
2.Java2smail (android studio插件):将修改的Java代码编译成smail格式;
3.dex2jar:将classes.dex文件,反编译出源码(如果apk未加固),反编译出jar包
4.jd-gui:可将jar包转化为java格式查看;
5.jarsigner :将重新打包的apk进行签名,如果不签名,无法安装使用(jarsigner是JDK提供的针对jar包签名的通用工具,位于JDK/bin/jarsigner.exe)。

解决步骤:

一.反编译apk,定位修改代码:

开始前,可把apktool路径加入环境变量path中,方便使用,在包含apk的目录下开命令窗口:
执行命令:

apktool d game.apk

android反编译apk,webview拦截url,替换图片资源,重新签名打包apk_第1张图片
执行完后获得是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打开了
android反编译apk,webview拦截url,替换图片资源,重新签名打包apk_第2张图片
这个步骤的作用是方便我们定位代码位置,以及修改代码,通过查看代码可知代码中未添加shouldInterceptRequest方法,所以我们需要添加代码进行拦截;

我们可以看一下反编译出来的包的结构:
android反编译apk,webview拦截url,替换图片资源,重新签名打包apk_第3张图片
其中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;
    }

android反编译apk,webview拦截url,替换图片资源,重新签名打包apk_第4张图片
转化后会生成文件,在生成的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  -storepass android -keypass android game.apk androiddebugkey
pause

然后修改的apk就可以安装了…收工

可能有不足,后续补充,如有问题,欢迎指出…

你可能感兴趣的:(android,积累)