'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 }; }
};
'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 }; }
};