frida-java-bridge
Version:
Java runtime interop from Frida
57 lines (46 loc) • 2.04 kB
JavaScript
import { checkJniResult } from './result.js';
export const jvmtiVersion = {
v1_0: 0x30010000,
v1_2: 0x30010200
};
export const jvmtiCapabilities = {
canTagObjects: 1
};
const { pointerSize } = Process;
const nativeFunctionOptions = {
exceptions: 'propagate'
};
export function EnvJvmti (handle, vm) {
this.handle = handle;
this.vm = vm;
this.vtable = handle.readPointer();
}
EnvJvmti.prototype.deallocate = proxy(47, 'int32', ['pointer', 'pointer'], function (impl, mem) {
return impl(this.handle, mem);
});
EnvJvmti.prototype.getLoadedClasses = proxy(78, 'int32', ['pointer', 'pointer', 'pointer'], function (impl, classCountPtr, classesPtr) {
const result = impl(this.handle, classCountPtr, classesPtr);
checkJniResult('EnvJvmti::getLoadedClasses', result);
});
EnvJvmti.prototype.iterateOverInstancesOfClass = proxy(112, 'int32', ['pointer', 'pointer', 'int', 'pointer', 'pointer'], function (impl, klass, objectFilter, heapObjectCallback, userData) {
const result = impl(this.handle, klass, objectFilter, heapObjectCallback, userData);
checkJniResult('EnvJvmti::iterateOverInstancesOfClass', result);
});
EnvJvmti.prototype.getObjectsWithTags = proxy(114, 'int32', ['pointer', 'int', 'pointer', 'pointer', 'pointer', 'pointer'], function (impl, tagCount, tags, countPtr, objectResultPtr, tagResultPtr) {
const result = impl(this.handle, tagCount, tags, countPtr, objectResultPtr, tagResultPtr);
checkJniResult('EnvJvmti::getObjectsWithTags', result);
});
EnvJvmti.prototype.addCapabilities = proxy(142, 'int32', ['pointer', 'pointer'], function (impl, capabilitiesPtr) {
return impl(this.handle, capabilitiesPtr);
});
function proxy (offset, retType, argTypes, wrapper) {
let impl = null;
return function () {
if (impl === null) {
impl = new NativeFunction(this.vtable.add((offset - 1) * pointerSize).readPointer(), retType, argTypes, nativeFunctionOptions);
}
let args = [impl];
args = args.concat.apply(args, arguments);
return wrapper.apply(this, args);
};
}