微信Android SDK反编译还原源码 进行修改重新编译

原创 2017年10月08日 20:09:40

一、介绍

微信sdk,做开发的都应该用过,微信分享、支付,都要用到的。

接下来,跟着我,把他的sdk源码还原为一个module可编译的形式。

用到的工具:

二、过程

2.1 下载微信Android sdk的jar包

下载页面

我用的方法是,gradle依赖,然后把jar拿出来,我用的是没有统计功能的包。

2.2 jadx另存

打开jadx,打开微信的Android sdk jar包,File -> Save as gradle project

这里写图片描述

保存出来到一个文件夹,看到src目录和builde.gradle文件。 我保存为wx文件夹。

这里写图片描述

2.3 Android Stuido导入

修改build.gradle文件为如下:

apply plugin: 'com.android.library'

android {
    //这连个版本看你安装的sdk
    compileSdkVersion 23
    buildToolsVersion '25.0.0'


    lintOptions{
        abortOnError  false
    }

    defaultConfig {
        minSdkVersion 12
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

}

打开Android Studio,新建一个Project,然后File -> import Module,选择刚刚保存出来的文件夹。

然后会出现一些问题,我们来慢慢解决

build tool版本问题

这里写图片描述

点击第一个update即可。

Cannot read packageName问题

这里写图片描述

切换到Project视图,在main文件夹下新建AndroidManifest.xml文件,内容为以下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tencent.mm.opensdk">

    <application android:allowBackup="true" android:supportsRtl="true"/>

</manifest>

然后,Build -> Make Module ‘xx’

然后你会看到一堆报错

2.4 解决代码错误

到了上一步骤的Make Module之后会看到下面的一堆错误,我们一步步解决

这里写图片描述

双击第一个错误,定位到了com.tencent.mm.opensdk.channel.a这个文件。原因是因为外部类和内部类名字相同冲突了。

那把一个类改名呗,好咧。 按住ctrl+鼠标左键 点击内部类a,可以看到有什么方法引用了这个类,这个内部类改了,也要把这些引用给改了。

我们把内部类改为ABean,添加无参数构造器,然后把那些引用给改了。继续编译

接着提示:Error:(15, 14) 错误: d不是抽象的, 并且未覆盖AsyncTask中的抽象方法doInBackground(Void…),双击进去看到是com.tencent.mm.opensdk.diffdev.a.b 这个类报错。好,接下来祭出另外的杀器:jeb。

2.5 使用jeb

新建一个项目,依赖微信的sdk,编译成一个apk

dependencies {
   compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

然后打开jeb,打开这个apk,打开Bytecode,查看微信sdk的源码(com.tencent.mm.opensdk),打开上面报错的类: com.tencent.mm.opensdk.diffdev.a.d

对比jeb的源码,进行代码修改:删除泛型,修改doInBackground方法,修改a方法

f类也是一样修改,然后f方法会发现里面的内部类a没有反编译出来,ok,我们看jeb

这里写图片描述

把这段代码还原为java代码:

public static com.tencent.mm.opensdk.diffdev.a.f.a b(byte[] arg12) {
            String v1_1;
            long v8 = 6979321856L;
            int v7 = 52;

            a v0 = new a();
            if(arg12 != null && arg12.length != 0) {
                try {
                    v1_1 = new String(arg12, "utf-8");
                }
                catch(Exception v1) {
                    Log.e("MicroMsg.SDK.NoopingResult", String.format("parse fail, build String fail, ex = %s", v1.getMessage()));
                    v0.o = OAuthErrCode.WechatAuth_Err_NormalErr;

                    return v0;
                }

                try {
                    JSONObject v2 = new JSONObject(v1_1);
                    v0.x = v2.getInt("wx_errcode");
                    Log.d("MicroMsg.SDK.NoopingResult", String.format("nooping uuidStatusCode = %d", Integer.valueOf(v0.x)));
                    switch(v0.x) {
                        case 402: {
                            v0.o = OAuthErrCode.WechatAuth_Err_Timeout;

                        }
                        case 403: {
                            v0.o = OAuthErrCode.WechatAuth_Err_Cancel;
                            v0.o = OAuthErrCode.WechatAuth_Err_NormalErr;
                            return v0;
                        }
                        case 404: {
                            v0.o = OAuthErrCode.WechatAuth_Err_OK;

                        }
                        case 405: {
                            v0.o = OAuthErrCode.WechatAuth_Err_OK;
                            v0.w = v2.getString("wx_code");

                        }
                        case 408: {
                            v0.o = OAuthErrCode.WechatAuth_Err_OK;

                        }
                        case 500: {
                            v0.o = OAuthErrCode.WechatAuth_Err_NormalErr;

                        }
                        default: {
                            v0.o = OAuthErrCode.WechatAuth_Err_NormalErr;

                        }
                    }
                }
                catch(Exception v1) {
                    v1.printStackTrace();
                }

            }
            else {
                Log.e("MicroMsg.SDK.NoopingResult", "parse fail, buf is null");
                v0.o = OAuthErrCode.WechatAuth_Err_NetworkErr;

            }
            return v0;
        }

接下来到com.tencent.mm.opensdk.diffdev.a.b这个类。a类里面的变量改为public即可

接下来到com.tencent.mm.opensdk.diffdev.a.e这个类,提示Error:(4, 23) 错误: 程序包org.apache.http不存在

这里写图片描述

这个问题是因为没有导入http包导致的,在build.grdle里面的android标签添加下面的代码即可解决。继续编译

    useLibrary 'org.apache.http.legacy'

然后在com.tencent.mm.opensdk.diffdev.a.a这个文件中报错:

Error:(42, 68) 警告: 最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用;
对于 varargs 调用, 应使用 Object
对于非 varargs 调用, 应使用 Object[], 这样也可以抑制此警告

这个把参数new Void[0]删除即可。

然后在com.tencent.mm.opensdk.diffdev.a.e这个文件中报错:

Error:(31, 61) 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出

添加异常捕捉即可

HttpResponse execute = null;
try {
    execute = defaultHttpClient.execute(httpGet);
    if (execute.getStatusLine().getStatusCode() != 200) {
        Log.e("MicroMsg.SDK.NetUtil", "httpGet fail, status code = " + execute.getStatusLine().getStatusCode());
    } else {
        bArr = EntityUtils.toByteArray(execute.getEntity());
    }
} catch (IOException e) {
    e.printStackTrace();
}

然后在com.tencent.mm.opensdk.modelmsg.WXMediaMessage这个类中报错:

Error:(183, 51) 错误: 找不到符号
符号:   方法 toByteArray()
位置: 类型为OutputStream的变量 byteArrayOutputStream

修改OutputStreamByteArrayOutputStream

然后在com.tencent.mm.opensdk.openapi.MMSharedPreferences报错:

Error:(140, 47) 错误: 找不到符号
符号:   方法 a(int,String)
位置: 类型为Object的变量 a

在jeb查看,可以看到a类是util包下面的c文件里面的a内部类,我们把a.a改为c.a.a,导入util目录下c的包 即可。

然后在com.tencent.mm.opensdk.openapi.WXApiImplV10报错:

Error:(92, 33) 错误: 无法将类 Resp中的构造器 Resp应用到给定类型;
需要: Bundle
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同

把BaseResp改为Resp,然后Resp类,添加一个无参数的构造方法。

Error:(143, 308) 错误: 不兼容的类型: int无法转换为String

添加String.valueOf()方法即可

Error:(277, 45) 错误: 找不到符号
符号:   变量 message
位置: 类型为BaseReq的变量 req

req改为: ShowMessageFromWX.Req req = new ShowMessageFromWX.Req(intent.getExtras());

Error:(445, 52) 错误: 无法将类 WXWebpageObject中的构造器 WXWebpageObject应用到给定类型;
需要: String
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同

IMediaObject修改为WXWebpageObject,WXWebpageObject类里面添加无参数的构造方法

ok。基本修改完毕,再把build.gradle里面minSdkVersion修改为12,重新Make Module即可。

三、生成新的jar包

在源码module的build.gradle底部添加代码:

task makeJar(type: Copy) {
    delete 'build/libs/test.jar'
    from('build/intermediates/bundles/debug/')
    into('build/libs/')
    include('classes.jar')
    rename('classes.jar', 'weixinsdk.jar')
}

makeJar.dependsOn(build)

然后在右边Gradle,:xx Module名称 -> other -> makeJar 右键run。 即可在build/libs看到weixinsdk.jar这个就是根据你的源码编译出来的新的微信jar包。
这里写图片描述

完整的github地址: https://github.com/tpnet/WeiXinSDKSource-Android

版权声明:本文为博主原创文章,转载请带上出处,谢谢。

游走Android系列之APK文件的反编译、修改和重新编译打包

Android apk反编译、重新编译和签名 将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(.dex),我们可以从.dex文件中得到.class,再将.class处...
  • hr1986sd
  • hr1986sd
  • 2013年05月31日 00:34
  • 14212

图形化操作:Android反编译、修改代码、重新编译

转自:http://www.eoeandroid.com/thread-263215-1-1.html  一、反编译 反编译我使用的是AntiDroid  V1.4.2,下载地址https://c...

游走Android系列之APK文件的反编译、修改和重新编译打包

Android apk反编译、重新编译和签名 将apk文件解压后有两部分文件需要处理,一种是xml文件,另一种一个dex文件(.dex),我们可以从.dex文件中得到.class,再将.class处...

Android程序反编译、重新编译和签名的方法

原文地址:http://zhaodp.iteye.com/blog/1572236   Anti-Droid简介 安卓APK反编译、重编译和签名工具,基于Apktool v1.4.3开发...
  • mrfly
  • mrfly
  • 2012年07月01日 08:23
  • 2718

自己重新编译的jdk源码jar包

  • 2016年04月07日 17:42
  • 24.17MB
  • 下载

Unity3d 反编译破解游戏 简单示例 (使用ildasm反编译DLL修改然后重新编译DLL)

因为这几天碰到一个Unity的Bug,不得不去反编译DLL看看C#代码的生成中间件代码。这也用到了一些反编译以及重新编译DLL的一些知识,意味到Unity是如此的不安全。...

centos+6.0源码安装xen4.1.1(xen成功安装,但是在重新编译内核时有点小问题)

参考网址:http://www.vpsee.com/2010/04/install-xen-on-centos-from-source/ 1 需要安装的软件包: # yum groupinstal...

nifi源码汉化重新编译过程记录

1、下载nifi的源码文件:http://nifi.apache.org/download.html 2、在指定目录下解压缩源码文件:E:\JavaProgram\nifi,得到如下文件目录: ...

win7 下下载chrome源码重新编译

点击打开链接 一、什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能。 ...
  • yuan_lo
  • yuan_lo
  • 2017年03月26日 19:05
  • 353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信Android SDK反编译还原源码 进行修改重新编译
举报原因:
原因补充:

(最多只允许输入30个字)