任务一:Android逆向

首先我使用了一个叫objection的东西。

列出了他所有的活动界面,列出来之后在慢慢筛选。

然后用了一个命令,就是可以跳到这个活动界面的命令。

我就确定了这个活动界面的位置,然后我就采取了objection的另一种栈追踪。

追踪到了这个地方。

先打印出具有特征参数的值,在从里面筛选。

Java.perform(function() {
    // 获取 MsgUIData 类的引用
    var MsgUIData = Java.use('com.xingin.chatbase.bean.MsgUIData');
    
    // 获取该类所有的方法
    var methods = MsgUIData.class.getDeclaredMethods();
    
    methods.forEach(function(method) {
        var methodName = method.getName();
        console.log('Found method: ' + methodName);

        // 钩取每个方法并打印日志
        try {
            var overloads = MsgUIData[methodName].overloads;
            overloads.forEach(function(overload) {
                overload.implementation = function() {
                    // 打印方法名及参数
                    console.log('Method called: ' + methodName + ' with args: ' + JSON.stringify(arguments));
                    
                    // 调用原始方法
                    return overload.apply(this, arguments);
                };
            });
        } catch (e) {
            console.log('Error hooking ' + methodName + ': ' + e.message);
        }
    });
});

com.xingin.chatbase.bean.MsgUIData进行hook一下这些
//Method called: setStrMsg with args: {"0":"VCG范丞丞"}
//Method called: setMsgUUID with args: {"0":"51df9f21-fbb2-4714-8488-12ad58c1b1da"}
//Method called: setMsgId with args: {"0":"612368ee000000000101cd0c.62e7a0e6000000001f0077b5.1e79083a71bc144"}
//Method called: setStoreId with args: {"0":241}
//Method called: setCreatTime with args: {"0":"1737524135432"}
//Method called: setShowTime with args: {"0":"刚刚"}
//Method called: setMsgType with args: {"0":1}
//Method called: setSenderId with args: {"0":"612368ee000000000101cd0c"}
//Method called: setReceiverId with args: {"0":"62e7a0e6000000001f0077b5"}
//Method called: setChatId with args: {"0":"612368ee000000000101cd0c"}
//Method called: setLocalChatId with args: {"0":"612368ee000000000101cd0c@62e7a0e6000000001f0077b5"}
Java.perform(function() {
    // 获取 MsgUIData 类的引用
    var MsgUIData = Java.use('com.xingin.chatbase.bean.MsgUIData');
    
    // 钩取 setStrMsg 方法
    MsgUIData.setStrMsg.implementation = function(arg0) {
        console.log('方法调用: setStrMsg 参数: ' + arg0);
        return this.setStrMsg(arg0);  // 调用原方法
    };

    // 钩取 setMsgUUID 方法
    MsgUIData.setMsgUUID.implementation = function(arg0) {
        console.log('方法调用: setMsgUUID 参数: ' + arg0);
        return this.setMsgUUID(arg0);  // 调用原方法
    };

    // 钩取 setMsgId 方法
    MsgUIData.setMsgId.implementation = function(arg0) {
        console.log('方法调用: setMsgId 参数: ' + arg0);
        return this.setMsgId(arg0);  // 调用原方法
    };

    // 钩取 setStoreId 方法
    MsgUIData.setStoreId.implementation = function(arg0) {
        console.log('方法调用: setStoreId 参数: ' + arg0);
        return this.setStoreId(arg0);  // 调用原方法
    };

    // 钩取 setCreatTime 方法
    MsgUIData.setCreatTime.implementation = function(arg0) {
        console.log('方法调用: setCreatTime 参数: ' + arg0);
        return this.setCreatTime(arg0);  // 调用原方法
    };

    // 钩取 setShowTime 方法
    MsgUIData.setShowTime.implementation = function(arg0) {
        console.log('方法调用: setShowTime 参数: ' + arg0);
        return this.setShowTime(arg0);  // 调用原方法
    };

    // 钩取 setMsgType 方法
    MsgUIData.setMsgType.implementation = function(arg0) {
        console.log('方法调用: setMsgType 参数: ' + arg0);
        return this.setMsgType(arg0);  // 调用原方法
    };

    // 钩取 setSenderId 方法
    MsgUIData.setSenderId.implementation = function(arg0) {
        console.log('方法调用: setSenderId 参数: ' + arg0);
        return this.setSenderId(arg0);  // 调用原方法
    };

    // 钩取 setReceiverId 方法
    MsgUIData.setReceiverId.implementation = function(arg0) {
        console.log('方法调用: setReceiverId 参数: ' + arg0);
        return this.setReceiverId(arg0);  // 调用原方法
    };

    // 钩取 setChatId 方法
    MsgUIData.setChatId.implementation = function(arg0) {
        console.log('方法调用: setChatId 参数: ' + arg0);
        return this.setChatId(arg0);  // 调用原方法
    };

    // 钩取 setLocalChatId 方法
    MsgUIData.setLocalChatId.implementation = function(arg0) {
        console.log('方法调用: setLocalChatId 参数: ' + arg0);
        return this.setLocalChatId(arg0);  // 调用原方法
    };
});

这个代码是接收到消息的代码

Java.perform(function() {
    var MsgUIData = Java.use('com.xingin.chatbase.bean.MsgUIData');
    
    // 钩取 setStrMsg 方法的指定重载
    MsgUIData.setStrMsg.overload('java.lang.String').implementation = function(arg0) {
        console.log('方法调用: setStrMsg 参数: ' + arg0);
        return this.setStrMsg(arg0);
    };
});

追逐这个发送消息的栈

Java.perform(function() {
    var MsgUIData = Java.use('com.xingin.chatbase.bean.MsgUIData');
    
    MsgUIData.setStrMsg.implementation = function(str) {
        console.log('调用栈: ' + Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Exception').$new()));
        console.log('原始消息值: ' + str); 
        return this.setStrMsg(str);
    };
});

我从那个MsgUIData写了一个栈 就是上面的那个代码 我在想,这个消息只能在UI那个界面停留才会收到,原数据会把这个消息传进UI里面,所以我就写了一个栈,然后一路找到了这个位置。

我阅读了一下代码,然后发现这个地方最可疑。

于是我点击了这个getContent()然后进去了,跳转到了另一个页面。

就是这个页面。

然后我就写了一个遍历这个地方的一个方法。

Java.perform(function () {
    // 获取 MsgContentBean 类
    var MsgContentBean = Java.use('com.xingin.chatbase.bean.MsgContentBean');
    
    // 获取 MsgContentBean 类中的所有方法
    var methods = MsgContentBean.class.getDeclaredMethods();
    
    methods.forEach(function (method) {
        var methodName = method.getName();
        console.log("Hooking method: " + methodName);
        
        // hook 每个方法
        MsgContentBean[methodName].overload().implementation = function () {
            // 打印方法名
            console.log('Called ' + methodName);
            
            // 打印方法参数
            var args = arguments;
            for (var i = 0; i < args.length; i++) {
                console.log('Arg ' + i + ': ' + args[i]);
            }

            // 调用原始方法并获取返回值
            var result = this[methodName].apply(this, arguments);

            // 打印返回值
            console.log('Return value from ' + methodName + ': ' + result);

            return result; // 返回原始的结果
        };
    });
});

运行结果是这样的。

然后我这个部分就获取成功了。 上面的部分是解决了我的收到消息的模块。

接下来我要弄得是我自己发送消息的模块。

我通过这个代码,找到我自己发送的消息。

Java.perform(function() {
    // 获取 MsgUIData 类的引用
    var MsgUIData = Java.use('com.xingin.chatbase.bean.MsgUIData');
    
    // 获取该类所有的方法
    var methods = MsgUIData.class.getDeclaredMethods();
    
    methods.forEach(function(method) {
        var methodName = method.getName();
        console.log('Found method: ' + methodName);
 
        // 钩取每个方法并打印日志
        try {
            var overloads = MsgUIData[methodName].overloads;
            overloads.forEach(function(overload) {
                overload.implementation = function() {
                    // 打印方法名及参数
                    console.log('Method called: ' + methodName + ' with args: ' + JSON.stringify(arguments));
                    
                    // 调用原始方法
                    return overload.apply(this, arguments);
                };
            });
        } catch (e) {
            console.log('Error hooking ' + methodName + ': ' + e.message);
        }
    });
});

找到了这个方法的名字。但是这个显示的是UI界面的一个方法的名字,和传输出去信息的方法无关。

所以我只能靠追踪栈来找了。

Java.perform(function() {
    var MsgUIData = Java.use('com.xingin.chatbase.bean.MsgUIData');
    
    MsgUIData.setStrMsg.implementation = function(str) {
        console.log('调用栈: ' + Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Exception').$new()));
        console.log('原始消息值: ' + str); 
        return this.setStrMsg(str);
    };
});

追踪好之后,就会出来这些参数。

然后我把这些栈发给AI进行分析一下。

我分析了一下,这个onclick肯定是发送的按钮。

它那个17,代表17行进行了一个调试。

还有就是那个ChatPresenter。

  • 你在聊天界面输入消息ChatPresenter 接收到这个消息。
  • ChatPresenter 负责发送消息(比如通过网络请求)。
  • 消息发送成功后ChatPresenter 通知界面更新,把新消息展示给你。

我想了一下

        at ny1.y1.O0(ChatPresenter.kt:6)
        at ny1.y1.x1(ChatPresenter.kt:5)

为什么没有在jadx发现这些参数,因为我没用MT管理器找。

在classes2.dex里面。

public void O0(String content, int type, ec.h model, String quoteId, MessageBean quoteContent, int fromType) {
        if (PatchProxy.proxy(new Object[]{content, new Integer(type), model, quoteId, quoteContent, new Integer(fromType)}, this, changeQuickRedirect, false, 126994, Void.TYPE).isSupported) {
            return;
        }
        Intrinsics.checkNotNullParameter(content, "content");
        Intrinsics.checkNotNullParameter(quoteId, "quoteId");
        Nb().O0(content, type, model, quoteId, quoteContent, fromType);
    }

然后我写了一个监视发送。

Java.perform(function () {
    // 获取类 y1
    var y1Class = Java.use("ny1.y1");

    // Hook O0 方法
    y1Class.O0.overload('java.lang.String', 'int', 'ec.h', 'java.lang.String', 'com.xingin.chatbase.bean.MessageBean', 'int').implementation = function (content, type, model, quoteId, quoteContent, fromType) {
        
        // 打印传入参数
        console.log("O0 called with parameters:");
        console.log("content: " + content);
        console.log("type: " + type);
        console.log("model: " + model);
        console.log("quoteId: " + quoteId);
        console.log("quoteContent: " + quoteContent);
        console.log("fromType: " + fromType);

        // 调用原方法
        return this.O0(content, type, model, quoteId, quoteContent, fromType);
    };
});

拦截并且修改发送的消息。

Java.perform(function () {
    // 获取类 y1
    var y1Class = Java.use("ny1.y1");

    // Hook O0 方法
    y1Class.O0.overload('java.lang.String', 'int', 'ec.h', 'java.lang.String', 'com.xingin.chatbase.bean.MessageBean', 'int').implementation = function (content, type, model, quoteId, quoteContent, fromType) {

        // 打印原始参数
        console.log("Original O0 parameters:");
        console.log("content: " + content);
        console.log("type: " + type);
        console.log("model: " + model);
        console.log("quoteId: " + quoteId);
        console.log("quoteContent: " + quoteContent);
        console.log("fromType: " + fromType);

        // 修改参数为固定值
        var newContent = "666666";  // 固定的内容
        var newType = 1;  // 固定的类型
        var newQuoteId = quoteId;  // 固定的引用ID
        var newFromType = 0;  // 固定的来源类型
        var newModel = model;  // 保持 model 不变
        var newQuoteContent = quoteContent;  // 保持 quoteContent 不变

        // 调用原方法,使用修改后的参数
        this.O0(newContent, newType, newModel, newQuoteId, newQuoteContent, newFromType);
    };
});

把这所有的栈复制下来放给AI,让他给我追踪所有的方法,还有打印出来的值。

Java.perform(function () {
    // Hook ChatActivity.onClick 方法
    var ChatActivity = Java.use("com.xingin.im.ui.activity.ChatActivity");
    ChatActivity.onClick.overload('android.view.View').implementation = function (view) {
        console.log("=== Hooked ChatActivity.onClick ===");
        console.log("Parameter: View = " + view);

        // 调用原始方法
        var result = this.onClick(view);

        console.log("=== Exiting ChatActivity.onClick ===");
        return result;
    };

    // Hook ChatActivity.Hc 方法
    ChatActivity.Hc.implementation = function () {
        console.log("=== Hooked ChatActivity.Hc ===");

        // 打印所有参数
        for (var i = 0; i < arguments.length; i++) {
            console.log("Parameter " + i + ": " + arguments[i]);
        }

        // 调用原始方法
        var result = this.Hc();

        console.log("=== Exiting ChatActivity.Hc ===");
        return result;
    };

    // Hook ny1.y1.x1 方法
    var y1Class = Java.use("ny1.y1");
    y1Class.x1.overload('jh4.a').implementation = function (action) {
        console.log("=== Hooked ny1.y1.x1 ===");
        console.log("Parameter: Action = " + action);

        // 打印参数详细信息(如果是对象)
        try {
            console.log("Action type: " + action.getClass().getName());
            console.log("Action toString: " + action.toString());
        } catch (e) {
            console.log("Error retrieving action details: " + e.message);
        }

        // 调用原始方法
        var result = this.x1(action);

        console.log("=== Exiting ny1.y1.x1 ===");
        return result;
    };

    // Hook ny1.y1.O0 方法
    y1Class.O0.overload('java.lang.String', 'int', 'ec.h', 'java.lang.String', 'com.xingin.chatbase.bean.MessageBean', 'int').implementation = function (content, type, model, quoteId, quoteContent, fromType) {
        console.log("=== Hooked ny1.y1.O0 ===");
        console.log("Content: " + content);
        console.log("Type: " + type);
        console.log("Model: " + model);
        console.log("Quote ID: " + quoteId);
        console.log("Quote Content: " + quoteContent);
        console.log("From Type: " + fromType);

        // 调用原始方法
        var result = this.O0(content, type, model, quoteId, quoteContent, fromType);

        console.log("=== Exiting ny1.y1.O0 ===");
        return result;
    };

    // Hook MsgConvertUtils.messageToMsgUIData 方法
    var MsgConvertUtils = Java.use("com.xingin.chatbase.bean.convert.MsgConvertUtils");
    MsgConvertUtils.messageToMsgUIData.overload('com.xingin.chatbase.db.entity.Message').implementation = function (message) {
        console.log("=== Hooked MsgConvertUtils.messageToMsgUIData ===");
        console.log("Message: " + message);

        // 调用原始方法
        var result = this.messageToMsgUIData(message);

        console.log("Result: " + result);
        console.log("=== Exiting MsgConvertUtils.messageToMsgUIData ===");
        return result;
    };

    // Hook MsgUIData.setStrMsg 方法
    var MsgUIData = Java.use("com.xingin.chatbase.bean.MsgUIData");
    MsgUIData.setStrMsg.overload('java.lang.String').implementation = function (str) {
        console.log("=== Hooked MsgUIData.setStrMsg ===");
        console.log("Message: " + str);

        // 调用原始方法
        var result = this.setStrMsg(str);

        console.log("=== Exiting MsgUIData.setStrMsg ===");
        return result;
    };
});

然后我找到了了这个。

然后我叫AI又重新精准定位这个地方。

Java.perform(function () {
    // Hook MsgConvertUtils.messageToMsgUIData 方法
    var MsgConvertUtils = Java.use("com.xingin.chatbase.bean.convert.MsgConvertUtils");

    MsgConvertUtils.messageToMsgUIData.overload('com.xingin.chatbase.db.entity.Message').implementation = function (message) {
        console.log("=== Hooked MsgConvertUtils.messageToMsgUIData ===");

        // 提取 Message 的关键字段
        try {
            console.log("UUID: " + message.uuid);
            console.log("MsgID: " + message.msgId);
            console.log("StoreID: " + message.storeId);
            console.log("CreateTime: " + message.createTime);
            console.log("Content: " + message.content);
            console.log("SenderID: " + message.senderId);
            console.log("ReceiverID: " + message.receiverId);
        } catch (e) {
            console.log("Error extracting Message fields: " + e.message);
        }

        //

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑龙江锅包肉:酸甜香酥的东北经典

黑龙江锅包肉:酸甜香酥的东北经典 黑龙江锅包肉,作为东北菜的代表之一,尤其在黑龙江省哈尔滨市享有极高的声誉。这道美食不仅承载着丰富的历史文化内涵,更以其鲜明的地域特色,成为了黑龙江省乃至整个东北地区的标志性菜肴。 历史渊源 锅包肉的历史可以追溯到清朝光绪年间,其…

[JavaScript] ES6及以后版本的新特性

文章目录 箭头函数&#xff08;Arrow Functions&#xff09;为什么需要箭头函数&#xff1f;箭头函数的完整语法箭头函数中的 this实用场景 解构赋值&#xff08;Destructuring Assignment&#xff09;为什么需要解构赋值&#xff1f;数组解构赋值的完整用法对象解构赋值的完整…

ipad和macbook同步zotero文献附件失败的解决办法

背景&#xff1a;我所有的文献及其附件pdf都是在台式机&#xff08;windows系统&#xff09;&#xff0c;想要把这些文献同步到云上&#xff0c;然后再从云上同步到平板和其他笔记本电脑比如macbook。文献同步虽已成功&#xff0c;但文献附件都无法打开。 平板报错如下&#xf…

element tbas增加下拉框

使用Tabs 标签页的label插槽&#xff0c;嵌入Dropdown 下拉菜单&#xff0c;实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"&#xff08;这个事件当中到拥有下拉框的tab里时&#xff0c;可以存一下Dropdown 第一个菜单的id&#xff0c;实现点击到拥有…

环境变量配置与问题解决

目录 方法 配置了还是运行不了想要的东西 解决方案 为什么 解决方案 方法 方法一&#xff1a;此电脑右击-属性-相关链接-高级系统设置-环境变量&#xff08;N&#xff09;-系统变量里面找到Path-三个确定】 方法二&#xff1a;winr cmd 黑框输入sysdm.cpl&#xff0c;后面…

【C++】详细讲解继承(下)

本篇来继续说说继承。上篇可移步至【C】详细讲解继承&#xff08;上&#xff09; 1.继承与友元 友元关系不能继承 &#xff0c;也就是说基类友元不能访问派⽣类私有和保护成员。 class Student;//前置声明class Same //基类 { public:friend void Fun(const Same& p, con…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动&#xff0c;联想电脑设置u盘启动的方法有两种&#xff0c;一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是&#xff0c;一种是uefi引导&#xff0c;一种是传统的leacy引导&#xff0c;所以需要注意制…

算法|牛客网华为机试53-62C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试41-52C 文章目录 HJ53 杨辉三角的变形HJ54 表达式求值HJ55 挑7HJ56 完全数计算HJ57 高精度整数加法HJ58 输入n个整数&#xff0c;输出其中最小的k个HJ59 找出字符串中第一个只出现一次的字符HJ60 查找组成一个偶数最接近的两…

消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)

1、TCP和UDP概述 TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;和UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;都算是最底层的通信协议&#xff0c;它们位于OSI模型的传输层。*传输层的主要职责是确保…

springboot基于Spring Boot的智慧养老服务系统的设计与实现

系统介绍&#xff1a; 智慧养老服务系统是一种运用现代科技手段&#xff0c;整合各类养老资源&#xff0c;为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术&#xff0c;实现对老年人健康状况、生活需求的实时监控与精准匹配&…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法&#xff0c;步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一&#xff0e;软硬…

python实现http文件服务器访问下载

//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler&#xff0c;将根目录设置为脚本所在目录 class MyHTT…

【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)

文章目录 前言一、InputAction简介1、InputAction是什么&#xff1f;2、示例 二、监听事件started 、performed 、canceled1、启用输入检测2、操作监听相关3、关键参数 CallbackContext4、结果 三、InputAction参数相关1、点击齿轮1.1 Actions 动作&#xff08;1&#xff09;动…

Python 在Word中添加、或删除超链接

在Word文档中&#xff0c;超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接&#xff0c;用户可以轻松地导航到相关信息&#xff0c;从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…

css粘性定位超出指定宽度失效问题

展示效果 解决办法&#xff1a;外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…

携程旅行 登录分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 所有加密流程基本一样就说…

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计

源码 论文 下载地址&#xff1a; ​​​​c​​​​​​c基于JAVA的网络通讯系统设计与实现(源码系统论文&#xff09;https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…