为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android
一、介绍

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

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

用到的工具:

jadx: 这是一款反编译apk和jar包的工具,下载地址点我
jeb: 这也是一款查看apk源码的工具,下载地址点我
Android Studio

二、过程

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

修改OutputStream为ByteArrayOutputStream

然后在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

本文出自tpnet的博客,http://blog.csdn.net/niubitianping/article/details/78177023

点击查看更多内容
11人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消