返回列表 发新帖

【Xposed实战】Hook Activity:动态修改TextView与ImageView

  [复制链接]

6

主题

794

回帖

4026

积分

大学生

Rank: 5Rank: 5

金币
3847
好评
14
信誉
120

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

发表于 2025-11-7 23:13:07 来自手机  | 显示全部楼层 | 阅读模式  来自 山东
本帖最后由 henkeai 于 2025-11-12 22:35 编辑

软件包来自于正己大佬的教学APP,b站有大佬的教程,想学习建议观看

下面看如何使用hook通第一关

一、替换文字

Hook  Activity的onCreate方法

使用afterHokedMethod等待onCreate方法执行完成,通过findViewById获取TextView控件修改

1.打开aide创建项目


2.使用mt获取目标包名


3.使用mt的Activity记录获取Activity


4.使用界面分析查找ID


5.对HookInit.java修改


代码如下,也可用作模板对其他软件生效

  1. package com.wz; // 此软件包名

  2. import android.os.Bundle;
  3. import android.view.View;
  4. import de.robv.android.xposed.IXposedHookLoadPackage;
  5. import de.robv.android.xposed.XC_MethodHook;
  6. import de.robv.android.xposed.XposedHelpers;
  7. import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;




  8.     public class HookInit implements IXposedHookLoadPackage {

  9.         @Override
  10.         public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
  11.             if (!lpparam.packageName.equals("com.zj.wuaipojie")) return;//目标软件包名

  12.             XposedHelpers.findAndHookMethod(
  13.                 "com.zj.wuaipojie.ui.ChallengeFirst",    //用mt的Activity记录获取
  14.                 lpparam.classLoader,
  15.                 "onCreate",
  16.                 Bundle.class,
  17.                 new XC_MethodHook() {
  18.                     @Override
  19.                     protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  20.                         // 获取Activity实例
  21.                         Object activity = param.thisObject;

  22.                         // 查找TextView
  23.                         View targetView = (View) XposedHelpers.callMethod(
  24.                             activity,
  25.                             "findViewById",
  26.                             0x7f0801be   //界面分析查找ID
  27.                         );

  28.                         // 设置可见
  29.                         targetView.setVisibility(View.VISIBLE);

  30.                         // 修改内容为 明天
  31.                         XposedHelpers.callMethod(
  32.                             targetView,
  33.                             "setText",
  34.                             "明天"
  35.                         );
  36.                     }
  37.                 }
  38.             );
  39.         }

  40.     }
复制代码


6.构建app后作用到软件


7.效果展示




二、替换图片

Hook  Activity的onCreate方法

使用afterHokedMethod等待onCreate方法执行完成,通过findViewById获取ImageView

从模块中加载图片资源
创建Context获取Resources  资源文件res目录

动态获取资源ID
int resId = res.getIdentifier("a", "drawable", "com.tpth");  //a资源名,drawable资源类型,资源包名com.tpth

将目标软件ImageView的图片设置为模块中的图片

获取Drawable对象
Drawable drawable = res.getDrawable(resId);

设置到目标ImageView
((ImageView) targetView).setImageDrawable(drawable);


术语    TextView文本视图,ImageView图像视图,Resources资源,afterHokedMethod执行后,findViewById通过ID查找,Drawable资源类型

1.打开aide创建项目

2.使用mt获取目标包名

3.使用mt的Activity记录获取Activity

4.使用界面分析查找ID

5.添加要替换的图片


6.对HookInit.java修改


代码如下,也可用作模板对其他软件生效
  1. package com.tpth;// 此软件包名

  2. import android.content.Context;
  3. import android.content.res.Resources;
  4. import android.graphics.drawable.Drawable;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.ImageView;
  8. import de.robv.android.xposed.IXposedHookLoadPackage;
  9. import de.robv.android.xposed.XC_MethodHook;
  10. import de.robv.android.xposed.XposedHelpers;
  11. import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
  12. import de.robv.android.xposed.XposedBridge;
  13. import android.util.Log;

  14. public class HookInit implements IXposedHookLoadPackage {

  15.     @Override
  16.     public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
  17.         if (!lpparam.packageName.equals("com.zj.wuaipojie")) return;//目标包名

  18.         XposedHelpers.findAndHookMethod(
  19.             "com.zj.wuaipojie.ui.ChallengeFirst",//目标Activity
  20.             lpparam.classLoader,
  21.             "onCreate",
  22.             Bundle.class,
  23.             new XC_MethodHook() {
  24.                 @Override
  25.                 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  26.                     try {
  27.                         Object activity = param.thisObject;
  28.                         Context hostContext = (Context) XposedHelpers.callMethod(activity, "getApplicationContext");

  29.                         // 获取模块Context
  30.                         Context moduleContext = hostContext.createPackageContext(
  31.                             "com.tpth",//该软件的包名
  32.                             Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE
  33.                         );

  34.                         // 获取目标View
  35.                         View targetView = (View) XposedHelpers.callMethod(activity, "findViewById", 0x7f0800dd);//界面分析查找ID
  36.                         if (targetView == null) {
  37.                             XposedBridge.log("未找到目标View");
  38.                             return;
  39.                         }

  40.                         // 加载模块资源
  41.                         Resources res = moduleContext.getResources();
  42.                         int resId = res.getIdentifier("a", "drawable", "com.tpth");//动态加载com.tpth包的drawable类型中查找名为a的资源
  43.                         XposedBridge.log("资源ID: " + resId); // 调试输出

  44.                         if (resId != 0 && targetView instanceof ImageView) {
  45.                             Drawable drawable = res.getDrawable(resId);//获取Drawable对象
  46.                             ((ImageView) targetView).setImageDrawable(drawable);//设置到目标ImageView
  47.                             XposedBridge.log("替换成功");
  48.                         } else {
  49.                             XposedBridge.log("资源ID无效或View类型错误");
  50.                         }
  51.                     } catch (Exception e) {
  52.                         XposedBridge.log("替换失败: " + Log.getStackTraceString(e));
  53.                     }
  54.                 }
  55.             }
  56.         );
  57.     }
  58. }
复制代码


7.最终效果


三、补充内容

1.有些情况下TextView 是没有ID的,我们先确认它的容器类型,如LinearLayout 线性排列、RelativeLayout 相对位置排列、 ConstraintLayout  约束关系排列、FrameLayout  层叠排列 等...

2.如代码下方LinearLayout资源ID是 0x7f0a00d9

2.发现TextView和ImageView并没有id

3.使用getChildAt(index)布局顺序 定位,看到索引0是ImageView,索引1是TextView

在Android中,ViewGroup的子View是按添加顺序排列的
如下方代码
索引0:第一个添加的子View = ImageView

索引1:第二个添加的子View = TextView


res/layout/activity_main.xml如下

  1. <LinearLayout
  2.                 android:gravity="center"
  3.                 android:orientation="horizontal"
  4.                 android:id="@id/ll_main_zfb"
  5.                 android:background="@drawable/btn_light_selector"
  6.                 android:layout_width="match_parent"
  7.                 android:layout_height="48dp"
  8.                 android:layout_margin="16dp">
  9.                 <ImageView
  10.                     android:padding="1dp"
  11.                     android:layout_width="24dp"
  12.                     android:layout_height="24dp"
  13.                     android:src="@mipmap/ic_main_zfb" />
  14.                 <TextView
  15.                     android:textSize="16sp"
  16.                     android:textColor="@color/text_color_black"
  17.                     android:layout_width="wrap_content"
  18.                     android:layout_height="wrap_content"
  19.                     android:layout_marginLeft="10dp"
  20.                     android:text="@string/btn_main_zfb" />
  21.             </LinearLayout>
  22.             
复制代码


4.找到目标包名com.sun.jyc.fakewallet

5.Activity是 com.sun.jyc.fakewallet.MainActivity


代码如下,通过LinearLayout资源ID对TextView进行修改,也可用作模板对其他软件生效

  1. package com.wz; // 此软件包名

  2. import android.os.Bundle;
  3. import android.view.ViewGroup;
  4. import android.widget.LinearLayout;
  5. import android.widget.TextView;
  6. import de.robv.android.xposed.IXposedHookLoadPackage;
  7. import de.robv.android.xposed.XC_MethodHook;
  8. import de.robv.android.xposed.XposedHelpers;
  9. import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

  10. public class HookInit implements IXposedHookLoadPackage {

  11.     @Override
  12.     public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
  13.         if (!lpparam.packageName.equals("com.sun.jyc.fakewallet")) return;//目标包名

  14.         XposedHelpers.findAndHookMethod(
  15.             "com.sun.jyc.fakewallet.MainActivity",//Activity类名
  16.             lpparam.classLoader,
  17.             "onCreate",//onCreate方法
  18.             Bundle.class,
  19.             new XC_MethodHook() {
  20.                 @Override
  21.                 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  22.                     Object activity = param.thisObject;

  23.                     // 获取父容器LinearLayout
  24.                     LinearLayout parentLayout = (LinearLayout) XposedHelpers.callMethod(
  25.                         activity, "findViewById", 0x7f0a00d9
  26.                     );//LinearLayout ID

  27.                     if (parentLayout == null ) return;

  28.                     // 根据布局结构
  29.                     if (parentLayout.getChildAt(1) instanceof TextView) {
  30.                         TextView targetText = (TextView) parentLayout.getChildAt(1);
  31.                         targetText.setText("支付宝"); // 修改内容
  32.                     }
  33.                 }
  34.             }
  35.         );
  36.     }
  37. }
复制代码


修改前


修改后


四、补充内容

1.有些情况下容器也没有id,先获取包名,类名,方法名

2.获取原文本,查看界面上的文本,或者通过布局文件查看文本,原始字符串

3.递归遍历所有UI控件,找到特定文本并替换

6.通过反射尝试调用getter方法获取文本属性并修改

7.如果找到匹配的文本,替换为新文本

支持TextView的text和hint,Toolbar的title和subtitle,SearchView的query hint,任何View的contentDescription

8.由于字数限制,代码放在评论区

修改前


修改后




用到的软件与成品下载地址
https://www.123912.com/s/OaaOjv-dDrHv


本帖子中包含更多资源

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

x
回复

使用道具 举报

6

主题

794

回帖

4026

积分

大学生

Rank: 5Rank: 5

金币
3847
好评
14
信誉
120

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

发表于 2025-11-12 18:59:31 来自手机  | 显示全部楼层  来自 山东
本帖最后由 henkeai 于 2025-11-12 19:03 编辑
  1. import android.os.Bundle;
  2. import android.view.View;
  3. import android.view.ViewGroup;
  4. import android.widget.*;
  5. import android.text.SpannableString;
  6. import android.text.Spanned;
  7. import de.robv.android.xposed.IXposedHookLoadPackage;
  8. import de.robv.android.xposed.XC_MethodHook;
  9. import de.robv.android.xposed.XposedHelpers;
  10. import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
  11. import java.lang.reflect.Method;
  12. import java.util.ArrayList;
  13. import java.util.List;

  14. public class HookInit implements IXposedHookLoadPackage {

  15.     @Override
  16.     public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
  17.         if (!lpparam.packageName.equals("com.fuli")) return;

  18.         XposedHelpers.findAndHookMethod(
  19.             "com.fuli.MainActivity",
  20.             lpparam.classLoader,
  21.             "onCreate",
  22.             Bundle.class,
  23.             new XC_MethodHook() {
  24.                 @Override
  25.                 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  26.                     // 修改
  27.                     
  28.                     Henkeai.henkeai(param.thisObject, "复利计算器", "1");
  29.                     Henkeai.henkeai(param.thisObject, "初始资金(元)", "2");
  30.                     Henkeai.henkeai(param.thisObject, "请输入初始资金", "3");
  31.                     Henkeai.henkeai(param.thisObject, "每日涨幅(%)", "4");
  32.                     Henkeai.henkeai(param.thisObject, "请输入每日涨幅百分比", "5");
  33.                     Henkeai.henkeai(param.thisObject, "目标资金(元)", "6");
  34.                     Henkeai.henkeai(param.thisObject, "请输入目标资金", "7");
  35.                     Henkeai.henkeai(param.thisObject, "计算天数", "8");
  36.                     Henkeai.henkeai(param.thisObject, "功能跳转", "9");
  37.                     Henkeai.henkeai(param.thisObject, "计算结果", "10");
  38.                     Henkeai.henkeai(param.thisObject, "计算结果", "11");
  39.                     Henkeai.henkeai(param.thisObject, "等待计算...", "12");
  40.                     

  41.                     // 批量修改
  42.                    // Henkeai.modifyMultipleText(param.thisObject,
  43.                     //                                         new String[]{"a", "b", "c"},
  44.                     //                                         new String[]{"a1", "b2", "c3"}
  45.                      //                                        );
  46.                 }
  47.             }
  48.         );
  49.     }

  50.    
  51.      // 修改Android控件
  52.      
  53.     public static class Henkeai {

  54.         
  55.          // 修改所有类型的文本
  56.          
  57.         public static void henkeai(Object activity, String findText, String newText) {
  58.             try {
  59.                 View rootView = getRootView(activity);
  60.                 if (rootView instanceof ViewGroup) {
  61.                     traverseAndModifyAllText((ViewGroup) rootView, findText, newText);
  62.                 }
  63.             } catch (Exception e) {
  64.                 e.printStackTrace();
  65.             }
  66.         }

  67.         
  68.          // 批量修改文本
  69.          
  70.         public static void modifyMultipleText(Object activity, String[] findTexts, String[] newTexts) {
  71.             if (findTexts.length != newTexts.length) return;

  72.             try {
  73.                 View rootView = getRootView(activity);
  74.                 if (rootView instanceof ViewGroup) {
  75.                     for (int i = 0; i < findTexts.length; i++) {
  76.                         traverseAndModifyAllText((ViewGroup) rootView, findTexts[i], newTexts[i]);
  77.                     }
  78.                 }
  79.             } catch (Exception e) {
  80.                 e.printStackTrace();
  81.             }
  82.         }

  83.         
  84.          // 递归遍历并修改所有文本
  85.          
  86.         private static boolean traverseAndModifyAllText(ViewGroup parent, String findText, String newText) {
  87.             // 遍历父容器的所有直接子View
  88.             for (int i = 0; i < parent.getChildCount(); i++) {
  89.                 View child = parent.getChildAt(i);

  90.                 // 处理所有可能的文本控件
  91.                 if (tryModifyViewText(child, findText, newText)) {
  92.                     return true;
  93.                 }

  94.                 // 如果这个子View本身也是容器,递归遍历它的子View,递归处理子View
  95.                 if (child instanceof ViewGroup) {
  96.                     boolean found = traverseAndModifyAllText((ViewGroup) child, findText, newText);
  97.                     if (found) return true;
  98.                 }
  99.             }
  100.             return false;
  101.         }

  102.         
  103.          // 修改View的文本
  104.          
  105.         private static boolean tryModifyViewText(View view, String findText, String newText) {
  106.             try {
  107.                 // TextView及其子类 Button、EditText、CheckBox等
  108.                 if (view instanceof TextView) {
  109.                     TextView textView = (TextView) view;

  110.                     // 检查显示文本
  111.                     CharSequence text = textView.getText();
  112.                     if (text != null && findText.equals(text.toString())) {
  113.                         textView.setText(newText);
  114.                         return true;
  115.                     }

  116.                     // 检查提示文本EditText等
  117.                     CharSequence hint = textView.getHint();
  118.                     if (hint != null && findText.equals(hint.toString())) {
  119.                         textView.setHint(newText);
  120.                         return true;
  121.                     }
  122.                 }

  123.                 // Toolbar ActionBar
  124.                 if (view instanceof android.widget.Toolbar) {
  125.                     android.widget.Toolbar toolbar = (android.widget.Toolbar) view;
  126.                     CharSequence title = toolbar.getTitle();
  127.                     if (title != null && findText.equals(title.toString())) {
  128.                         toolbar.setTitle(newText);
  129.                         return true;
  130.                     }

  131.                     CharSequence subtitle = toolbar.getSubtitle();
  132.                     if (subtitle != null && findText.equals(subtitle.toString())) {
  133.                         toolbar.setSubtitle(newText);
  134.                         return true;
  135.                     }
  136.                 }

  137.                 // SearchView
  138.                 if (view instanceof SearchView) {
  139.                     SearchView searchView = (SearchView) view;

  140.                     // 通过反射获取查询提示
  141.                     try {
  142.                         Method getQueryHintMethod = SearchView.class.getMethod("getQueryHint");
  143.                         CharSequence queryHint = (CharSequence) getQueryHintMethod.invoke(searchView);
  144.                         if (queryHint != null && findText.equals(queryHint.toString())) {
  145.                             searchView.setQueryHint(newText);
  146.                             return true;
  147.                         }
  148.                     } catch (Exception e) {
  149.                         // 忽略反射错误
  150.                     }
  151.                 }

  152.                 // ProgressBar
  153.                 if (view instanceof ProgressBar) {
  154.                     CharSequence contentDesc = view.getContentDescription();
  155.                     if (contentDesc != null && findText.equals(contentDesc.toString())) {
  156.                         view.setContentDescription(newText);
  157.                         return true;
  158.                     }
  159.                 }

  160.                 // ImageView
  161.                 if (view instanceof ImageView) {
  162.                     CharSequence contentDesc = view.getContentDescription();
  163.                     if (contentDesc != null && findText.equals(contentDesc.toString())) {
  164.                         view.setContentDescription(newText);
  165.                         return true;
  166.                     }
  167.                 }

  168.                 // 任何View的内容描述
  169.                 CharSequence contentDesc = view.getContentDescription();
  170.                 if (contentDesc != null && findText.equals(contentDesc.toString())) {
  171.                     view.setContentDescription(newText);
  172.                     return true;
  173.                 }

  174.                 // 通过反射尝试获取其他文本属性
  175.                 if (tryModifyByReflection(view, findText, newText)) {
  176.                     return true;
  177.                 }

  178.             } catch (Exception e) {
  179.                 // 忽略单个View的修改错误,继续处理其他View
  180.             }
  181.             return false;
  182.         }

  183.         
  184.          // 通过反射修改其他可能的文本属性
  185.          
  186.         private static boolean tryModifyByReflection(View view, String findText, String newText) {
  187.             try {
  188.                 // 获取View的所有方法
  189.                 Method[] methods = view.getClass().getMethods();

  190.                 for (Method method : methods) {
  191.                     // 查找可能的文本获取方法
  192.                     if (method.getName().startsWith("get") &&
  193.                         method.getParameterTypes().length == 0 &&
  194.                         CharSequence.class.isAssignableFrom(method.getReturnType())) {

  195.                         try {
  196.                             CharSequence text = (CharSequence) method.invoke(view);
  197.                             if (text != null && findText.equals(text.toString())) {
  198.                                 // 查找对应的setter方法
  199.                                 String setterName = "set" + method.getName().substring(3);
  200.                                 try {
  201.                                     Method setter = view.getClass().getMethod(setterName, CharSequence.class);
  202.                                     setter.invoke(view, newText);
  203.                                     return true;
  204.                                 } catch (Exception e) {
  205.                                     // 尝试其他类型的setter
  206.                                     try {
  207.                                         Method setter = view.getClass().getMethod(setterName, String.class);
  208.                                         setter.invoke(view, newText);
  209.                                         return true;
  210.                                     } catch (Exception e2) {
  211.                                         // 继续尝试其他方法
  212.                                     }
  213.                                 }
  214.                             }
  215.                         } catch (Exception e) {
  216.                             // 继续尝试其他方法
  217.                         }
  218.                     }
  219.                 }
  220.             } catch (Exception e) {
  221.                 // 忽略反射错误
  222.             }
  223.             return false;
  224.         }

  225.         
  226.          // 获取所有包含指定文本的View
  227.          
  228.         public static List<View> findAllViewsWithText(Object activity, String findText) {
  229.             List<View> result = new ArrayList<>();
  230.             try {
  231.                 View rootView = getRootView(activity);
  232.                 if (rootView instanceof ViewGroup) {
  233.                     findAllViewsWithText((ViewGroup) rootView, findText, result);
  234.                 }
  235.             } catch (Exception e) {
  236.                 e.printStackTrace();
  237.             }
  238.             return result;
  239.         }
  240.         
  241.         //递归查找包含指定文本的View
  242.         private static void findAllViewsWithText(ViewGroup parent, String findText, List<View> result) {
  243.             for (int i = 0; i < parent.getChildCount(); i++) {
  244.                 View child = parent.getChildAt(i);

  245.                 if (containsText(child, findText)) {
  246.                     result.add(child);
  247.                 }

  248.                 if (child instanceof ViewGroup) {
  249.                     findAllViewsWithText((ViewGroup) child, findText, result);
  250.                 }
  251.             }
  252.         }

  253.         
  254.          // 检查View是否包含指定文本
  255.          
  256.         private static boolean containsText(View view, String findText) {
  257.             try {
  258.                 // TextView及其子类
  259.                 if (view instanceof TextView) {
  260.                     TextView textView = (TextView) view;
  261.                     if (findText.equals(textView.getText().toString()) ||
  262.                         findText.equals(textView.getHint().toString())) {
  263.                         return true;
  264.                     }
  265.                 }

  266.                 // Toolbar
  267.                 if (view instanceof android.widget.Toolbar) {
  268.                     android.widget.Toolbar toolbar = (android.widget.Toolbar) view;
  269.                     if (findText.equals(toolbar.getTitle().toString()) ||
  270.                         findText.equals(toolbar.getSubtitle().toString())) {
  271.                         return true;
  272.                     }
  273.                 }

  274.                 // 内容描述
  275.                 CharSequence contentDesc = view.getContentDescription();
  276.                 if (contentDesc != null && findText.equals(contentDesc.toString())) {
  277.                     return true;
  278.                 }

  279.             } catch (Exception e) {
  280.                 // 忽略错误
  281.             }
  282.             return false;
  283.         }

  284.         // 获取Activity的根视图
  285.         private static View getRootView(Object activity) throws Exception {
  286.             Object window = XposedHelpers.callMethod(activity, "getWindow");
  287.             return (View) XposedHelpers.callMethod(window, "getDecorView");
  288.         }
  289.     }
  290. }
复制代码
回复

使用道具 举报

8

主题

1151

回帖

4249

积分

大学生

Rank: 5Rank: 5

金币
1102
好评
8
信誉
117
发表于 2025-11-7 23:16:25 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

12

主题

4209

回帖

1万

积分

博士生

......

Rank: 7Rank: 7Rank: 7

金币
683
好评
18
信誉
100

考神MT论坛新人MT论坛最佳新人MT论坛帅哥挂机大佬

QQ
发表于 2025-11-7 23:19:08 来自手机  | 显示全部楼层  来自 江西
看看隐藏
回复

使用道具 举报

134

主题

3460

回帖

1万

积分

博士生

无敌最俊朗

Rank: 7Rank: 7Rank: 7

金币
3010
好评
49
信誉
105
发表于 2025-11-7 23:19:15 来自手机  | 显示全部楼层  来自 浙江
看看学习学习
回复

使用道具 举报

8

主题

1478

回帖

2898

积分

大学生

Rank: 5Rank: 5

金币
553
好评
1
信誉
100
发表于 2025-11-7 23:22:33 来自手机  | 显示全部楼层  来自 河南
学习一下
回复

使用道具 举报

6

主题

6282

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1201
好评
5
信誉
102
发表于 2025-11-7 23:30:34 来自手机  | 显示全部楼层  来自 江苏
看看隐藏
回复

使用道具 举报

24

主题

4586

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4377
好评
7
信誉
91
发表于 2025-11-7 23:34:03 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

1

主题

336

回帖

1302

积分

高中生

Rank: 4

金币
744
好评
0
信誉
79
发表于 2025-11-7 23:39:14 来自手机  | 显示全部楼层  来自 湖南
cdydy
回复

使用道具 举报

152

主题

7921

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
11462
好评
10
信誉
104

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

发表于 2025-11-7 23:41:40 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

77

主题

3065

回帖

8753

积分

硕士生

Rank: 6Rank: 6

金币
4377
好评
0
信誉
100
发表于 2025-11-7 23:43:01 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

2

主题

2760

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1435
好评
0
信誉
100
发表于 2025-11-7 23:43:49 来自手机  | 显示全部楼层  来自 广西
看看隐藏
回复

使用道具 举报

20

主题

4549

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
7613
好评
3
信誉
100

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

发表于 2025-11-7 23:53:42 来自手机  | 显示全部楼层  来自 广东
看看内容学习
回复

使用道具 举报

10

主题

7203

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
5145
好评
1
信誉
91

MT论坛最佳新人考神

发表于 2025-11-7 23:55:28 来自手机  | 显示全部楼层  来自 湖北
看看隐藏
回复

使用道具 举报

19

主题

1872

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4944
好评
24
信誉
133

考神

发表于 2025-11-7 23:55:37 来自手机  | 显示全部楼层  来自 福建
看看
回复

使用道具 举报

64

主题

8938

回帖

2万

积分

博士后

学渣

Rank: 8Rank: 8

金币
3158
好评
54
信誉
133

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

发表于 2025-11-8 00:02:08 来自手机  | 显示全部楼层  来自 江苏
学习学习
回复

使用道具 举报

发表回复

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

本版积分规则

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