XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
'use strict';
// Pinned r332841 image only. The host verifies its on-disk SHA-256 before loading this agent.
const image = Process.getModuleByName('EliteDangerous64.exe');
const imageHash = 'e6be8bbe04e6a7ae226d4318945af7f367de13dc5a007a261964d9ba8144e988';
const hooks = [];
let flowPointer = null, controlPointer = null;
let sample = { observedAt: null, flow: null, targetFlow: null, throttleOverride: null, frameThread: null };
const diagnostics = [];
let nextSample = 0;

function identifier(pointer) {
    const text = pointer.readUtf8String();
    return /^[A-Za-z][A-Za-z0-9_ ]{0,126}$/.test(text) ? text : null;
}
function inspectFlow(context) {
    const flow = context.sub(0x70).add(0xa0).readPointer();
    if (!flow.readPointer().equals(image.base.add(0x5236db0))) return;
    const csm = flow.add(0x310).readPointer();
    if (!csm.readPointer().equals(image.base.add(0x5138dc0))) return;
    flowPointer = flow;
    sample.flow = identifier(csm.add(0x100).readPointer().readPointer());
    sample.targetFlow = identifier(csm.add(0x108).readPointer().readPointer());
    sample.observedAt = new Date().toISOString();
    sample.frameThread = Process.getCurrentThreadId();
}

try {
    hooks.push(Interceptor.attach(image.base.add(0x2154c40), {
        onEnter(args) { this.flowContext = args[1]; },
        onLeave() {
            if (Date.now() < nextSample) return;
            nextSample = Date.now() + 500;
            try { inspectFlow(this.flowContext); } catch (_) { }
        }
    }));
} catch (error) { diagnostics.push('frame observer unavailable: ' + String(error)); }

try {
    hooks.push(Interceptor.attach(image.base.add(0x2c6ea40), {
        onEnter(args) {
            try {
                const owner = args[0];
                if (!owner.readPointer().equals(image.base.add(0x5313af0))) return;
                const control = owner.add(0x700).readPointer();
                if (!control.readPointer().equals(image.base.add(0x529d790))) return;
                controlPointer = control;
                const value = control.add(0x680).readFloat();
                if (Number.isFinite(value) && (value === -100 || Math.abs(value) <= 1)) sample.throttleOverride = value;
            } catch (_) { }
        }
    }));
} catch (error) { diagnostics.push('control observer unavailable: ' + String(error)); }

rpc.exports = {
    describe() {
        return { protocolVersion: 1, processId: Process.id, imageSha256: imageHash,
            capabilities: ['native.observe', 'commands.cancel'],
            status: '原生只读观察已接入;买卖、选站、跃迁与自动靠港入口待验证。' };
    },
    readstate() { return { ...sample, imageSha256: imageHash, diagnostics, controlsObserved: controlPointer !== null }; },
    cancel() { return { cancelled: true, pendingCommands: 0 }; }
};