前言如今,网络游戏用户需使用有效身份证件进行实名认证,才可保证流畅体验游戏。本文对去除实名认证弹窗进行研究,仅供学习使用。 实名认证弹窗进入某手游,首先需要注册一个账号…
前言
如今,网络游戏用户需使用有效身份证件进行实名认证,才可保证流畅体验游戏。本文对去除实名认证弹窗进行研究,仅供学习使用。
实名认证弹窗
进入某手游,首先需要注册一个账号。
注册好账号之后,进行登陆,登陆成功,弹出实名认证的对话框。
分析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代码实现去除实名认证弹窗,绕过实名认证。
- 本文作者: bmstd
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/933
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!