[2016/8/24]初试xposed模块编写 – 追书神器去更新

  • 2016-08-24
  • 0
  • 0

无意间翻到了Sollyu的Xposed模块编写教程,所以写个简单的东西测试一下。 

Xposed API : XDA原贴 

由于初试,也不打算折腾太多东西,本来想写追书神器的去广告的,然而反编译以后发现,里面七七八八的广告真是太多了,打算先做个简单的试试效果,正好网上下载的去广告版本没有屏蔽更新,索性简单的写一个去更新模块。 

在看雪翻了一个JEB2.2.5的破解版:看雪原贴 

初期的创建工程、添加Xposed API模块和简单的设置就不提了,百度能查到的Xposed模块编写基本都是这些。。。 

然后掏出JEB2.2.5分析追书神器的APK。
先找到调用更新方法的地方,由于程序比较复杂,比较难找

最后在

com.ushaqi.zhuishushenqi.ui.home.HomeParentActivity 里的onCreate方法里面找到了调用的地方

    public void onCreate(Bundle arg2) {
        super.onCreate(arg2);
        com.umeng.update.b.a(((Context)this));//更新调用
        if(this.b()) {
            com.umeng.update.b.a(new l(this));
        }
    }

继续跟进到方法里面

    public static void a(Context arg3) {
        k.a(false);
        k.b(false);
        Context v0 = arg3.getApplicationContext();
        if(v0 != null) {
            goto label_9;
        }

        try {
            u.a.b.b("update", "unexpected null context in update");
            return;
        label_9:
            b.f = new c(v0.getMainLooper());
            b.c(v0);
            if(!u.a.a.c(v0)) {//检测是否是wifi网络,貌似这里也能做更新屏蔽,不过最后我选择在下面来处理
                if(k.e()) {
                    b.b(2, null);
                    return;
                }
                else if((k.a()) && !k.c()) {
                    b.b(2, null);
                    return;
                }
            }

            if(b.e.a()) {
                b.b(4, null);
                u.a.b.a("update", "Is updating now.");
                b.f.post(new d(v0));
                return;
            }

            b.d = v0;
            new Thread(new j(v0.getApplicationContext())).start();//获取更新的线程
        }
        catch(Exception v0_1) {
            u.a.b.b("update", "Exception occurred in Mobclick.update(). ", v0_1);
        }
    }

走到线程的run方法

public final void run() {
        StringBuilder v2_1;
        String v3_1;
        UpdateResponse v3 = null;
        int v2 = 1;
        try {
            UpdateResponse v0_2 = new n(this.a).a();//获取更新信息
            if(v0_2 == null) {
                b.a(3, null);
                return;
            }

            if(!v0_2.hasUpdate) {//更新判断
                b.a(1, v0_2);
                return;
            }

            b.a(0, v0_2);
        }
        catch(Exception v0) {
            b.a(((int)v2_1), ((UpdateResponse)v3_1));
            String v2_2 = "request update error";
            u.a.b.a("update", v2_2, v0);
        }
        catch(Error v0_1) {
            v3_1 = "request update error";
            v2_1 = new StringBuilder(v3_1);
            u.a.b.a("update", v2_1.append(v0_1.getMessage()).toString());
        }
    }

最后选择在获取更新信息的时候返回的hasUpdate为false来屏蔽更新,也许不是最好的地方,但是还是可以实现目的。 

所以继续跟进到n的a方法

    public final UpdateResponse a() { //我最后选择hook的方法
        f v0_1;
        b.c(n.c, String.format("is .so file ready: %b", Boolean.valueOf(DeltaUpdate.a())));
        q v2 = new q(this.a);
        UpdateResponse v0 = null;
        int v1;
        for(v1 = 0; v1 < 2; ++v1) {
            v2.a(this.b[v1]);
            v0_1 = this.a(((e)v2), UpdateResponse.class);
            if(v0_1 != null) {
                break;
            }
        }

        return ((UpdateResponse)v0_1);
    }

确定了目标就可以开始编写代码了,很简单的几句话

 public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if(loadPackageParam.packageName.equals("com.ushaqi.zhuishushenqi")) //判断包名,选择应用
        {
            XposedBridge.log("Loding in zssq"); //日志输出
            //Hook程序中com.umeng.update.n的a方法
            XposedHelpers.findAndHookMethod("com.umeng.update.n", loadPackageParam.classLoader, "a", new XC_MethodHook() {
                //选择在返回后进行处理
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    if (param.getResult() != null) //返回不为null
                    {
                        XposedBridge.log("Start Hook");
                        boolean res = XposedHelpers.getBooleanField(param.getResult(), "hasUpdate");//获取hasUpdate的内容
                        XposedBridge.log("Get Result: hasUpdate=" + res);
                        XposedHelpers.setBooleanField(param.getResult(), "hasUpdate", false);//修改hasUpdate为false
                    }
                }
            });
        }
}

最后测试,打开应用的时候已经不再提示更新了,屏蔽更新成功。

评论

还没有任何评论,你来说两句吧