大神论坛

找回密码
快速注册
查看: 987 | 回复: 0

[原创] 教新手学安卓逆向之手撕 大象视频 网络校验 盗版校验

主题

帖子

6

积分

初入江湖

UID
31
积分
6
精华
威望
12 点
违规
大神币
68 枚
注册时间
2021-04-10 16:01
发表于 2021-04-18 20:42
本帖最后由 ttegame 于 2021-04-18 20:42 编辑

闲时随便找了几款视频软件,谷歌上面发现了几种,比如整点视频,南瓜影视、冬瓜影视、加菲猫影视、大象等等,随便挑了一款大象视频,发现有网络校验,不过防护强度比较弱,会点Java基本上都能黑掉保护。



准备工具
1、jadx 1.2.0
2、uiautomatorviewer



软件样品为当前最新版1.6.7,原版有3六0加固,过掉这个的软件很多,不再推荐了。过3六0后脱dex备用。




先看一下过壳后的情况,即便是hook掉原apk仍然提示版本太低。





我原先看了一遍so,没有熟悉的关键字,应该不太可能校验了签名值,像这类视频APP也不是什么大公司的软件,所以应该也没有太复杂的保护逻辑。如果不是校验的签名值,那就是校验了整个apk。通过界面观察到,背景的推荐是正常运行的,而前面的提示挡在前面,无法点击。所以我的思路是先尝试把这个提示窗口给关掉,看看能不能正常运行。





如上图,用uiautomatorviewer抓取界面后找到布局ID,可以得到helloText,那么这个helloText就是弹出盗版的窗口。把脱出来的dex丢进jadx,一搜索helloText就直达老巢了,位于Lcom/pan/onekey/light/ui/activity/MainActivity$d;
。smali要搜索helloText:I
它的Java代码如下:

public final void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
            Intrinsics.checkParameterIsNotNull(methodCall, "methodCall");
            Intrinsics.checkParameterIsNotNull(result, "result");
            String str = methodCall.method;
            if (str != null) {
                int hashCode = str.hashCode();
                if (hashCode != -1263203643) {
                    if (hashCode != 3367) {
                        if (hashCode != 104585) {
                            if (hashCode == 94426513 && str.equals("cc100")) {
                                FrameLayout frameLayout = (FrameLayout) this.a.b(R.id.helloText2);
                                Intrinsics.checkExpressionValueIsNotNull(frameLayout, "helloText2");
                                frameLayout.setVisibility(0);
                                FrameLayout frameLayout2 = (FrameLayout) this.a.b(R.id.helloText);
                                Intrinsics.checkExpressionValueIsNotNull(frameLayout2, "helloText");
                                frameLayout2.setVisibility(0);
                                ((FrameLayout) this.a.b(R.id.helloText2)).setOnTouchListener(AnonymousClass1.a);
                                return;
                            }
                        } else if (str.equals("iss")) {
                            if (methodCall.arguments != null) {
                                String str2 = this.a.getPackageCodePath() + ' ' + com.pan.onekey.light.app.b.a.b();
                                MethodChannel x = this.a.x();
                                if (x != null) {
                                    x.invokeMethod("home", String.valueOf(str2));
                                }
                                com.pan.onekey.light.app.b.a.a((String) methodCall.argument("iss"), new MainActivity$initData$1$2(this));
                                return;
                            }
                            return;
                        }
                    } else if (str.equals("ip")) {
                        if (methodCall.arguments != null) {
                            String str3 = (String) methodCall.argument("ip");
                            cn.junechiu.junecore.c.g.a("ip:: " + str3);
                            com.pan.onekey.light.app.b.a.b(String.valueOf(str3));
                            return;
                        }
                        return;
                    }
                } else if (str.equals("openUrl")) {
                    if (methodCall.arguments != null) {
                        Uri parse = Uri.parse(String.valueOf((String) methodCall.argument("gourl")));
                        Intent intent = new Intent();
                        intent.setAction("android.intent.action.VIEW");
                        intent.setData(parse);
                        this.a.startActivity(intent);
                        return;
                    }
                    return;
                }
            }
            result.notImplemented();
        }
    }




开头有个hashCode,就是哈希值,字符串哈希值。后面的android.intent.action.VIEW,点击官网更新后会打开下载url,url就是链接,gourl跳转到链接。getPackageCodePath()就是返回一个安装包的完整信息,比如代码和一些资源文件。helloText就是布局id,弹出盗版提示的时候就调用这里的代码,并且覆盖在主界面,无法关闭。


所以问题就出在94426513(0x5a0d591)这里,也就是if (hashCode == 94426513 && str.equals("cc100"))。改法也很简单,回到smali视图,看到下图的黄线处,直接把它的判断删掉即可。






改好后回填测试,需要先卸载旧版,因为缓存已经有盗版链接了。




成功!


PS:当前我的思路是屏蔽窗口,如果你想要骗过服务器的话也不是不可以。从上面的代码可以知道正确的字符串是iss,cc100则会弹出盗版窗口。那么需要分析来源,iss是怎么来的,cc100又是怎么来的。从源头入手才能骗过服务器。

返回顶部