UNPKG

frida-java-bridge

Version:
57 lines (46 loc) 2.04 kB
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); }; }