Difference between revisions of "Mono:Mono Lua"
Jump to navigation
Jump to search
m (Reverted edits by This content is not available (Talk) to last revision by Igromanru) |
(Major overhaul of the post.) |
||
| Line 2: | Line 2: | ||
[[Category:Help]] | [[Category:Help]] | ||
[[Category:Lua]] | [[Category:Lua]] | ||
| − | |||
{{DISPLAYTITLE:Mono - Lua}} | {{DISPLAYTITLE:Mono - Lua}} | ||
| − | The advanced Mono features of Cheat Engine are controlled by the | + | The advanced Mono features of Cheat Engine are controlled by the <code>monoscript.lua</code> script in the <code>autorun</code> directory. |
| − | |||
| + | When Cheat Engine attaches to a process, the script checks for <code>mono.dll</code>. If Mono is detected, the matching <code>MonoDataDissector</code> DLL from the <code>autorun</code> directory is injected into the target process. The injected DLL creates a named pipe, and the Lua side communicates with it to perform Mono-related operations. | ||
== Main Methods == | == Main Methods == | ||
| − | ; LaunchMonoDataCollector() | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" |
| − | + | !align="left"|Function | |
| + | !align="left"|Return Type | ||
| + | !style="width: 80%;background-color:white;" align="left"|Description | ||
| + | |- | ||
| + | |LaunchMonoDataCollector() | ||
| + | |Integer | ||
| + | |Injects the Mono data collector DLL. Returns 0 on failure, or the monoBase returned by the CMD_INITMONO pipe command. | ||
| + | |- | ||
| + | |monoTypeToVarType(monoType) | ||
| + | |ValueType | ||
| + | |Returns the Cheat Engine value type for the given Mono type, such as vtString, vtByte, vtWord, vtDword, vtSingle, vtDouble, or vtPointer. | ||
| + | |- | ||
| + | |mono_object_getClass(address) | ||
| + | |Integer, String | ||
| + | |Returns the class ID and class name of the object at the given address. | ||
| + | |- | ||
| + | |mono_enumDomains() | ||
| + | |Table | ||
| + | |Returns a table array containing the domain address of each Mono domain. | ||
| + | |- | ||
| + | |mono_setCurrentDomain(domainId) | ||
| + | |Integer | ||
| + | |Sets the Mono domain used by the MonoDataCollector. | ||
| + | |- | ||
| + | |mono_enumAssemblies() | ||
| + | |Table | ||
| + | |Returns a table containing the assembly IDs for each assembly in the current domain. | ||
| + | |- | ||
| + | |mono_getImageFromAssembly(assemblyId) | ||
| + | |Integer | ||
| + | |Returns the image ID for the given assembly. | ||
| + | |- | ||
| + | |mono_image_get_name(imageId) | ||
| + | |String | ||
| + | |Returns the name of the assembly image. | ||
| + | |- | ||
| + | |mono_image_enumClasses(imageId) | ||
| + | |Table | ||
| + | |Returns a table containing the class IDs for classes in the given assembly image. | ||
| + | |- | ||
| + | |mono_class_getName(classId) | ||
| + | |String | ||
| + | |Returns the class name of the given class. | ||
| + | |- | ||
| + | |mono_class_getNamespace(classId) | ||
| + | |String | ||
| + | |Returns the namespace of the given class. | ||
| + | |- | ||
| + | |mono_class_getParent(classId) | ||
| + | |Integer | ||
| + | |Returns the class ID of the parent class. | ||
| + | |- | ||
| + | |mono_class_getStaticFieldAddress(domainId, classId) | ||
| + | |Integer | ||
| + | |Returns the base address for the static field storage area of the given class in the given domain. | ||
| + | |- | ||
| + | |mono_class_enumFields(classId) | ||
| + | |Table | ||
| + | |Returns a table containing field objects for the given class. | ||
| + | |- | ||
| + | |mono_class_enumMethods(classId) | ||
| + | |Table | ||
| + | |Returns a table containing method objects for the given class. | ||
| + | |- | ||
| + | |mono_getJitInfo(address) | ||
| + | |Table | ||
| + | |Returns JIT information for the code address. | ||
| + | |- | ||
| + | |mono_image_findClass(imageId, namespace, className) | ||
| + | |Integer | ||
| + | |Returns the class ID for the given namespace and class name in the specified image. | ||
| + | |- | ||
| + | |mono_findClass(namespace, className) | ||
| + | |Integer | ||
| + | |Returns the class ID for the given namespace and class name. | ||
| + | |- | ||
| + | |mono_class_findMethod(classId, methodName) | ||
| + | |Integer | ||
| + | |Returns the method ID of the given method in the given class. | ||
| + | |- | ||
| + | |mono_findMethod(namespace, className, methodName) | ||
| + | |Integer | ||
| + | |Returns the method ID for the given namespace, class name, and method name. | ||
| + | |- | ||
| + | |mono_method_getName(methodId) | ||
| + | |String | ||
| + | |Returns the name of the given method. | ||
| + | |- | ||
| + | |mono_method_getHeader(methodId) | ||
| + | |Integer | ||
| + | |Returns the method header ID. | ||
| + | |- | ||
| + | |mono_method_getSignature(methodId) | ||
| + | |String, Table, String | ||
| + | |Returns the signature result, parameter names, and return type of the method. | ||
| + | |- | ||
| + | |mono_method_disassemble(methodId) | ||
| + | |String | ||
| + | |Returns the disassembled IL code for the given method. | ||
| + | |- | ||
| + | |mono_method_getClass(methodId) | ||
| + | |Integer | ||
| + | |Returns the class ID that owns the given method. | ||
| + | |- | ||
| + | |mono_compile_method(methodId) | ||
| + | |Integer | ||
| + | |JIT-compiles the method if needed and returns the native method address. | ||
| + | |- | ||
| + | |mono_free_method(methodId) | ||
| + | |void | ||
| + | |Frees a dynamic method. This only works on dynamic methods and only if the profiler is not being used. | ||
| + | |- | ||
| + | |mono_methodheader_getILCode(methodHeader) | ||
| + | |Integer, Integer | ||
| + | |Returns the IL code address and size for the given method header. | ||
| + | |- | ||
| + | |mono_getILCodeFromMethod(methodId) | ||
| + | |Integer, Integer | ||
| + | |Gets the method header and returns the IL code address and size. | ||
| + | |- | ||
| + | |mono_image_rva_map(imageId, offset) | ||
| + | |Integer | ||
| + | |Maps an image RVA/offset. Exact usage depends on the Mono image context. | ||
| + | |- | ||
| + | |mono_loadAssemblyFromFile(fname) | ||
| + | |Integer | ||
| + | |Loads a C# assembly in the target process. | ||
| + | |- | ||
| + | |mono_invoke_method(domainId, methodId, address, args) | ||
| + | |Variant | ||
| + | |Invokes a Mono method with the given domain, method, instance address, and arguments. | ||
| + | |} | ||
| − | + | == Field Object == | |
| − | |||
| − | + | <code>mono_class_enumFields(classId)</code> returns a table of field objects. | |
| − | |||
| − | ; | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" |
| − | + | !align="left"|Field | |
| + | !align="left"|Type | ||
| + | !style="width: 80%;background-color:white;" align="left"|Description | ||
| + | |- | ||
| + | |field | ||
| + | |Integer | ||
| + | |The field ID. | ||
| + | |- | ||
| + | |type | ||
| + | |ValueType | ||
| + | |The Cheat Engine value type. | ||
| + | |- | ||
| + | |monotype | ||
| + | |Integer | ||
| + | |The Mono type. | ||
| + | |- | ||
| + | |parent | ||
| + | |Integer | ||
| + | |The parent class ID. | ||
| + | |- | ||
| + | |offset | ||
| + | |Integer | ||
| + | |The offset in bytes from the object or static field base address. | ||
| + | |- | ||
| + | |flags | ||
| + | |Integer | ||
| + | |The field flags. | ||
| + | |- | ||
| + | |isStatic | ||
| + | |Boolean | ||
| + | |True if the field is static. If true, use mono_class_getStaticFieldAddress to get the static field base address. | ||
| + | |- | ||
| + | |name | ||
| + | |String | ||
| + | |The field name. | ||
| + | |- | ||
| + | |typename | ||
| + | |String | ||
| + | |The type name, usually including namespace, such as System.Int32. | ||
| + | |} | ||
| − | + | == Method Object == | |
| − | |||
| − | |||
| − | + | <code>mono_class_enumMethods(classId)</code> returns a table of method objects. | |
| − | |||
| − | ; | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" |
| − | + | !align="left"|Field | |
| + | !align="left"|Type | ||
| + | !style="width: 80%;background-color:white;" align="left"|Description | ||
| + | |- | ||
| + | |method | ||
| + | |Integer | ||
| + | |The method ID. | ||
| + | |- | ||
| + | |name | ||
| + | |String | ||
| + | |The method name. | ||
| + | |} | ||
| − | + | == JIT Info Object == | |
| − | |||
| − | + | <code>mono_getJitInfo(address)</code> returns a table with information about the compiled native method at the given address. | |
| − | |||
| − | ; | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" |
| − | + | !align="left"|Field | |
| + | !align="left"|Type | ||
| + | !style="width: 80%;background-color:white;" align="left"|Description | ||
| + | |- | ||
| + | |method | ||
| + | |Integer | ||
| + | |The method ID. | ||
| + | |- | ||
| + | |code_start | ||
| + | |Integer | ||
| + | |The native code start address. | ||
| + | |- | ||
| + | |code_size | ||
| + | |Integer | ||
| + | |The native code size in bytes. | ||
| + | |} | ||
| − | + | == Method Signature Result == | |
| − | |||
| − | + | <code>mono_method_getSignature(methodId)</code> returns multiple values. | |
| − | |||
| − | ; | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" |
| − | + | !align="left"|Return Value | |
| + | !align="left"|Type | ||
| + | !style="width: 80%;background-color:white;" align="left"|Description | ||
| + | |- | ||
| + | |result | ||
| + | |String | ||
| + | |The formatted method signature result. | ||
| + | |- | ||
| + | |parameterNames | ||
| + | |Table | ||
| + | |A table containing parameter names. | ||
| + | |- | ||
| + | |returnType | ||
| + | |String | ||
| + | |The return type string. | ||
| + | |} | ||
| − | + | == Cheat Engine Hooks == | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | ; | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" |
| − | + | !align="left"|Function | |
| − | + | !align="left"|Return Type | |
| − | + | !style="width: 80%;background-color:white;" align="left"|Description | |
| + | |- | ||
| + | |mono_initialize() | ||
| + | |void | ||
| + | |Sets up Mono-related hooks, calls the previous open-process hook if present, and schedules mono_OpenProcessMT. | ||
| + | |- | ||
| + | |mono_OpenProcessMT(t) | ||
| + | |void | ||
| + | |Called when a process is opened. If t is not nil, it destroys t, enumerates modules looking for mono.dll, and adds Mono menu items to the main form. | ||
| + | |- | ||
| + | |mono_OpenProcess(processid) | ||
| + | |void | ||
| + | |Open-process hook used by the Mono integration. | ||
| + | |- | ||
| + | |mono_structureDissectOverrideCallback(structure, baseaddress) | ||
| + | |Boolean/nil | ||
| + | |Called by Cheat Engine when a structure is dissected. Returns true if structure members were defined, otherwise nil. | ||
| + | |- | ||
| + | |mono_structureNameLookupCallback(address) | ||
| + | |String, Integer/nil | ||
| + | |Called by Cheat Engine when creating a new structure in the structure dissector. Returns classname and current address, or nil. | ||
| + | |- | ||
| + | |mono_symbolLookupCallback(symbol) | ||
| + | |Integer/nil | ||
| + | |Called by Cheat Engine when resolving a Mono symbol. Returns an address or nil. | ||
| + | |- | ||
| + | |mono_addressLookupCallback(address) | ||
| + | |String | ||
| + | |Called by Cheat Engine's disassembly view to display a Mono symbol name for the given address. | ||
| + | |} | ||
| − | + | == Mono Dissector Methods == | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | {|width="85%" cellpadding="10%" cellspacing="0" border="0" | |
| − | + | !align="left"|Function | |
| + | !align="left"|Description | ||
| + | |- | ||
| + | |monoform_killform(sender) | ||
| + | |Closes or destroys the Mono dissector form. | ||
| + | |- | ||
| + | |monoform_miShowILDisassemblyClick(sender) | ||
| + | |Handles the Show IL Disassembly menu item. | ||
| + | |- | ||
| + | |monoform_miRejitClick(sender) | ||
| + | |Handles the ReJIT menu item. | ||
| + | |- | ||
| + | |monoform_miGetILCodeClick(sender) | ||
| + | |Handles the Get IL Code menu item. | ||
| + | |- | ||
| + | |monoform_EnumImages(node) | ||
| + | |Enumerates images for the selected tree node. | ||
| + | |- | ||
| + | |monoform_EnumClasses(node) | ||
| + | |Enumerates classes for the selected tree node. | ||
| + | |- | ||
| + | |monoform_EnumFields(node) | ||
| + | |Enumerates fields for the selected tree node. | ||
| + | |- | ||
| + | |monoform_EnumMethods(node) | ||
| + | |Enumerates methods for the selected tree node. | ||
| + | |- | ||
| + | |mono_TVExpanding(sender, node) | ||
| + | |Handles Mono tree-view expansion. | ||
| + | |- | ||
| + | |mono_TVCollapsing(sender, node) | ||
| + | |Handles Mono tree-view collapsing. | ||
| + | |- | ||
| + | |monoform_FindDialogFind(sender) | ||
| + | |Handles Mono dissector find dialog searches. | ||
| + | |- | ||
| + | |monoform_miFindClick(sender) | ||
| + | |Handles the Find menu item. | ||
| + | |- | ||
| + | |monoform_miExpandAllClick(sender) | ||
| + | |Handles the Expand All menu item. | ||
| + | |- | ||
| + | |monoform_miSaveClick(sender) | ||
| + | |Handles the Save menu item. | ||
| + | |- | ||
| + | |mono_dissect() | ||
| + | |Opens or initializes the Mono dissector. | ||
| + | |- | ||
| + | |miMonoActivateClick(sender) | ||
| + | |Handles Mono activation from the Cheat Engine menu. | ||
| + | |- | ||
| + | |miMonoDissectClick(sender) | ||
| + | |Handles opening the Mono dissector from the Cheat Engine menu. | ||
| + | |} | ||
| − | + | == Examples == | |
| − | |||
| − | + | ===Launch the Mono data collector=== | |
| − | + | <syntaxhighlight lang="lua" line highlight="1"> | |
| + | local monoBase = LaunchMonoDataCollector() | ||
| − | + | if monoBase == 0 then | |
| − | : | + | print("Mono data collector could not be launched") |
| − | + | else | |
| − | + | print(string.format("Mono base: %X", monoBase)) | |
| − | + | end | |
| + | </syntaxhighlight> | ||
| − | + | ===Enumerate Mono domains=== | |
| − | + | <syntaxhighlight lang="lua" line highlight="1"> | |
| + | local domains = mono_enumDomains() | ||
| − | + | for i, domain in ipairs(domains) do | |
| − | : | + | print(i .. ": " .. string.format("%X", domain)) |
| + | end | ||
| + | </syntaxhighlight> | ||
| − | + | ===Set the current Mono domain=== | |
| − | + | <syntaxhighlight lang="lua" line highlight="1,5"> | |
| + | local domains = mono_enumDomains() | ||
| − | + | if #domains > 0 then | |
| − | + | local domain = domains[1] | |
| + | mono_setCurrentDomain(domain) | ||
| + | end | ||
| + | </syntaxhighlight> | ||
| − | + | ===Enumerate assemblies=== | |
| − | + | <syntaxhighlight lang="lua" line highlight="1,4"> | |
| − | + | local assemblies = mono_enumAssemblies() | |
| − | |||
| − | + | for i, assembly in ipairs(assemblies) do | |
| − | + | local image = mono_getImageFromAssembly(assembly) | |
| − | + | print(i .. ": " .. tostring(mono_image_get_name(image))) | |
| − | + | end | |
| + | </syntaxhighlight> | ||
| − | + | ===Find a class=== | |
| − | + | <syntaxhighlight lang="lua" line highlight="1"> | |
| + | local classId = mono_findClass("PlayerNamespace", "PlayerController") | ||
| − | + | if classId ~= nil and classId ~= 0 then | |
| − | + | print("Class found: " .. tostring(classId)) | |
| + | end | ||
| + | </syntaxhighlight> | ||
| − | == | + | ===Enumerate class fields=== |
| + | <syntaxhighlight lang="lua" line highlight="1,3"> | ||
| + | local classId = mono_findClass("PlayerNamespace", "PlayerController") | ||
| − | + | local fields = mono_class_enumFields(classId) | |
| − | |||
| − | + | for i, field in ipairs(fields) do | |
| − | : | + | print(field.name .. " : " .. field.typename .. " @ " .. string.format("%X", field.offset)) |
| + | end | ||
| + | </syntaxhighlight> | ||
| − | + | ===Enumerate class methods=== | |
| + | <syntaxhighlight lang="lua" line highlight="1,3"> | ||
| + | local classId = mono_findClass("PlayerNamespace", "PlayerController") | ||
| − | + | local methods = mono_class_enumMethods(classId) | |
| − | |||
| − | |||
| − | |||
| − | + | for i, method in ipairs(methods) do | |
| − | + | print(method.name .. " = " .. tostring(method.method)) | |
| − | + | end | |
| + | </syntaxhighlight> | ||
| − | + | ===Find and compile a method=== | |
| − | + | <syntaxhighlight lang="lua" line highlight="1,4"> | |
| − | + | local methodId = mono_findMethod("PlayerNamespace", "PlayerController", "TakeDamage") | |
| − | |||
| − | + | if methodId ~= nil and methodId ~= 0 then | |
| − | + | local address = mono_compile_method(methodId) | |
| − | |||
| − | |||
| + | print(string.format("Native address: %X", address)) | ||
| + | end | ||
| + | </syntaxhighlight> | ||
| + | ===Get method signature=== | ||
| + | <syntaxhighlight lang="lua" line highlight="1,4"> | ||
| + | local methodId = mono_findMethod("PlayerNamespace", "PlayerController", "TakeDamage") | ||
| − | == | + | if methodId ~= nil and methodId ~= 0 then |
| + | local signature, parameterNames, returnType = mono_method_getSignature(methodId) | ||
| − | + | print(signature) | |
| − | + | print("Returns: " .. tostring(returnType)) | |
| − | + | end | |
| − | + | </syntaxhighlight> | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | ===Get JIT information from an address=== | ||
| + | <syntaxhighlight lang="lua" line highlight="2"> | ||
| + | local address = getAddress("GameAssembly.dll+123456") | ||
| + | local info = mono_getJitInfo(address) | ||
| + | if info ~= nil then | ||
| + | print("Method: " .. tostring(info.method)) | ||
| + | print("Code start: " .. string.format("%X", info.code_start)) | ||
| + | print("Code size: " .. tostring(info.code_size)) | ||
| + | end | ||
| + | </syntaxhighlight> | ||
{{MonoSeeAlso}} | {{MonoSeeAlso}} | ||
Latest revision as of 20:32, 25 June 2026
The advanced Mono features of Cheat Engine are controlled by the monoscript.lua script in the autorun directory.
When Cheat Engine attaches to a process, the script checks for mono.dll. If Mono is detected, the matching MonoDataDissector DLL from the autorun directory is injected into the target process. The injected DLL creates a named pipe, and the Lua side communicates with it to perform Mono-related operations.
Contents
Main Methods[edit]
| Function | Return Type | Description |
|---|---|---|
| LaunchMonoDataCollector() | Integer | Injects the Mono data collector DLL. Returns 0 on failure, or the monoBase returned by the CMD_INITMONO pipe command. |
| monoTypeToVarType(monoType) | ValueType | Returns the Cheat Engine value type for the given Mono type, such as vtString, vtByte, vtWord, vtDword, vtSingle, vtDouble, or vtPointer. |
| mono_object_getClass(address) | Integer, String | Returns the class ID and class name of the object at the given address. |
| mono_enumDomains() | Table | Returns a table array containing the domain address of each Mono domain. |
| mono_setCurrentDomain(domainId) | Integer | Sets the Mono domain used by the MonoDataCollector. |
| mono_enumAssemblies() | Table | Returns a table containing the assembly IDs for each assembly in the current domain. |
| mono_getImageFromAssembly(assemblyId) | Integer | Returns the image ID for the given assembly. |
| mono_image_get_name(imageId) | String | Returns the name of the assembly image. |
| mono_image_enumClasses(imageId) | Table | Returns a table containing the class IDs for classes in the given assembly image. |
| mono_class_getName(classId) | String | Returns the class name of the given class. |
| mono_class_getNamespace(classId) | String | Returns the namespace of the given class. |
| mono_class_getParent(classId) | Integer | Returns the class ID of the parent class. |
| mono_class_getStaticFieldAddress(domainId, classId) | Integer | Returns the base address for the static field storage area of the given class in the given domain. |
| mono_class_enumFields(classId) | Table | Returns a table containing field objects for the given class. |
| mono_class_enumMethods(classId) | Table | Returns a table containing method objects for the given class. |
| mono_getJitInfo(address) | Table | Returns JIT information for the code address. |
| mono_image_findClass(imageId, namespace, className) | Integer | Returns the class ID for the given namespace and class name in the specified image. |
| mono_findClass(namespace, className) | Integer | Returns the class ID for the given namespace and class name. |
| mono_class_findMethod(classId, methodName) | Integer | Returns the method ID of the given method in the given class. |
| mono_findMethod(namespace, className, methodName) | Integer | Returns the method ID for the given namespace, class name, and method name. |
| mono_method_getName(methodId) | String | Returns the name of the given method. |
| mono_method_getHeader(methodId) | Integer | Returns the method header ID. |
| mono_method_getSignature(methodId) | String, Table, String | Returns the signature result, parameter names, and return type of the method. |
| mono_method_disassemble(methodId) | String | Returns the disassembled IL code for the given method. |
| mono_method_getClass(methodId) | Integer | Returns the class ID that owns the given method. |
| mono_compile_method(methodId) | Integer | JIT-compiles the method if needed and returns the native method address. |
| mono_free_method(methodId) | void | Frees a dynamic method. This only works on dynamic methods and only if the profiler is not being used. |
| mono_methodheader_getILCode(methodHeader) | Integer, Integer | Returns the IL code address and size for the given method header. |
| mono_getILCodeFromMethod(methodId) | Integer, Integer | Gets the method header and returns the IL code address and size. |
| mono_image_rva_map(imageId, offset) | Integer | Maps an image RVA/offset. Exact usage depends on the Mono image context. |
| mono_loadAssemblyFromFile(fname) | Integer | Loads a C# assembly in the target process. |
| mono_invoke_method(domainId, methodId, address, args) | Variant | Invokes a Mono method with the given domain, method, instance address, and arguments. |
Field Object[edit]
mono_class_enumFields(classId) returns a table of field objects.
| Field | Type | Description |
|---|---|---|
| field | Integer | The field ID. |
| type | ValueType | The Cheat Engine value type. |
| monotype | Integer | The Mono type. |
| parent | Integer | The parent class ID. |
| offset | Integer | The offset in bytes from the object or static field base address. |
| flags | Integer | The field flags. |
| isStatic | Boolean | True if the field is static. If true, use mono_class_getStaticFieldAddress to get the static field base address. |
| name | String | The field name. |
| typename | String | The type name, usually including namespace, such as System.Int32. |
Method Object[edit]
mono_class_enumMethods(classId) returns a table of method objects.
| Field | Type | Description |
|---|---|---|
| method | Integer | The method ID. |
| name | String | The method name. |
JIT Info Object[edit]
mono_getJitInfo(address) returns a table with information about the compiled native method at the given address.
| Field | Type | Description |
|---|---|---|
| method | Integer | The method ID. |
| code_start | Integer | The native code start address. |
| code_size | Integer | The native code size in bytes. |
Method Signature Result[edit]
mono_method_getSignature(methodId) returns multiple values.
| Return Value | Type | Description |
|---|---|---|
| result | String | The formatted method signature result. |
| parameterNames | Table | A table containing parameter names. |
| returnType | String | The return type string. |
Cheat Engine Hooks[edit]
| Function | Return Type | Description |
|---|---|---|
| mono_initialize() | void | Sets up Mono-related hooks, calls the previous open-process hook if present, and schedules mono_OpenProcessMT. |
| mono_OpenProcessMT(t) | void | Called when a process is opened. If t is not nil, it destroys t, enumerates modules looking for mono.dll, and adds Mono menu items to the main form. |
| mono_OpenProcess(processid) | void | Open-process hook used by the Mono integration. |
| mono_structureDissectOverrideCallback(structure, baseaddress) | Boolean/nil | Called by Cheat Engine when a structure is dissected. Returns true if structure members were defined, otherwise nil. |
| mono_structureNameLookupCallback(address) | String, Integer/nil | Called by Cheat Engine when creating a new structure in the structure dissector. Returns classname and current address, or nil. |
| mono_symbolLookupCallback(symbol) | Integer/nil | Called by Cheat Engine when resolving a Mono symbol. Returns an address or nil. |
| mono_addressLookupCallback(address) | String | Called by Cheat Engine's disassembly view to display a Mono symbol name for the given address. |
Mono Dissector Methods[edit]
| Function | Description |
|---|---|
| monoform_killform(sender) | Closes or destroys the Mono dissector form. |
| monoform_miShowILDisassemblyClick(sender) | Handles the Show IL Disassembly menu item. |
| monoform_miRejitClick(sender) | Handles the ReJIT menu item. |
| monoform_miGetILCodeClick(sender) | Handles the Get IL Code menu item. |
| monoform_EnumImages(node) | Enumerates images for the selected tree node. |
| monoform_EnumClasses(node) | Enumerates classes for the selected tree node. |
| monoform_EnumFields(node) | Enumerates fields for the selected tree node. |
| monoform_EnumMethods(node) | Enumerates methods for the selected tree node. |
| mono_TVExpanding(sender, node) | Handles Mono tree-view expansion. |
| mono_TVCollapsing(sender, node) | Handles Mono tree-view collapsing. |
| monoform_FindDialogFind(sender) | Handles Mono dissector find dialog searches. |
| monoform_miFindClick(sender) | Handles the Find menu item. |
| monoform_miExpandAllClick(sender) | Handles the Expand All menu item. |
| monoform_miSaveClick(sender) | Handles the Save menu item. |
| mono_dissect() | Opens or initializes the Mono dissector. |
| miMonoActivateClick(sender) | Handles Mono activation from the Cheat Engine menu. |
| miMonoDissectClick(sender) | Handles opening the Mono dissector from the Cheat Engine menu. |
Examples[edit]
Launch the Mono data collector[edit]
1 local monoBase = LaunchMonoDataCollector()
2
3 if monoBase == 0 then
4 print("Mono data collector could not be launched")
5 else
6 print(string.format("Mono base: %X", monoBase))
7 end
Enumerate Mono domains[edit]
1 local domains = mono_enumDomains()
2
3 for i, domain in ipairs(domains) do
4 print(i .. ": " .. string.format("%X", domain))
5 end
Set the current Mono domain[edit]
1 local domains = mono_enumDomains()
2
3 if #domains > 0 then
4 local domain = domains[1]
5 mono_setCurrentDomain(domain)
6 end
Enumerate assemblies[edit]
1 local assemblies = mono_enumAssemblies()
2
3 for i, assembly in ipairs(assemblies) do
4 local image = mono_getImageFromAssembly(assembly)
5
6 print(i .. ": " .. tostring(mono_image_get_name(image)))
7 end
Find a class[edit]
1 local classId = mono_findClass("PlayerNamespace", "PlayerController")
2
3 if classId ~= nil and classId ~= 0 then
4 print("Class found: " .. tostring(classId))
5 end
Enumerate class fields[edit]
1 local classId = mono_findClass("PlayerNamespace", "PlayerController")
2
3 local fields = mono_class_enumFields(classId)
4
5 for i, field in ipairs(fields) do
6 print(field.name .. " : " .. field.typename .. " @ " .. string.format("%X", field.offset))
7 end
Enumerate class methods[edit]
1 local classId = mono_findClass("PlayerNamespace", "PlayerController")
2
3 local methods = mono_class_enumMethods(classId)
4
5 for i, method in ipairs(methods) do
6 print(method.name .. " = " .. tostring(method.method))
7 end
Find and compile a method[edit]
1 local methodId = mono_findMethod("PlayerNamespace", "PlayerController", "TakeDamage")
2
3 if methodId ~= nil and methodId ~= 0 then
4 local address = mono_compile_method(methodId)
5
6 print(string.format("Native address: %X", address))
7 end
Get method signature[edit]
1 local methodId = mono_findMethod("PlayerNamespace", "PlayerController", "TakeDamage")
2
3 if methodId ~= nil and methodId ~= 0 then
4 local signature, parameterNames, returnType = mono_method_getSignature(methodId)
5
6 print(signature)
7 print("Returns: " .. tostring(returnType))
8 end
Get JIT information from an address[edit]
1 local address = getAddress("GameAssembly.dll+123456")
2 local info = mono_getJitInfo(address)
3
4 if info ~= nil then
5 print("Method: " .. tostring(info.method))
6 print("Code start: " .. string.format("%X", info.code_start))
7 print("Code size: " .. tostring(info.code_size))
8 end