返回列表 发新帖

【原创教程】新人发帖第三贴之暴力去除apk安装检查详细.....

  [复制链接]

3

主题

73

回帖

461

积分

初中生

Rank: 3Rank: 3

金币
268
好评
8
信誉
110
发表于 5 天前 | 显示全部楼层 | 阅读模式  来自 湖南
ok我又来发帖了朋友们,这次也是一个详细教程,会带着大家大家一步来逆向这个APP
继续经典边写文章边分析,这次我们来逆向Realme手机的手机管家,相信大家在安装app的时候肯定有遇到过安装新安装的APP
但是不准你安装的时候,这次我来教大家怎么hook检查安装这个功能(类似下图)

来跟着小杰的思路一起来学习怎么逆向这个功能
首先打开MT管理器点击Activity记录
通过这一步我们可以看到屏幕最顶层显示的类

然后安装一个演员APP(我这里用的算法助手,膜拜军哥大佬)
因为我发现我安装那种云控APP居然没有弹出不让我安装,但是算法助手居然不行
不管他了,ok然后会弹一个不让安装的提示
然后回到MT管理器,看一下记录的Activity记录

也就是这个应用包安装器,看一下报名oplus就知道这肯定是厂家弄的
先不管他先提取出APP

提前第一个
一般逆向思路都是先根据字符串定位,没有的话在思考别的
所以我先定位高风险看看有没有记录这个字符串
这里为了分析方便我选择采用jadx

可以看到空空如也,然后呢字符串索引失败我们该怎么继续往下走
大家可以看到我之前的图那个activity记录,里面有显示最上层的类名
也就是com.oplus.appdetail.model.guide.ui.InstallGuideActivity
那我们直接进来这个类看看
  1. package com.oplus.appdetail.model.guide.ui;

  2. import android.content.ComponentName;
  3. import android.content.ContentResolver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.database.ContentObserver;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.provider.Settings;
  11. import android.text.TextUtils;
  12. import android.widget.FrameLayout;
  13. import androidx.fragment.app.Fragment;
  14. import androidx.fragment.app.r;
  15. import androidx.lifecycle.LifecycleOwnerKt;
  16. import com.oplus.appdetail.R;
  17. import com.oplus.appdetail.base.activity.BaseActivity;
  18. import com.oplus.appdetail.install.AppInstallManager;
  19. import com.oplus.appdetail.model.finish.InstallFinishActivity;
  20. import com.oplus.appdetail.model.guide.repository.ExtJumpParam;
  21. import com.oplus.appdetail.model.guide.repository.netrequest.g;
  22. import com.oplus.appdetail.model.guide.viewModel.GuideShareViewModel;
  23. import com.oplus.appdetail.modelv2.helper.c;
  24. import ge.o;
  25. import he.d;
  26. import kotlin.jvm.internal.s;
  27. import kotlinx.coroutines.j;
  28. import org.jetbrains.annotations.NotNull;
  29. import org.jetbrains.annotations.Nullable;

  30. /* compiled from: InstallGuideActivity.kt */
  31. /* loaded from: classes2.dex */
  32. public final class InstallGuideActivity extends BaseActivity {
  33.     private GuideShareViewModel K;
  34.     private ContentObserver L;
  35.     private ContentObserver M;

  36.     /* compiled from: InstallGuideActivity.kt */
  37.     /* loaded from: classes2.dex */
  38.     public static final class a extends ContentObserver {

  39.         /* renamed from: a  reason: collision with root package name */
  40.         final /* synthetic */ Uri f13262a;

  41.         /* renamed from: b  reason: collision with root package name */
  42.         final /* synthetic */ InstallGuideActivity f13263b;

  43.         /* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
  44.         a(Handler handler, Uri uri, InstallGuideActivity installGuideActivity) {
  45.             super(handler);
  46.             this.f13262a = uri;
  47.             this.f13263b = installGuideActivity;
  48.         }

  49.         @Override // android.database.ContentObserver
  50.         public void onChange(boolean z10, @Nullable Uri uri) {
  51.             if (s.a(this.f13262a, uri)) {
  52.                 this.f13263b.E0();
  53.             }
  54.         }
  55.     }

  56.     /* compiled from: InstallGuideActivity.kt */
  57.     /* loaded from: classes2.dex */
  58.     public static final class b extends ContentObserver {

  59.         /* renamed from: a  reason: collision with root package name */
  60.         final /* synthetic */ Uri f13264a;

  61.         /* renamed from: b  reason: collision with root package name */
  62.         final /* synthetic */ InstallGuideActivity f13265b;

  63.         /* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
  64.         b(Handler handler, Uri uri, InstallGuideActivity installGuideActivity) {
  65.             super(handler);
  66.             this.f13264a = uri;
  67.             this.f13265b = installGuideActivity;
  68.         }

  69.         @Override // android.database.ContentObserver
  70.         public void onChange(boolean z10, @Nullable Uri uri) {
  71.             if (s.a(this.f13264a, uri)) {
  72.                 this.f13265b.E0();
  73.             }
  74.         }
  75.     }

  76.     /* JADX INFO: Access modifiers changed from: private */
  77.     public final void C0() {
  78.         GuideShareViewModel guideShareViewModel = this.K;
  79.         if (guideShareViewModel == null) {
  80.             s.x("mViewModel");
  81.             guideShareViewModel = null;
  82.         }
  83.         guideShareViewModel.d().observe(this, new com.oplus.appdetail.model.guide.ui.b(new InstallGuideActivity$addFragmentReloadObserver$1(this)));
  84.     }

  85.     /* JADX INFO: Access modifiers changed from: private */
  86.     public final void D0() {
  87.         FrameLayout frameLayout = new FrameLayout(this);
  88.         frameLayout.setLayoutParams(new FrameLayout.LayoutParams(-1, -1));
  89.         frameLayout.setClipToPadding(false);
  90.         frameLayout.setId(R.id.view_id_contentview);
  91.         setContentView(frameLayout);
  92.     }

  93.     /* JADX INFO: Access modifiers changed from: private */
  94.     public final void E0() {
  95.         GuideShareViewModel guideShareViewModel = this.K;
  96.         GuideShareViewModel guideShareViewModel2 = null;
  97.         if (guideShareViewModel == null) {
  98.             s.x("mViewModel");
  99.             guideShareViewModel = null;
  100.         }
  101.         ExtJumpParam c10 = guideShareViewModel.c();
  102.         GuideShareViewModel guideShareViewModel3 = this.K;
  103.         if (guideShareViewModel3 == null) {
  104.             s.x("mViewModel");
  105.         } else {
  106.             guideShareViewModel2 = guideShareViewModel3;
  107.         }
  108.         guideShareViewModel2.i();
  109.         Fragment a10 = c.a(c10);
  110.         if (a10 instanceof com.oplus.appdetail.base.activity.a) {
  111.             t0((com.oplus.appdetail.base.activity.a) a10);
  112.         }
  113.         r m10 = M().m();
  114.         if (M().k0("guide_fragment") != null) {
  115.             m10.q(R.anim.guide_activity_fade_in, R.anim.activity_fade_out_500);
  116.         }
  117.         m10.p(R.id.view_id_contentview, a10, "guide_fragment");
  118.         m10.i();
  119.     }

  120.     /* JADX INFO: Access modifiers changed from: private */
  121.     public final void F0(Context context, Handler handler) {
  122.         Uri uriFor = Settings.Secure.getUriFor("minors_mode_enabled");
  123.         s.e(uriFor, "getUriFor("minors_mode_enabled")");
  124.         this.M = new a(handler, uriFor, this);
  125.         ContentResolver contentResolver = context.getContentResolver();
  126.         ContentObserver contentObserver = this.M;
  127.         if (contentObserver == null) {
  128.             s.x("mEnableStateObserver");
  129.             contentObserver = null;
  130.         }
  131.         contentResolver.registerContentObserver(uriFor, false, contentObserver);
  132.     }

  133.     /* JADX INFO: Access modifiers changed from: private */
  134.     public final void G0(Context context, Handler handler) {
  135.         Uri uriFor = Settings.Secure.getUriFor("minors_mode_other_install_type");
  136.         s.e(uriFor, "getUriFor("minors_mode_other_install_type")");
  137.         this.L = new b(handler, uriFor, this);
  138.         ContentResolver contentResolver = context.getContentResolver();
  139.         ContentObserver contentObserver = this.L;
  140.         if (contentObserver == null) {
  141.             s.x("mInstallStateObserver");
  142.             contentObserver = null;
  143.         }
  144.         contentResolver.registerContentObserver(uriFor, false, contentObserver);
  145.     }

  146.     private final void H0() {
  147.         if (getIntent() != null && this.K != null) {
  148.             ComponentName component = getIntent().getComponent();
  149.             GuideShareViewModel guideShareViewModel = this.K;
  150.             if (guideShareViewModel == null) {
  151.                 s.x("mViewModel");
  152.                 guideShareViewModel = null;
  153.             }
  154.             ExtJumpParam c10 = guideShareViewModel.c();
  155.             if (component != null && c10 != null) {
  156.                 boolean isFullDecouple = c10.isFullDecouple();
  157.                 boolean equals = TextUtils.equals(component.getClassName(), InstallFinishActivity.class.getName());
  158.                 if (isFullDecouple && !equals) {
  159.                     AppInstallManager.q(c10.getExtJumpTag(), null, false, false);
  160.                     AppInstallManager.p(c10.getExtJumpTag(), this);
  161.                     g.d(c10.getInstallTrackId());
  162.                 }
  163.             }
  164.         }
  165.     }

  166.     /* JADX INFO: Access modifiers changed from: protected */
  167.     @Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, android.app.Activity
  168.     public void onActivityResult(int i10, int i11, @Nullable Intent intent) {
  169.         super.onActivityResult(i10, i11, intent);
  170.         if (i10 != 999) {
  171.             return;
  172.         }
  173.         int i12 = -1;
  174.         if (intent != null) {
  175.             i12 = intent.getIntExtra("key_authentication_type", -1);
  176.         }
  177.         if (i11 != 100) {
  178.             if (i11 != 101) {
  179.                 fe.g.a("InstallGuideActivity", "onActivityResult minors verify other");
  180.             } else {
  181.                 fe.g.a("InstallGuideActivity", "onActivityResult minors verify fail");
  182.             }
  183.         } else {
  184.             GuideShareViewModel guideShareViewModel = this.K;
  185.             if (guideShareViewModel == null) {
  186.                 s.x("mViewModel");
  187.                 guideShareViewModel = null;
  188.             }
  189.             guideShareViewModel.g(i11);
  190.         }
  191.         o.t(d.g().h(this), fd.g.a(), i11, i12, "1");
  192.         fe.g.a("InstallGuideActivity", "onActivityResult minors verify resultCode : " + i11 + ", type : " + i12);
  193.     }

  194.     /* JADX INFO: Access modifiers changed from: protected */
  195.     @Override // com.oplus.appdetail.base.activity.BaseActivity, androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
  196.     public void onCreate(@Nullable Bundle bundle) {
  197.         super.onCreate(bundle);
  198.         if (getIntent() != null) {
  199.             j.d(LifecycleOwnerKt.getLifecycleScope(this), null, null, new InstallGuideActivity$onCreate$1(this, null), 3, null);
  200.             return;
  201.         }
  202.         o.A(null, "intent_null", null);
  203.         kc.b.g(this);
  204.     }

  205.     /* JADX INFO: Access modifiers changed from: protected */
  206.     @Override // androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, android.app.Activity
  207.     public void onDestroy() {
  208.         super.onDestroy();
  209.         ContentObserver contentObserver = null;
  210.         if (this.L != null) {
  211.             ContentResolver contentResolver = getContentResolver();
  212.             ContentObserver contentObserver2 = this.L;
  213.             if (contentObserver2 == null) {
  214.                 s.x("mInstallStateObserver");
  215.                 contentObserver2 = null;
  216.             }
  217.             contentResolver.unregisterContentObserver(contentObserver2);
  218.         }
  219.         if (this.M != null) {
  220.             ContentResolver contentResolver2 = getContentResolver();
  221.             ContentObserver contentObserver3 = this.M;
  222.             if (contentObserver3 == null) {
  223.                 s.x("mEnableStateObserver");
  224.             } else {
  225.                 contentObserver = contentObserver3;
  226.             }
  227.             contentResolver2.unregisterContentObserver(contentObserver);
  228.         }
  229.         H0();
  230.     }

  231.     /* JADX INFO: Access modifiers changed from: protected */
  232.     @Override // com.oplus.appdetail.base.activity.BaseActivity, androidx.fragment.app.FragmentActivity, android.app.Activity
  233.     public void onResume() {
  234.         super.onResume();
  235.         GuideShareViewModel guideShareViewModel = this.K;
  236.         if (guideShareViewModel != null) {
  237.             GuideShareViewModel guideShareViewModel2 = null;
  238.             if (guideShareViewModel == null) {
  239.                 s.x("mViewModel");
  240.                 guideShareViewModel = null;
  241.             }
  242.             if (guideShareViewModel.c() != null) {
  243.                 GuideShareViewModel guideShareViewModel3 = this.K;
  244.                 if (guideShareViewModel3 == null) {
  245.                     s.x("mViewModel");
  246.                 } else {
  247.                     guideShareViewModel2 = guideShareViewModel3;
  248.                 }
  249.                 ExtJumpParam c10 = guideShareViewModel2.c();
  250.                 s.c(c10);
  251.                 fd.g.b(c10.getExtJumpTag());
  252.             }
  253.         }
  254.     }

  255.     /* JADX INFO: Access modifiers changed from: protected */
  256.     @Override // com.oplus.appdetail.base.activity.BaseActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
  257.     public void onSaveInstanceState(@NotNull Bundle outState) {
  258.         s.f(outState, "outState");
  259.         super.onSaveInstanceState(outState);
  260.         GuideShareViewModel guideShareViewModel = this.K;
  261.         if (guideShareViewModel != null) {
  262.             if (guideShareViewModel == null) {
  263.                 s.x("mViewModel");
  264.                 guideShareViewModel = null;
  265.             }
  266.             outState.putBoolean("isFullDecouple", guideShareViewModel.f());
  267.         }
  268.     }

  269.     /* JADX INFO: Access modifiers changed from: protected */
  270.     @Override // com.oplus.appdetail.base.activity.BaseActivity
  271.     public void r0(@Nullable Bundle bundle) {
  272.         super.r0(bundle);
  273.         if (bundle != null && bundle.getBoolean("isFullDecouple", false)) {
  274.             com.oplus.appdetail.install.a.a(this);
  275.         }
  276.     }
  277. }
复制代码
这里贴一下这个类完整代码
这里教一下大家怎拆解
  1. public final class InstallGuideActivity extends BaseActivity {
  2.     private GuideShareViewModel K;
  3.     private ContentObserver L;
  4.     private ContentObserver M;
复制代码
首先 extends 了一个base activity 说明这是一个activity页面,封装了视图的基础能力,
private GuideShareViewModel K;
    private ContentObserver L;
    private ContentObserver M;
有三个成员变量 第一个是viewmodel 存储状态的
有两个contentobserver a和b 这两个是用来监听变化的
contentobserver会有三个需要重写的方法
registerContentObserver注册,onChange回调触发业务方法,unregister销毁反注册
一般分析回调onchange

然后我带大家来看一下这两个onchange都是调用了e0方法
说明这个e0是古希腊掌管代码变化的神,一个安装页面又能安装又能不让你安装
肯定是有个什么东东控制了,这个e0就是那个东东
那我们肯定分析e0
  1. public final void E0() {
  2.         GuideShareViewModel guideShareViewModel = this.K;
  3.         GuideShareViewModel guideShareViewModel2 = null;
  4.         if (guideShareViewModel == null) {
  5.             s.x("mViewModel");
  6.             guideShareViewModel = null;
  7.         }
  8.         ExtJumpParam c10 = guideShareViewModel.c();
  9.         GuideShareViewModel guideShareViewModel3 = this.K;
  10.         if (guideShareViewModel3 == null) {
  11.             s.x("mViewModel");
  12.         } else {
  13.             guideShareViewModel2 = guideShareViewModel3;
  14.         }
  15.         guideShareViewModel2.i();
  16.         Fragment a10 = c.a(c10);
  17.         if (a10 instanceof com.oplus.appdetail.base.activity.a) {
  18.             t0((com.oplus.appdetail.base.activity.a) a10);
  19.         }
  20.         r m10 = M().m();
  21.         if (M().k0("guide_fragment") != null) {
  22.             m10.q(R.anim.guide_activity_fade_in, R.anim.activity_fade_out_500);
  23.         }
  24.         m10.p(R.id.view_id_contentview, a10, "guide_fragment");
  25.         m10.i();
  26.     }
复制代码
来带大家分析下
  1.   private GuideShareViewModel K;
  2.     private ContentObserver L;
  3.     private ContentObserver M;     GuideShareViewModel guideShareViewModel = this.K;
  4. 这个也就是我们sharevm对象 控制视图的
  5.      ExtJumpParam c10 = guideShareViewModel.c();
  6. 从这个视图对象获取跳转参数c10
  7. 为后续跳转做准备
  8.    GuideShareViewModel guideShareViewModel3 = this.K;
  9. vm3也是我们的viewmodel对象
  10.   guideShareViewModel2 = guideShareViewModel3;
  11. vm2也是,所以其实vm1-3其实都是同一个对象
  12.   guideShareViewModel2.i();
  13. 这里viewmodel执行了一个i方法
  14. 我看了一下是个埋点的void方法 本来想带着分析下的 但是这个是干扰项没用就忽略它
  15.   Fragment a10 = c.a(c10);走到这一行
  16. 是一个fragment
复制代码
fragment这里得重点强调
先给大家普及一下小知识,一个activity我们可以看作成一个浏览器,而fragment便是浏览器的一个个网页
所以一个activity能变化出不同的样式,fragment是一个很关键的东西
Fragment a10 = c.a(c10);
并且传参是c10,刚好是那个跳转参数
ok大概这就应该是我们要找的东西了,跟进去
  1. public static final Fragment a(@Nullable ExtJumpParam extJumpParam) {
  2.         String str;
  3.         boolean z10;
  4.         Context appContext = AppUtil.getAppContext();
  5.         String str2 = null;
  6.         if (mc.d.b(appContext)) {
  7.             if (extJumpParam != null) {
  8.                 str = extJumpParam.getPackageUri();
  9.             } else {
  10.                 str = null;
  11.             }
  12.             if (str != null && str.length() != 0) {
  13.                 z10 = false;
  14.             } else {
  15.                 z10 = true;
  16.             }
  17.             if (!z10) {
  18.                 GuideFragmentType guideFragmentType = GuideFragmentType.ScanningGuide;
  19.                 if (extJumpParam != null) {
  20.                     str2 = extJumpParam.getExtJumpTag();
  21.                 }
  22.                 o.Q(guideFragmentType, str2);
  23.                 if (n.e(appContext)) {
  24.                     if (n.d(appContext)) {
  25.                         return new EnhanceMinorsFragment();
  26.                     }
  27.                     return new BasicMinorsFragment();
  28.                 }
  29.                 return new EnhanceGuardFragment();
  30.             }
  31.         }
  32.         GuideFragmentType guideFragmentType2 = GuideFragmentType.NoScanningGuide;
  33.         if (extJumpParam != null) {
  34.             str2 = extJumpParam.getExtJumpTag();
  35.         }
  36.         o.Q(guideFragmentType2, str2);
  37.         return new id.b();
  38.     }
  39. }
复制代码
这就是他的代码
游客,如果您要查看本帖隐藏内容请回复


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有2人评分好评 金币 理由
swaloy + 1 + 1
青春向上 + 1 膜拜大佬[赞]

查看全部评分 总评分:好评 +1  金币 +2 

回复

使用道具 举报

3

主题

73

回帖

461

积分

初中生

Rank: 3Rank: 3

金币
268
好评
8
信誉
110
发表于 5 天前 | 显示全部楼层  来自 湖南
可以不可以学习的同时动动小手给我一个金币呀,万分感谢!!
已有1人评分好评 金币 理由
ꫛ讲究 + 1 + 1 好评

查看全部评分 总评分:好评 +1  金币 +1 

回复

使用道具 举报

235

主题

9750

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
3141
好评
27
信誉
94

考神MT论坛新人MT论坛活跃会员

发表于 5 天前 来自手机  | 显示全部楼层  来自 广东
我都是直接卸载这个手机管家,直接就不显示了。就不检测了,无论什么软件都显示这样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

3

主题

73

回帖

461

积分

初中生

Rank: 3Rank: 3

金币
268
好评
8
信誉
110
发表于 5 天前 | 显示全部楼层  来自 湖南
网暴真的太可怕了 发表于 2026-9-7 20:09
我都是直接卸载这个手机管家,直接就不显示了。就不检测了,无论什么软件都显示这样 ...

哎呀这种惊天大秘密居然被你发现了
回复

使用道具 举报

15

主题

735

回帖

3099

积分

大学生

Rank: 5Rank: 5

金币
1034
好评
1
信誉
103
发表于 5 天前 来自手机  | 显示全部楼层  来自 广东
神帖真的神帖啊
回复

使用道具 举报

6

主题

4528

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
6133
好评
9
信誉
110
发表于 5 天前 来自手机  | 显示全部楼层  来自 广东
好厉害,感谢分享太强了值得学习
回复

使用道具 举报

13

主题

703

回帖

2581

积分

大学生

Rank: 5Rank: 5

金币
914
好评
5
信誉
101
发表于 5 天前 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

13

主题

703

回帖

2581

积分

大学生

Rank: 5Rank: 5

金币
914
好评
5
信誉
101
发表于 5 天前 来自手机  | 显示全部楼层  来自 浙江
需要root才能安装系统类的包吧
回复

使用道具 举报

3

主题

1586

回帖

4880

积分

大学生

Rank: 5Rank: 5

金币
2146
好评
0
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 5 天前 来自手机  | 显示全部楼层  来自 江西
看看
回复

使用道具 举报

1

主题

568

回帖

1449

积分

高中生

Rank: 4

金币
813
好评
1
信誉
100
发表于 5 天前 来自手机  | 显示全部楼层  来自 广西
回复

使用道具 举报

9

主题

5795

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
9010
好评
0
信誉
102

MT论坛最佳新人MT论坛帅哥考神MT论坛新人

发表于 5 天前 来自手机  | 显示全部楼层  来自 湖北
看看
回复

使用道具 举报

26

主题

3750

回帖

7508

积分

硕士生

Rank: 6Rank: 6

金币
173
好评
2
信誉
94

考神MT论坛新人MT论坛帅哥MT论坛最佳新人

发表于 5 天前 来自手机  | 显示全部楼层  来自 江西
樱落 发表于 2026-9-7 20:18
需要root才能安装系统类的包吧

你好聪明
回复

使用道具 举报

35

主题

6710

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
493
好评
9
信誉
125

MT论坛帅哥MT论坛新人考神MT论坛最佳新人

发表于 5 天前 来自手机  | 显示全部楼层  来自 山东
感谢分享
回复

使用道具 举报

0

主题

3231

回帖

7345

积分

硕士生

Rank: 6Rank: 6

金币
3553
好评
0
信誉
100

MT论坛新人考神MT论坛帅哥

发表于 5 天前 来自手机  | 显示全部楼层  来自 浙江
感谢分享
回复

使用道具 举报

0

主题

176

回帖

360

积分

初中生

Rank: 3Rank: 3

金币
182
好评
0
信誉
100
发表于 5 天前 来自手机  | 显示全部楼层  来自 湖北
感谢分享
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表