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()
        });
    }
});
相关推荐
悠哉悠哉愿意26 分钟前
【电赛学习笔记】MaixCAM 的OCR图片文字识别
笔记·python·嵌入式硬件·学习·视觉检测·ocr
nbsaas-boot1 小时前
SQL Server 窗口函数全指南(函数用法与场景)
开发语言·数据库·python·sql·sql server
Catching Star1 小时前
【代码问题】【包安装】MMCV
python
摸鱼仙人~1 小时前
Spring Boot中的this::语法糖详解
windows·spring boot·python
Warren981 小时前
Java Stream流的使用
java·开发语言·windows·spring boot·后端·python·硬件工程
一笑的小酒馆1 小时前
Android12去掉剪贴板复制成功的Toast
android
伍哥的传说1 小时前
Radash.js 现代化JavaScript实用工具库详解 – 轻量级Lodash替代方案
开发语言·javascript·ecmascript·tree-shaking·radash.js·debounce·throttle
一笑的小酒馆2 小时前
Android12App启动图标自适应
android
点云SLAM2 小时前
PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
人工智能·pytorch·python·计算机视觉·3d深度学习·张量flatten操作·张量数据结构
前端程序媛-Tian2 小时前
【dropdown组件填坑指南】—怎么实现下拉框的位置计算
前端·javascript·vue