去除实名认证弹窗

## 前言 如今,网络游戏用户需使用有效身份证件进行实名认证,才可保证流畅体验游戏。本文对去除实名认证弹窗进行研究,仅供学习使用。 ## 实名认证弹窗 进入某手游,首先需要注册一个账号...

前言

如今,网络游戏用户需使用有效身份证件进行实名认证,才可保证流畅体验游戏。本文对去除实名认证弹窗进行研究,仅供学习使用。

实名认证弹窗

进入某手游,首先需要注册一个账号。

注册好账号之后,进行登陆,登陆成功,弹出实名认证的对话框。

分析UI

可以通过UI界面进行分析,发现使用的控件,然后再根据控件在代码中的使用情况,进行进一步逆向分析。

在目录路径:Android Sdk/tools/bin/下,有分析UI界面的一个常用的工具uiautomaatorviewer.bat。

打开工具uiautomaatorviewer.bat,获取当前界面的UI,例如选择姓名

通过工具获取到姓名的resource-id是m4399_ope_id_tv_name。

将apk文件拖入Android Killer中进行反编译,反编译成功后,在工程搜索中搜索m4399_ope_id_tv_name。

点击搜寻结果的res\values\public.xml。查找到m4399_ope_id_tv_name对应的id号。

搜索id号,知道哪些代码中使用了此id,以便继续分析。

并没有搜索到任何开发中的smali代码使用了此id。

将UI转向提交按钮再一次进行尝试。

获取到提交按钮的resource-id是m4399_ope_id_tv_commit。

在Android Killer的工程搜索中搜索m4399_ope_id_tv_commit。

点击搜寻结果的res\values\public.xml。查找到m4399_ope_id_tv_commit对应的id号。

同样搜索id号,知道哪些代码中使用了此id,以便继续分析。

仍是没有搜索到任何开发中的smali代码使用了此id。

将目标重新回到resource-id上,发现m4399_ope_id_tv_name和m4399_ope_id_tv_commit的搜索结果中均包含有smali\cn\m4399\operate\ui\widget\AntiAuthDialog.smali。

在Android Killer中定位到两者均出现在AntiAuthDialog.smali的a方法中。

将APK拖入到jadx-gui工具中进行反编译,以便于更方便的查看smali对应的java代码。

反编译后找到AntiAuthDialog.smali的a方法。代码如下:

private void a() {
    ImageView imageView = (ImageView) findViewById(n4.f("m4399_ope_id_iv_close"));
    LinearLayout linearLayout = (LinearLayout) findViewById(n4.f("m4399_ope_id_ll_account"));
    TextView textView = (TextView) findViewById(n4.f("m4399_ope_id_tv_account"));
    TextView textView2 = (TextView) findViewById(n4.f("m4399_ope_id_tv_title"));
    TextView textView3 = (TextView) findViewById(n4.f("m4399_ope_id_tv_name"));
    TextView textView4 = (TextView) findViewById(n4.f("m4399_ope_id_tv_identify"));
    TextView textView5 = (TextView) findViewById(n4.f("m4399_ope_id_tv_foreign"));
    TextView textView6 = (TextView) findViewById(n4.f("m4399_ope_id_tv_link"));
    TextView textView7 = (TextView) findViewById(n4.f("m4399_ope_id_tv_tip"));
    this.e = (TextView) findViewById(n4.f("m4399_ope_id_tv_commit"));
    TextView textView8 = (TextView) findViewById(n4.f("m4399_ope_id_tv_destroy"));
    this.c = (LimitEditText) findViewById(n4.f("m4399_ope_id_edt_name"));
    this.c.setLimitType(1);
    this.d = (LimitEditText) findViewById(n4.f("m4399_ope_id_edt_identify"));
    this.d.setLimitType(2);
    a(imageView, linearLayout, textView2, textView3, textView4, textView6, textView5);
    a(textView, textView2, textView3, textView4, textView6, textView5);
    b(textView7);
    a(textView8);
    a(imageView, linearLayout, textView6, textView5);
}

以resource-id为例m4399_ope_id_tv_commit为例。

出现的代码处为:

this.e = (TextView) findViewById(n4.f("m4399_ope_id_tv_commit"));

首先执行了

n4.f("m4399_ope_id_tv_commit")

所以代码跟进,跳转到n4.f代码处

public static int f(String str) {
    return a(str, "id");
}

n4.f调用了a("m4399_ope_id_tv_commit", "id")。

继续跟进,跳转到a代码处

public static int a(String str, String str2) {
  return a.getResources().getIdentifier(str, str2, b);
}

可以看到这款APK是通过调用getResources().getIdentifier()方式,获得资源id的,所以之前在搜索id过程中是没有结果的。

所以AntiAuthDialog.smali的a方法,主要是起初始化作用。并不是对话框的部分,不是我们要找的。

方法剖析

将思路转移,利用工具Android Device Monitor进行方法剖析。

点击start Method Profiling,然后在点击APP的提交,捕捉提交后的方法都执行了哪些。

由正向开发得知,提交按钮之后,会执行onClick方法,所以在Find中搜索onClick字符串。

得知执行了AntiAuthDialog.onClick方法,所以找到这段代码。

public void onClick(View view) {
    if (view.getId() == n4.f("m4399_ope_id_tv_commit")) {
        String obj = this.c.getText().toString();
        String obj2 = this.d.getText().toString();
        if (!s4.a("[一-龥]+", obj)) {
            y2.a(view.getContext(), n4.j("m4399_ope_bind_id_real_name_limit_chinese"));
        } else if (obj2.length() < 18 || !u2.b(obj2)) {
            y2.a(view.getContext(), n4.j("m4399_ope_bind_id_series_error"));
        } else if (u2.a(obj2) || !b2.x().r()) {
            a(this, obj, obj2);
        } else {
            dismiss();
            v.a("sdk_smrz_window_ok", new a(obj, obj2));
        }
    }
}

在上段代码中可以看到有一个dismiss()方法,执行此方法,功能为关闭对话框。

所以只要在点击提交后,跳转到dismiss()处,就可实现去除实名认证弹窗。

通过代码得知,首先判断点击的是提交按钮,然后获取输入的姓名和身份证号,接下来做各种判断。

在Android Killer中找到dismiss()。发现跳转到:cond_2处,在会执行dismiss()。

所以直接在获取姓名和身份证号之后,不做判断,直接跳转到:cond_2处,就可实现去除实名认证弹窗。

将129行代码,替换为goto :cond_2

修改后进行回编译,此时登陆游戏,输入账号密码后,不会出现实名认证弹窗而是直接进入游戏。

自定义对话框展示

可以看到AntiAuthDialog的父类是Dialog,这是一个自定义弹窗。

自定义弹窗在使用的时,会进行初始化操作,所以在工程搜索中搜索Lcn/m4399/operate/ui/widget/AntiAuthDialog;。

在搜索到的结果中可以看到,在smali.cn.m4399.operate.control.anti.k.smali的a方法中进行了new一个实例和初始化操作。

在jadx工具中找到k.smali的a方法。代码如下:

public void a(cn.m4399.operate.d dVar, Map<String, Object> map) {
  Activity i2 = b2.x().i();
  if (i2 != null && !i2.isFinishing()) {
    a(i2);
    this.a = new AntiAuthDialog(i2, dVar, new AntiAuthDialog.f().a(new l(dVar, map)).c(new View$OnClickListenerC0010k(dVar, map)).b(new j(i2, dVar)).a(this.h));
    b2.x().a().a("first_level_dialog", this.a);
    this.a.show();
  }
}

在整个方法的最后执行了a.show,展示了自定义对话框。

所以只要注释掉a.show方法,就可实现去除实名认证弹窗。

注释成功后,进行回编译,登陆游戏,输入账号密码后,不会跳出实名认证弹窗,而是直接进入游戏。

总结

通过分析UI找到资源id和对应出现的smali代码出处,并通过方法剖析掌握到函数执行过程,最后通过逆向修改smali代码实现去除实名认证弹窗,绕过实名认证。

  • 发表于 2021-12-02 16:30:36
  • 阅读 ( 12077 )
  • 分类:漏洞分析

4 条评论

0x001
未成年不会搞,成年人用不到系列
请先 登录 后评论
苏苏的五彩棒
牛啊牛啊
请先 登录 后评论
bmstd
我......我想要......我想要成为最好的红线仙啊!
请先 登录 后评论
bmstd
我......我想要......我想要成为最好的红线仙啊!
请先 登录 后评论
请先 登录 后评论
bmstd
bmstd

13 篇文章

站长统计