Update unity.js
This commit is contained in:
parent
5a607ca359
commit
1913fdc7d9
158
scripts/unity.js
158
scripts/unity.js
@ -1,3 +1,161 @@
|
|||||||
|
// await until Mono is loaded
|
||||||
|
var awaitForCondition = function(callback) {
|
||||||
|
var int = setInterval(function() {
|
||||||
|
if (Module.findExportByName(null, "mono_get_root_domain")) {
|
||||||
|
clearInterval(int);
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cb(funcName) {
|
||||||
|
return {
|
||||||
|
onEnter: function(args) {
|
||||||
|
this.extra = {
|
||||||
|
funcName: funcName,
|
||||||
|
arg0: args[0]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onLeave: function(retval) {
|
||||||
|
this.extra.retval = retval;
|
||||||
|
console.log(JSON.stringify(this.extra, null, 2));
|
||||||
|
console.log( hexdump(retval, { offset: 0, length: 0x60, header: true, ansi: true }) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function hookMethod(dll, klass, method, extra) {
|
||||||
|
var monoImage = mono_image_loaded(dll);
|
||||||
|
// monoImage will be the same as this.extra.image
|
||||||
|
var monoClass = mono_class_from_name(monoImage, "", klass);
|
||||||
|
var monoMethod = mono_class_get_method_from_name(monoClass, method, -1);
|
||||||
|
// = mono_class_get_method_from_name(monoClass, "lastRecivedGameId", -1); // mono_class_get_field
|
||||||
|
var compiledMethod = mono_compile_method(monoMethod);
|
||||||
|
|
||||||
|
Interceptor.attach(monoMethod, cb("monoMethod"));
|
||||||
|
Interceptor.attach(compiledMethod, cb("compiledMethod"));
|
||||||
|
|
||||||
|
Object.assign(extra, {
|
||||||
|
MonoImage: monoImage,
|
||||||
|
MonoClass: monoClass,
|
||||||
|
monoMethod: monoMethod,
|
||||||
|
compiledMethod: compiledMethod
|
||||||
|
});
|
||||||
|
console.log(JSON.stringify(extra, null, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
function hook() {
|
||||||
|
Interceptor.attach(Module.findExportByName(null, "mono_assembly_load_from_full"), {
|
||||||
|
onEnter: function(args) {
|
||||||
|
this.extra = {
|
||||||
|
image: args[0],
|
||||||
|
fname: Memory.readUtf8String(args[1]),
|
||||||
|
status: args[2],
|
||||||
|
refonly: args[3],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onLeave: function(retval) {
|
||||||
|
if (this.extra.fname.endsWith("Assembly-CSharp.dll")) {
|
||||||
|
this.extra.retval = retval;
|
||||||
|
hookMethod(this.extra.fname, "NetworkDriver", "AskForQuestion", this.extra);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MonoImage* mono_image_loaded (const char *name)
|
||||||
|
* http://docs.go-mono.com/index.aspx?link=xhtml%3Adeploy%2Fmono-api-image.html
|
||||||
|
*/
|
||||||
|
var mono_image_loaded = function(name) {
|
||||||
|
return new NativeFunction(
|
||||||
|
Module.findExportByName(null, "mono_image_loaded"), // pointer to method
|
||||||
|
'pointer', // return type, MonoImage*
|
||||||
|
['pointer'] // arguments, char *name
|
||||||
|
)(
|
||||||
|
Memory.allocUtf8String(name) // allocating & passing parameter's address
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MonoClass* mono_class_from_name (MonoImage *image, const char* name_space, const char *name)
|
||||||
|
* http://docs.go-mono.com/?link=api%3amono_class_from_name
|
||||||
|
*/
|
||||||
|
var mono_class_from_name = function(image, name_space, name) {
|
||||||
|
return new NativeFunction(
|
||||||
|
Module.findExportByName(null, "mono_class_from_name"),
|
||||||
|
'pointer',
|
||||||
|
['pointer', 'pointer', 'pointer']
|
||||||
|
)( image, Memory.allocUtf8String(name_space), Memory.allocUtf8String(name) )
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MonoMethod* mono_class_get_method_from_name (MonoClass *klass, const char *name, int param_count)
|
||||||
|
* klass where to look for the method
|
||||||
|
* name name of the method
|
||||||
|
* param_count number of parameters. -1 for any number.
|
||||||
|
* http://docs.go-mono.com/index.aspx?link=xhtml%3Adeploy%2Fmono-api-class.html
|
||||||
|
*/
|
||||||
|
var mono_class_get_method_from_name = function(klass, name, param_count) {
|
||||||
|
return new NativeFunction(
|
||||||
|
Module.findExportByName(null, "mono_class_get_method_from_name"),
|
||||||
|
'pointer',
|
||||||
|
['pointer', 'pointer', 'int']
|
||||||
|
)( klass, Memory.allocUtf8String(name), param_count )
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpointer mono_compile_method (MonoMethod *method)
|
||||||
|
* http://docs.go-mono.com/index.aspx?link=xhtml%3Adeploy%2Fmono-api-unsorted.html
|
||||||
|
*/
|
||||||
|
var mono_compile_method = function(method) {
|
||||||
|
return new NativeFunction(
|
||||||
|
Module.findExportByName(null, "mono_compile_method"),
|
||||||
|
'pointer',
|
||||||
|
['pointer']
|
||||||
|
)( method )
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////// Main ////////////////
|
||||||
|
Java.perform(awaitForCondition(hook));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
1. Get image by name [call mono_image_loaded]
|
1. Get image by name [call mono_image_loaded]
|
||||||
2. Get class by name [call mono_class_from_name](#http://docs.go-mono.com/?link=api%3amono_class_from_name)
|
2. Get class by name [call mono_class_from_name](#http://docs.go-mono.com/?link=api%3amono_class_from_name)
|
||||||
|
Loading…
Reference in New Issue
Block a user