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

本文详细介绍了如何反编译Android APK,包括使用apktool、Java2smail、dex2jar和jd-gui等工具,以及如何在反编译后拦截WebView的URL,替换图片资源,最后重新签名打包APK以供安装。
摘要由CSDN通过智能技术生成

反编译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就可以安装了…收工

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值