-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathil2cpp.h
More file actions
230 lines (205 loc) · 9.4 KB
/
il2cpp.h
File metadata and controls
230 lines (205 loc) · 9.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#pragma once
#include "types.h"
#include <dlfcn.h>
typedef Il2CppString* (*il2cpp_string_new_t)(const char* str);
typedef Il2CppImage* (*il2cpp_assembly_get_image_t)(Il2CppAssembly* assembly);
typedef Il2CppAssembly* (*il2cpp_domain_assembly_open_t)(Il2CppDomain* domain, const char* name);
typedef Il2CppClass* (*il2cpp_class_from_name_t)(Il2CppImage* assembly, const char* name_space, const char* name);
typedef Il2CppClass* (*il2cpp_class_from_index_t)(Il2CppImage* assembly, size_t index);
typedef Il2CppMethod* (*il2cpp_class_get_methods_t)(Il2CppClass* klass, void** iter);
typedef Il2CppMethod* (*il2cpp_class_get_method_from_name_t)(Il2CppClass* klass, const char* name, int paramcount);
typedef Il2CppObject* (*il2cpp_runtime_invoke_t)(Il2CppMethod* method, void* obj, void** params, Il2CppObject* exec);
typedef Il2CppArray* (*il2cpp_array_new_t)(Il2CppClass* klass, uint32_t length);
typedef Il2CppField* (*il2cpp_class_get_fields_t)(Il2CppClass* klass, void** iter);
typedef Il2CppField* (*il2cpp_class_get_field_from_name_t)(Il2CppClass* klass, const char* name);
typedef void (*il2cpp_field_get_value_t)(Il2CppObject* object, Il2CppField* field, void* out);
typedef void (*il2cpp_field_set_value_t)(Il2CppObject* object, Il2CppField* field, void* value);
typedef void (*il2cpp_field_static_get_value_t)(Il2CppField* field, void* value);
typedef void (*il2cpp_field_static_set_value_t)(Il2CppField* field, void* value);
typedef uint32_t(*il2cpp_method_get_token_t) (Il2CppMethod* method);
typedef uint32_t(*il2cpp_object_get_size_t)(Il2CppObject* object);
typedef uint32_t(*il2cpp_array_get_byte_length_t)(Il2CppArray* arr);
typedef uint32_t(*il2cpp_array_get_length_t)(Il2CppArray* arr);
typedef const char16_t* (*il2cpp_string_chars_t) (Il2CppString* string);
typedef const PropertyInfo* (*il2cpp_class_get_property_from_name_t) (Il2CppClass* klass, const char* name);
typedef Il2CppMethod* (*il2cpp_property_get_get_method_t) (PropertyInfo* prop);
struct Il2cppRuntime {
static void* GetIL2CPPModule()
{
auto mod = dlopen("libil2cpp.so", RTLD_LAZY);
if (mod != NULL) return mod;
}
static Il2CppImage* il2cpp_assembly_get_image(const char* name)
{
auto il2cpp_assembly_get_image = (il2cpp_assembly_get_image_t)dlsym(GetIL2CPPModule(), "il2cpp_assembly_get_image");
auto assembly = (il2cpp_domain_assembly_open_t)dlsym(GetIL2CPPModule(), "il2cpp_domain_assembly_open");
return il2cpp_assembly_get_image(assembly(NULL, name));
}
static Il2CppClass* il2cpp_class_from_name(Il2CppImage* assembly, const char* name_space, const char* name)
{
auto il2cpp_class_from_name = (il2cpp_class_from_name_t)dlsym(GetIL2CPPModule(), "il2cpp_class_from_name");
return il2cpp_class_from_name(assembly, name_space, name);
}
static Il2CppClass* il2cpp_class_from_index(Il2CppImage* assembly, size_t index)
{
auto il2cpp_class_from_index = (il2cpp_class_from_index_t)dlsym(GetIL2CPPModule(), "il2cpp_image_get_class");
return il2cpp_class_from_index(assembly, index);
}
static uint32_t il2cpp_method_get_token(Il2CppMethod* method)
{
auto il2cpp_method_get_token = (il2cpp_method_get_token_t)dlsym(GetIL2CPPModule(), "il2cpp_method_get_token");
return il2cpp_method_get_token(method);
}
static Il2CppMethod* il2cpp_class_get_method_from_name(Il2CppClass* klass, const char* name, int paramcount)
{
auto il2cpp_class_get_method_from_name = (il2cpp_class_get_method_from_name_t)dlsym(GetIL2CPPModule(), "il2cpp_class_get_method_from_name");
return il2cpp_class_get_method_from_name(klass, name, paramcount);
}
static Il2CppClass* il2cpp_class_from_token(Il2CppImage* assembly, uint32_t token)
{
for (uint32_t x = 0; x < assembly->typeCount; x++)
{
Il2CppClass* klass = il2cpp_class_from_index(assembly, x);
if (klass == nullptr)
continue;
if (klass->token == 0)
continue;
if (klass->token == token)
return klass;
}
return nullptr;
}
static Il2CppField* il2cpp_class_get_fields(Il2CppClass* klass, void** iterator)
{
auto il2cpp_class_get_fields = (il2cpp_class_get_fields_t)dlsym(GetIL2CPPModule(), "il2cpp_class_get_fields");
return il2cpp_class_get_fields(klass, iterator);
}
static Il2CppMethod* il2cpp_class_get_methods(Il2CppClass* klass, void** iterator)
{
auto il2cpp_class_get_methods = (il2cpp_class_get_methods_t)dlsym(GetIL2CPPModule(), "il2cpp_class_get_methods");
return il2cpp_class_get_methods(klass, iterator);
}
static Il2CppMethod* il2cpp_class_get_method_from_token(Il2CppClass* klass, uint32_t token)
{
void* iterator = nullptr;
while (auto method = il2cpp_class_get_methods(klass, &iterator)) {
if (method == nullptr) continue;
if (il2cpp_method_get_token(method) == token) {
return method;
}
}
return nullptr;
}
static Il2CppField* il2cpp_field_from_token(Il2CppClass* klass, uint32_t token)
{
void* iter = nullptr;
Il2CppField* field;
while (field = il2cpp_class_get_fields(klass, &iter)) {
if (field->token == 0)
continue;
if (field->token == token)
return field;
}
return nullptr;
}
static Il2CppField* il2cpp_field_from_name(Il2CppClass* klass, const char* name)
{
auto il2cpp_field_from_name = (il2cpp_class_get_field_from_name_t)dlsym(GetIL2CPPModule(), "il2cpp_class_get_field_from_name");
return il2cpp_field_from_name(klass, name);
}
static Il2CppMethod* il2cpp_property_get_get_method(Il2CppClass* klass, const char* name) {
il2cpp_class_get_property_from_name_t il2cpp_string_chars = (il2cpp_class_get_property_from_name_t)dlsym(GetIL2CPPModule(), "il2cpp_class_get_property_from_name");
il2cpp_property_get_get_method_t il2cpp_string_chars_2 = (il2cpp_property_get_get_method_t)dlsym(GetIL2CPPModule(), "il2cpp_property_get_get_method");
return il2cpp_string_chars_2((PropertyInfo*)il2cpp_string_chars(klass, name));
}
static void il2cpp_field_get_value(Il2CppObject* object, Il2CppField* field, void* out)
{
auto il2cpp_field_get_value = (il2cpp_field_get_value_t)dlsym(GetIL2CPPModule(), "il2cpp_field_get_value");
return il2cpp_field_get_value(object, field, out);
}
static void il2cpp_field_set_value(Il2CppObject* object, Il2CppField* field, void* value)
{
auto il2cpp_field_set_value = (il2cpp_field_set_value_t)dlsym(GetIL2CPPModule(), "il2cpp_field_set_value");
return il2cpp_field_set_value(object, field, value);
}
static void il2cpp_field_static_get_value(Il2CppField* field, void* value)
{
auto il2cpp_field_static_get_value = (il2cpp_field_static_get_value_t)dlsym(GetIL2CPPModule(), "il2cpp_field_static_get_value");
return il2cpp_field_static_get_value(field, value);
}
static void il2cpp_field_static_set_value(Il2CppField* field, void* value)
{
auto il2cpp_field_static_set_value = (il2cpp_field_static_set_value_t)dlsym(GetIL2CPPModule(), "il2cpp_field_static_set_value");
return il2cpp_field_static_set_value(field, value);
}
static void* GetFieldValue(Il2CppObject* object, Il2CppField* info)
{
void* result = nullptr;
il2cpp_field_get_value(object, info, &result);
return result;
}
static void SetFieldValue(Il2CppObject* object, Il2CppField* field, void* value)
{
return il2cpp_field_set_value(object, field, value);
}
static void* GetStaticFieldValue(Il2CppField* field)
{
void* result = nullptr;
il2cpp_field_static_get_value(field, &result);
return result;
}
static void SetStaticFieldValue(Il2CppField* field, void* value)
{
return il2cpp_field_static_set_value(field, value);
}
static Il2CppObject* il2cpp_runtime_invoke(Il2CppMethod* method, void* obj, void** params)
{
auto il2cpp_runtime_invoke = (il2cpp_runtime_invoke_t)dlsym(GetIL2CPPModule(), "il2cpp_runtime_invoke");
return il2cpp_runtime_invoke(method, obj, params, NULL);
}
static Il2CppArray* il2cpp_array_new(Il2CppClass* klass, uint32_t length)
{
auto il2cpp_array_new = (il2cpp_array_new_t)dlsym(GetIL2CPPModule(), "il2cpp_array_new");
return il2cpp_array_new(klass, length);
}
static Il2CppString* il2cpp_string_new(const char* str)
{
auto il2cpp_string = (il2cpp_string_new_t)dlsym(GetIL2CPPModule(), "il2cpp_string_new");
return il2cpp_string(str);
}
static const char16_t* il2cpp_string_chars(Il2CppString* string)
{
auto il2cpp_string_chars = (il2cpp_string_chars_t)dlsym(GetIL2CPPModule(), "il2cpp_string_chars");
return il2cpp_string_chars(string);
}
static uint32_t il2cpp_object_get_size(Il2CppObject* object)
{
auto il2cpp_object_get_size = (il2cpp_object_get_size_t)dlsym(GetIL2CPPModule(), "il2cpp_object_get_size");
return il2cpp_object_get_size(object);
}
static uint32_t il2cpp_array_get_byte_length(Il2CppArray* array)
{
auto il2cpp_array_get_byte_length = (il2cpp_array_get_byte_length_t)dlsym(GetIL2CPPModule(), "il2cpp_array_get_byte_length");
return il2cpp_array_get_byte_length(array);
}
static uint32_t il2cpp_array_get_length(Il2CppArray* array)
{
auto il2cpp_array_get_length = (il2cpp_array_get_length_t)dlsym(GetIL2CPPModule(), "il2cpp_array_length");
return il2cpp_array_get_length(array);
}
template <typename T>
static inline T GetMethod(DWORD Offset)
{
return (T)((uint8_t*)GetIL2CPPModule() + Offset);
}
template <typename T>
static inline T GetField(void* obj, DWORD Offset)
{
return *(T*)((uint8_t*)obj + Offset);
}
template <typename T>
static void SetField(void* obj, DWORD Offset, T val)
{
*(T*)((uint8_t*)obj + Offset) = val;
}
};