Android逆向(Python和JS通信)

Python

python 复制代码
import frida
import sys
import json
from datetime import datetime

def on_message(message, data):
    if message['type'] == 'send':
        try:
            payload = message['payload']
            timestamp = datetime.fromtimestamp(payload['timestamp']/1000).strftime('%Y-%m-%d %H:%M:%S')
            
            print("\n" + "="*50)
            print(f"[{timestamp}] 收到消息:")
                
            if payload['type'] == 'getLocalId_result':
                print(f"函数: getLocalId 结果")
                print(f"输入参数: {payload['input']}")
                print(f"返回结果: {payload['result']}")
                
            elif payload['type'] == 'getMsgUiDataContent':
                print(f"函数: getMsgUiDataContent")
                msg = payload['message']
                print(f"发送者: {msg.get('nickname', '')}")
                print(f"内容类型: {msg.get('content_type', '')}")
                content = msg.get('content', '')
                if content:
                    try:
                        content_json = json.loads(content)
                        if 'link' in content_json:
                            print(f"链接: {content_json['link']}")
                        else:
                            print(f"内容: {content}")
                    except:
                        print(f"内容: {content}")
                else:
                    link = msg.get('link', '')
                    if link:
                        print(f"链接: {link}")
                    else:
                        print(f"内容: {content}")
                
                
            elif payload['type'] == 'error':
                print(f"[!] 错误类型: {payload['error']}")
                print(f"错误详情: {payload['error_detail']}")
                if 'raw_message' in payload:
                    print(f"原始消息: {payload['raw_message']}")
                    
        except Exception as e:
            print(f"[!] 处理消息时出错: {str(e)}")
            print(f"原始消息: {message}")
            
    elif message['type'] == 'error':
        print(f"[!] Frida错误: {message['stack']}")

try:
    # 连接到目标进程
    device = frida.get_usb_device()
    pid = device.spawn(["com.xingin.xhs"])
    session = device.attach(pid)

    # 加载JS脚本,使用UTF-8编码打开文件
    with open(r"C:\Users\xie__\Desktop\小红书测试.js", encoding='utf-8') as f:
        script = session.create_script(f.read())
    script.on('message', on_message)
    script.load()

    device.resume(pid)
    print("[*] Hook已加载,等待消息...")
    sys.stdin.read()
    
except Exception as e:
    print(f"[!] 发生错误: {str(e)}")

JS

javascript 复制代码
Java.perform(function() {
    // Hook MsgConvertUtils
    try {
        var MsgConvertUtils = Java.use('com.xingin.chatbase.bean.convert.MsgConvertUtils');
        
        MsgConvertUtils.getLocalId.overload('java.lang.String').implementation = function(msgContent) {
            console.log('\n[+] MsgConvertUtils.getLocalId 被调用');
            
            // 发送数据到Python
            send({
                type: "getLocalId",
                input: msgContent,
                timestamp: new Date().getTime()
            });
            
            // 调用原始方法
            var result = this.getLocalId(msgContent);
            
            // 发送结果到Python
            send({
                type: "getLocalId_result",
                input: msgContent,
                result: result,
                timestamp: new Date().getTime()
            });
            
            return result;
        };
        
        // Hook getMsgUiDataContent 方法
        MsgConvertUtils.getMsgUiDataContent.overload('java.lang.String').implementation = function(msgContent) {         
            try {
                var msgJson = JSON.parse(msgContent);
                
                // 发送完整消息到Python
                send({
                    type: "getMsgUiDataContent",
                    message: msgJson,
                    timestamp: new Date().getTime()
                });
                
            } catch(e) {
                send({
                    type: "error",
                    error: "解析消息内容失败",
                    raw_message: msgContent,
                    error_detail: String(e),
                    timestamp: new Date().getTime()
                });
            }
            
            // 调用原始方法并返回结果
            var result = this.getMsgUiDataContent(msgContent);
            return result;
        };
 
    } catch(e) {
        send({
            type: "error",
            error: "Hook MsgConvertUtils 失败",
            error_detail: String(e),
            timestamp: new Date().getTime()
        });
    }
});
相关推荐
uhakadotcom21 分钟前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom25 分钟前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom35 分钟前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom1 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试
咖啡教室2 小时前
前端开发日常工作每日记录笔记(2019至2024合集)
前端·javascript
咖啡教室2 小时前
前端开发中JavaScript、HTML、CSS常见避坑问题
前端·javascript·css
用户27784491049932 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
张风捷特烈3 小时前
Flutter 伪3D绘制#03 | 轴测投影原理分析
android·flutter·canvas
JavaEdge在掘金4 小时前
ssl.SSLCertVerificationError报错解决方案
python
市民中心的蟋蟀5 小时前
第五章 使用Context和订阅来共享组件状态
前端·javascript·react.js