├── GameAssemblyEx.sln ├── GameAssemblyEx ├── GameAssemblyEx.vcxproj ├── GameAssemblyEx.vcxproj.filters ├── GameAssemblyEx.vcxproj.user ├── Il2cpp │ ├── Il2cppInclude.h │ ├── Il2cppLib.h │ └── il2cpp.h └── dllmain.cpp ├── LICENSE └── README.md /GameAssemblyEx.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.4.33205.214 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameAssemblyEx", "GameAssemblyEx\GameAssemblyEx.vcxproj", "{F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Debug|x64 = Debug|x64 12 | Debug|x86 = Debug|x86 13 | Release|Any CPU = Release|Any CPU 14 | Release|x64 = Release|x64 15 | Release|x86 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Debug|Any CPU.ActiveCfg = Debug|x64 19 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Debug|Any CPU.Build.0 = Debug|x64 20 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Debug|x64.ActiveCfg = Debug|x64 21 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Debug|x64.Build.0 = Debug|x64 22 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Debug|x86.ActiveCfg = Debug|Win32 23 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Debug|x86.Build.0 = Debug|Win32 24 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Release|Any CPU.ActiveCfg = Release|x64 25 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Release|Any CPU.Build.0 = Release|x64 26 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Release|x64.ActiveCfg = Release|x64 27 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Release|x64.Build.0 = Release|x64 28 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Release|x86.ActiveCfg = Release|Win32 29 | {F58B2EAE-6E1C-4EFE-9C58-28A7B76B08E1}.Release|x86.Build.0 = Release|Win32 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {74CC8828-2248-4F20-B33C-04DE472394B4} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /GameAssemblyEx/GameAssemblyEx.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {f58b2eae-6e1c-4efe-9c58-28a7b76b08e1} 25 | GameAssemblyEx 26 | 10.0 27 | 28 | 29 | 30 | DynamicLibrary 31 | true 32 | v143 33 | Unicode 34 | 35 | 36 | DynamicLibrary 37 | false 38 | v143 39 | true 40 | Unicode 41 | 42 | 43 | DynamicLibrary 44 | true 45 | v143 46 | Unicode 47 | 48 | 49 | DynamicLibrary 50 | false 51 | v143 52 | true 53 | Unicode 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | Level3 76 | true 77 | WIN32;_DEBUG;GAMEASSEMBLYEX_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 78 | true 79 | NotUsing 80 | pch.h 81 | 82 | 83 | Windows 84 | true 85 | false 86 | 87 | 88 | 89 | 90 | Level3 91 | true 92 | true 93 | true 94 | WIN32;NDEBUG;GAMEASSEMBLYEX_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 95 | true 96 | NotUsing 97 | pch.h 98 | 99 | 100 | Windows 101 | true 102 | true 103 | true 104 | false 105 | 106 | 107 | 108 | 109 | Level3 110 | true 111 | _DEBUG;GAMEASSEMBLYEX_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 112 | true 113 | NotUsing 114 | pch.h 115 | 116 | 117 | Windows 118 | true 119 | false 120 | 121 | 122 | 123 | 124 | Level3 125 | true 126 | true 127 | true 128 | NDEBUG;GAMEASSEMBLYEX_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 129 | true 130 | NotUsing 131 | pch.h 132 | 133 | 134 | Windows 135 | true 136 | true 137 | true 138 | false 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | -------------------------------------------------------------------------------- /GameAssemblyEx/GameAssemblyEx.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | Il2cpp 9 | 10 | 11 | Il2cpp 12 | 13 | 14 | Il2cpp 15 | 16 | 17 | 18 | 19 | {6c7875ae-68d6-4921-a937-bb39cc8b0777} 20 | 21 | 22 | -------------------------------------------------------------------------------- /GameAssemblyEx/GameAssemblyEx.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | false 5 | 6 | -------------------------------------------------------------------------------- /GameAssemblyEx/Il2cpp/Il2cppInclude.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include "il2cpp.h" 9 | #include "Il2cppLib.h" -------------------------------------------------------------------------------- /GameAssemblyEx/Il2cpp/Il2cppLib.h: -------------------------------------------------------------------------------- 1 | #define IL2CPPLIB 2 | 3 | // Predefined Structs 4 | struct Thread; 5 | struct Domain; 6 | struct Assembly; 7 | struct Image; 8 | struct Class; 9 | struct Type; 10 | struct Field; 11 | struct Method; 12 | struct Paramater; 13 | struct Property; 14 | struct String; 15 | struct Object; 16 | struct Exception; 17 | struct Event; 18 | 19 | // Structures 20 | 21 | struct Thread {; 22 | 23 | static Thread* Attach(Domain* domain) { 24 | return (Thread*)il2cpp_thread_attach((intptr_t)domain); 25 | } 26 | 27 | bool IsVmThread() { 28 | return il2cpp_is_vm_thread((intptr_t)this); 29 | } 30 | 31 | void Detatch() { 32 | il2cpp_thread_detach((intptr_t)this); 33 | } 34 | }; 35 | 36 | struct Domain { 37 | public: 38 | static Domain* get_main() { 39 | return (Domain*)il2cpp_domain_get(); 40 | } 41 | 42 | Assembly* OpenAssembly(const char* name) { 43 | return (Assembly*)il2cpp_domain_assembly_open((intptr_t)this, name); 44 | } 45 | 46 | std::vector GetAssemblies() { 47 | std::vector assemblies{}; 48 | int size = 0; 49 | Assembly** assembly = (Assembly**)il2cpp_domain_get_assemblies((intptr_t)this, size); 50 | for (int i = 0; i < size; i++) { 51 | assemblies.push_back(assembly[i]); 52 | } 53 | return assemblies; 54 | } 55 | 56 | static Image* GetCorlib() { 57 | return (Image*)il2cpp_get_corlib(); 58 | } 59 | 60 | }; 61 | 62 | 63 | struct Assembly { 64 | public: 65 | Image* GetImage() { 66 | return (Image*)il2cpp_assembly_get_image((intptr_t)this); 67 | } 68 | }; 69 | 70 | struct Image { 71 | public: 72 | Assembly* GetAssembly() { 73 | return (Assembly*)il2cpp_image_get_assembly((intptr_t)this); 74 | } 75 | 76 | const char* GetFilename() { 77 | return il2cpp_image_get_filename((intptr_t)this); 78 | } 79 | 80 | const char* GetName() { 81 | return il2cpp_image_get_name((intptr_t)this); 82 | } 83 | 84 | int GetClassCount() { 85 | return il2cpp_image_get_class_count((intptr_t)this); 86 | } 87 | 88 | Class* GetClass(int index) { 89 | return (Class*)il2cpp_image_get_class((intptr_t)this, index); 90 | } 91 | 92 | Class* GetClassFromName(const char* namespaze, const char* name) { 93 | return (Class*)il2cpp_class_from_name((intptr_t)this, namespaze, name); 94 | } 95 | 96 | Method* GetEntryPoint() { 97 | return (Method*)il2cpp_image_get_entry_point((intptr_t)this); 98 | } 99 | 100 | std::vector GetClasses() { 101 | std::vector classes{}; 102 | int classCount = this->GetClassCount(); 103 | 104 | for (int i = 0; i < classCount; i++) { 105 | 106 | Class* _class = GetClass(i); 107 | if (!_class) { 108 | break; 109 | } 110 | classes.push_back(_class); 111 | } 112 | 113 | return classes; 114 | } 115 | }; 116 | 117 | struct Class { 118 | public: 119 | 120 | static Class* GetFromType(Type* type) { 121 | return (Class*)il2cpp_class_from_type((intptr_t)type); 122 | } 123 | 124 | static Class* GetFromSystemType(Type* type) { 125 | return (Class*)il2cpp_class_from_system_type((intptr_t)type); 126 | } 127 | 128 | static Class* GetFromIl2cppType(Type* type) { 129 | return (Class*)il2cpp_class_from_il2cpp_type((intptr_t)type); 130 | } 131 | 132 | 133 | Type* GetEnumBaseType() { 134 | return (Type*)il2cpp_class_enum_basetype((intptr_t)this); 135 | } 136 | 137 | bool IsGeneric() { 138 | return il2cpp_class_is_generic((intptr_t)this); 139 | } 140 | 141 | bool IsInflated() { 142 | return il2cpp_class_is_inflated((intptr_t)this); 143 | } 144 | 145 | // can other classes inherit from this one 146 | bool IsAssignableFrom(Class* oclass) { 147 | return il2cpp_class_is_assignable_from((intptr_t)this, (intptr_t)oclass); 148 | } 149 | 150 | bool IsSubclassOf(Class* oclass, bool check_interfaces) { 151 | return il2cpp_class_is_subclass_of((intptr_t)this, (intptr_t)oclass, check_interfaces); 152 | } 153 | 154 | bool HasParent(Class* oclass) { 155 | return il2cpp_class_has_parent((intptr_t)this, (intptr_t)oclass); 156 | } 157 | 158 | Class* GetElementClass() { 159 | return (Class*)il2cpp_class_get_element_class((intptr_t)this); 160 | } 161 | 162 | Property* GetPropertyFromName(const char* name) { 163 | return (Property*)il2cpp_class_get_property_from_name((intptr_t)this, name); 164 | } 165 | 166 | Field* GetFieldFromName(const char* name) { 167 | return (Field*)il2cpp_class_get_field_from_name((intptr_t)this, name); 168 | } 169 | 170 | Method* GetMethodFromName(const char* name, int argsCount) { 171 | return (Method*)il2cpp_class_get_method_from_name((intptr_t)this, name, argsCount); 172 | } 173 | 174 | const char* GetName() { 175 | return il2cpp_class_get_name((intptr_t)this); 176 | } 177 | 178 | const char* GetNamespace() { 179 | return il2cpp_class_get_namespace((intptr_t)this); 180 | } 181 | 182 | Class* GetParentClass() { 183 | return (Class*)il2cpp_class_get_parent((intptr_t)this); 184 | } 185 | 186 | Class* GetDeclaringType() { 187 | return (Class*)il2cpp_class_get_declaring_type((intptr_t)this); 188 | } 189 | 190 | int GetInstanceSize() { 191 | return il2cpp_class_instance_size((intptr_t)this); 192 | } 193 | 194 | int GetNumFields() { 195 | return il2cpp_class_num_fields((intptr_t)this); 196 | } 197 | 198 | bool IsValuetype() { 199 | return il2cpp_class_is_valuetype((intptr_t)this); 200 | } 201 | 202 | bool IsBlittable() { 203 | return il2cpp_class_is_blittable((intptr_t)this); 204 | } 205 | 206 | int GetValueSize(int align) { 207 | return il2cpp_class_value_size((intptr_t)this, align); 208 | } 209 | 210 | int GetFlags() { 211 | return il2cpp_class_get_flags((intptr_t)this); 212 | } 213 | 214 | bool IsAbstract() { 215 | return il2cpp_class_is_abstract((intptr_t)this); 216 | } 217 | 218 | bool IsInterface() { 219 | return il2cpp_class_is_interface((intptr_t)this); 220 | } 221 | 222 | int GetArrayElementSize() { 223 | return il2cpp_class_array_element_size((intptr_t)this); 224 | } 225 | 226 | Type* GetType() { 227 | return (Type*)il2cpp_class_get_type((intptr_t)this); 228 | } 229 | 230 | uint32_t GetTypeToken() { 231 | return (uint32_t)il2cpp_class_get_type_token((intptr_t)this); 232 | } 233 | 234 | bool HasAttribute(Class* attr_class) { 235 | return il2cpp_class_has_attribute((intptr_t)this, (intptr_t)attr_class); 236 | } 237 | 238 | bool HasReferences() { 239 | return il2cpp_class_has_references((intptr_t)this); 240 | } 241 | 242 | bool IsEnum() { 243 | return il2cpp_class_is_enum((intptr_t)this); 244 | } 245 | 246 | Image* GetImage() { 247 | return (Image*)il2cpp_class_get_image((intptr_t)this); 248 | } 249 | 250 | const char* GetAssemblyName() { 251 | return il2cpp_class_get_assemblyname((intptr_t)this); 252 | } 253 | 254 | int GetRank() { 255 | return il2cpp_class_get_rank((intptr_t)this); 256 | } 257 | 258 | std::vector GetInterfaces() { 259 | std::vector classes{}; 260 | 261 | intptr_t _class = 0; 262 | intptr_t _class_iter = 0; 263 | while ((_class = il2cpp_class_get_interfaces((intptr_t)this, _class_iter)) != 0) 264 | { 265 | classes.push_back((Class*)_class); 266 | } 267 | 268 | return classes; 269 | } 270 | 271 | std::vector GetNestedTypes() { 272 | std::vector classes{}; 273 | 274 | intptr_t _class = 0; 275 | intptr_t _class_iter = 0; 276 | while ((_class = il2cpp_class_get_nested_types((intptr_t)this, _class_iter)) != 0) 277 | { 278 | classes.push_back((Class*)_class); 279 | } 280 | 281 | return classes; 282 | } 283 | 284 | std::vector GetEvents() { 285 | std::vector events{}; 286 | 287 | intptr_t event = 0; 288 | intptr_t event_iter = 0; 289 | while ((event = il2cpp_class_get_events((intptr_t)this, event_iter)) != 0) 290 | { 291 | events.push_back((Event*)event); 292 | } 293 | 294 | return events; 295 | } 296 | 297 | std::vector GetFields() { 298 | std::vector fields{}; 299 | 300 | intptr_t field = 0; 301 | intptr_t field_iter = 0; 302 | while ((field = il2cpp_class_get_fields((intptr_t)this, field_iter)) != 0) 303 | { 304 | fields.push_back((Field*)field); 305 | } 306 | 307 | return fields; 308 | } 309 | 310 | std::vector GetMethods() { 311 | std::vector methods{}; 312 | 313 | intptr_t method = 0; 314 | intptr_t method_iter = 0; 315 | while ((method = il2cpp_class_get_methods((intptr_t)this, method_iter)) != 0) 316 | { 317 | methods.push_back((Method*)method); 318 | } 319 | 320 | return methods; 321 | } 322 | 323 | std::vector GetProperties() { 324 | std::vector properties{}; 325 | 326 | intptr_t property = 0; 327 | intptr_t property_iter = 0; 328 | while ((property = il2cpp_class_get_properties((intptr_t)this, property_iter)) != 0) 329 | { 330 | properties.push_back((Property*)property); 331 | } 332 | 333 | return properties; 334 | } 335 | 336 | }; 337 | 338 | struct Type { 339 | public: 340 | Class* GetClassOrElementClass() { 341 | return (Class*)il2cpp_type_get_class_or_element_class((intptr_t)this); 342 | } 343 | 344 | Object* GetTypeObject() { 345 | return (Object*)il2cpp_type_get_object((intptr_t)this); 346 | } 347 | 348 | bool IsEqualTo(Type* otherType) { 349 | return il2cpp_type_equals((intptr_t)this, (intptr_t)otherType); 350 | } 351 | 352 | int GetAttributes() { 353 | return il2cpp_type_get_attrs((intptr_t)this); 354 | } 355 | 356 | const char* GetName() { 357 | return il2cpp_type_get_name((intptr_t)this); 358 | } 359 | 360 | const char* GetAssemblyQualifiedName() { 361 | return il2cpp_type_get_assembly_qualified_name((intptr_t)this); 362 | } 363 | 364 | bool IsByref() { 365 | return il2cpp_type_is_byref((intptr_t)this); 366 | } 367 | }; 368 | 369 | struct Field { 370 | public: 371 | int GetFlags() { 372 | return il2cpp_field_get_flags((intptr_t)this); 373 | } 374 | 375 | const char* GetName() { 376 | return il2cpp_field_get_name((intptr_t)this); 377 | } 378 | 379 | int GetOffset() { 380 | return il2cpp_field_get_offset((intptr_t)this); 381 | } 382 | 383 | Class* GetParent() { 384 | return (Class*)il2cpp_field_get_parent((intptr_t)this); 385 | } 386 | 387 | Type* GetType() { 388 | return (Type*)il2cpp_field_get_type((intptr_t)this); 389 | } 390 | 391 | void GetValue(Object* obj, void* value_out) { 392 | il2cpp_field_get_value((intptr_t)obj, (intptr_t)this, value_out); 393 | } 394 | 395 | Object* GetValueObject(Object* obj, void* value_out) { 396 | return (Object*)il2cpp_field_get_value_object((intptr_t)obj, (intptr_t)this); 397 | } 398 | 399 | bool HasAttribute(Class* attrclass) { 400 | return il2cpp_field_has_attribute((intptr_t)this, (intptr_t)attrclass); 401 | } 402 | 403 | void SetValue(Object* obj, void* value) { 404 | il2cpp_field_set_value((intptr_t)obj, (intptr_t)this, value); 405 | } 406 | 407 | void SetValueObject(Object* obj, Object* value) { 408 | il2cpp_field_set_value_object((intptr_t)obj, (intptr_t)this, (intptr_t)value); 409 | } 410 | 411 | void GetStaticValue(void* value) { 412 | il2cpp_field_static_get_value((intptr_t)this, value); 413 | } 414 | 415 | void SetStaticValue(void* value) { 416 | il2cpp_field_static_set_value((intptr_t)this, value); 417 | } 418 | }; 419 | 420 | struct Paramater { 421 | public: 422 | Paramater(int index, Type* type, const char* name) { 423 | this->index = index; 424 | this->type = type; 425 | this->name = name; 426 | } 427 | 428 | int GetIndex() { 429 | return this->index; 430 | } 431 | 432 | const char* GetName() { 433 | return this->name; 434 | } 435 | 436 | Type* GetType() { 437 | return this->type; 438 | } 439 | 440 | private: 441 | Type* type; 442 | int index; 443 | const char* name; 444 | }; 445 | 446 | struct Method { 447 | public: 448 | 449 | template 450 | T Invoke(Object* obj, std::vector params, bool throwOnErr = true) { 451 | 452 | void** paramaters = params.data(); 453 | 454 | intptr_t exception = 0; 455 | T ret = (T)il2cpp_runtime_invoke((intptr_t)this, (intptr_t)obj, paramaters, exception); 456 | 457 | if (throwOnErr && exception) { 458 | Exception* ex = (Exception*)exception; 459 | throw ex; 460 | } 461 | 462 | return ret; 463 | } 464 | 465 | const char* GetName() { 466 | return il2cpp_method_get_name((intptr_t)this); 467 | } 468 | 469 | int GetParamatercount() { 470 | return il2cpp_method_get_param_count((intptr_t)this); 471 | } 472 | 473 | Type* GetReturnType() { 474 | return (Type*)il2cpp_method_get_return_type((intptr_t)this); 475 | } 476 | 477 | Paramater* GetParamater(int index) { 478 | return (Paramater*)il2cpp_method_get_param((intptr_t)this, index); 479 | } 480 | 481 | Class* GetDeclaringType() { 482 | return (Class*)il2cpp_method_get_declaring_type((intptr_t)this); 483 | } 484 | 485 | bool IsGeneric() { 486 | return il2cpp_method_is_generic((intptr_t)this); 487 | } 488 | 489 | bool IsInflated() { 490 | return il2cpp_method_is_inflated((intptr_t)this); 491 | } 492 | 493 | bool IsStatic() { 494 | return !il2cpp_method_is_instance((intptr_t)this); 495 | } 496 | 497 | Class* GetClass() { 498 | return (Class*)il2cpp_method_get_class((intptr_t)this); 499 | } 500 | 501 | bool HasAttribute(Class* attr_class) { 502 | return il2cpp_method_has_attribute((intptr_t)this, (intptr_t)attr_class); 503 | } 504 | 505 | int GetFlags() { 506 | int iflags = 0; 507 | return il2cpp_method_get_flags((intptr_t)this, iflags); 508 | } 509 | 510 | int GetIFlags() { 511 | int iflags = 0; 512 | il2cpp_method_get_flags((intptr_t)this, iflags); 513 | return iflags; 514 | } 515 | 516 | int GetToken() { 517 | return il2cpp_method_get_token((intptr_t)this); 518 | } 519 | 520 | std::vector GetParamaters() { 521 | std::vector paramaters{}; 522 | 523 | int paramCount = this->GetParamatercount(); 524 | for (int i = 0; i < paramCount; i++) { 525 | Type* type = (Type*)il2cpp_method_get_param((intptr_t)this, i); 526 | const char* name = il2cpp_method_get_param_name((intptr_t)this, i); 527 | paramaters.push_back(new Paramater(i, type, name)); 528 | } 529 | 530 | return paramaters; 531 | } 532 | 533 | const char* GenerateSignature() 534 | { 535 | std::string sig = GetReturnType()->GetName(); // int 536 | sig += ' '; 537 | sig += this->GetName(); // int Foo 538 | sig += '('; // int Foo( 539 | 540 | bool firstParamater = true; 541 | for (auto param : this->GetParamaters()) { 542 | if (firstParamater) { 543 | firstParamater = false; 544 | } 545 | else { 546 | sig += ", "; 547 | } 548 | sig += param->GetType()->GetName(); 549 | sig += ' '; 550 | sig += param->GetName(); 551 | } 552 | sig += ");"; 553 | return sig.c_str(); 554 | } 555 | }; 556 | 557 | struct Property { 558 | const char* GetName() { 559 | return il2cpp_property_get_name((intptr_t)this); 560 | } 561 | 562 | Method* GetGetter() { 563 | return (Method*)il2cpp_property_get_get_method((intptr_t)this); 564 | } 565 | 566 | Method* GetSetter() { 567 | return (Method*)il2cpp_property_get_set_method((intptr_t)this); 568 | } 569 | 570 | int GetFlags() { 571 | return il2cpp_property_get_flags((intptr_t)this); 572 | } 573 | 574 | Class* GetParent() { 575 | return (Class*)il2cpp_property_get_parent((intptr_t)this); 576 | } 577 | }; 578 | 579 | //String is WIP 580 | struct String 581 | { 582 | public: 583 | std::string Read() 584 | { 585 | //std::u16string str 586 | std::u16string str{(const char16_t*)il2cpp_string_chars((intptr_t)this)}; 587 | std::wstring_convert, int16_t> convert; 588 | const int16_t* i = reinterpret_cast(str.data()); 589 | return convert.to_bytes(i, i + str.size()); 590 | } 591 | }; 592 | 593 | struct Object { 594 | public: 595 | Class* klass; 596 | void* monitor; 597 | 598 | String* ToString() { 599 | if (this) { 600 | return Domain::GetCorlib() 601 | ->GetClassFromName("System", "Object") 602 | ->GetMethodFromName("ToString", 0) 603 | ->Invoke(this, { }, false); 604 | } 605 | return NULL; 606 | } 607 | 608 | std::string ToString_c() { 609 | String* str = ToString(); 610 | if (str) { 611 | return str->Read(); 612 | } 613 | return "null"; 614 | } 615 | }; 616 | 617 | struct Exception { 618 | const char* ReadMessage() 619 | { 620 | if (this == nullptr) 621 | return NULL; 622 | constexpr int bufferSize = 65536; 623 | char ourMessageBytes[bufferSize]; 624 | il2cpp_format_exception((intptr_t)this, ourMessageBytes, bufferSize); 625 | std::string str(ourMessageBytes); 626 | il2cpp_format_stack_trace((intptr_t)this, ourMessageBytes, bufferSize); 627 | std::string err = str + std::string(ourMessageBytes); 628 | return err.c_str(); 629 | } 630 | }; 631 | 632 | struct Event { 633 | char* name; 634 | Type* eventType; 635 | Class* parent; 636 | Method* add; 637 | Method* remove; 638 | Method* raise; 639 | uint32_t token; 640 | }; -------------------------------------------------------------------------------- /GameAssemblyEx/Il2cpp/il2cpp.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define IL2CPP 3 | 4 | #pragma region FUNCTIONS 5 | #define FUNCTIONS \ 6 | API_FUNC(void, il2cpp_init, (intptr_t domain_name));\ 7 | API_FUNC(void, il2cpp_init_utf16, (intptr_t domain_name));\ 8 | API_FUNC(void, il2cpp_shutdown, ());\ 9 | API_FUNC(void, il2cpp_set_config_dir, (intptr_t config_path));\ 10 | API_FUNC(void, il2cpp_set_data_dir, (intptr_t data_path));\ 11 | API_FUNC(void, il2cpp_set_temp_dir, (intptr_t temp_path));\ 12 | API_FUNC(void, il2cpp_set_commandline_arguments, (int argc, intptr_t argv, intptr_t basedir));\ 13 | API_FUNC(void, il2cpp_set_commandline_arguments_utf16, (int argc, intptr_t argv, intptr_t basedir));\ 14 | API_FUNC(void, il2cpp_set_config_utf16, (intptr_t executablePath));\ 15 | API_FUNC(void, il2cpp_set_config, (intptr_t executablePath));\ 16 | API_FUNC(void, il2cpp_set_memory_callbacks, (intptr_t callbacks));\ 17 | API_FUNC(intptr_t, il2cpp_get_corlib, ());\ 18 | API_FUNC(void, il2cpp_add_internal_call, (intptr_t name, intptr_t method));\ 19 | API_FUNC(intptr_t, il2cpp_resolve_icall, (const char* name));\ 20 | API_FUNC(intptr_t, il2cpp_alloc, (int size));\ 21 | API_FUNC(void, il2cpp_free, (intptr_t ptr));\ 22 | API_FUNC(intptr_t, il2cpp_array_class_get, (intptr_t element_class, int rank));\ 23 | API_FUNC(int, il2cpp_array_length, (intptr_t array));\ 24 | API_FUNC(int, il2cpp_array_get_byte_length, (intptr_t array));\ 25 | API_FUNC(intptr_t, il2cpp_array_new, (intptr_t elementTypeInfo, long length));\ 26 | API_FUNC(intptr_t, il2cpp_array_new_specific, (intptr_t arrayTypeInfo, long length));\ 27 | API_FUNC(intptr_t, il2cpp_array_new_full, (intptr_t array_class, long& lengths, long& lower_bounds));\ 28 | API_FUNC(intptr_t, il2cpp_bounded_array_class_get, (intptr_t element_class, int rank, bool bounded));\ 29 | API_FUNC(int, il2cpp_array_element_size, (intptr_t array_class));\ 30 | API_FUNC(intptr_t, il2cpp_assembly_get_image, (intptr_t assembly));\ 31 | API_FUNC(intptr_t, il2cpp_class_enum_basetype, (intptr_t klass));\ 32 | API_FUNC(bool, il2cpp_class_is_generic, (intptr_t klass));\ 33 | API_FUNC(bool, il2cpp_class_is_inflated, (intptr_t klass));\ 34 | API_FUNC(bool, il2cpp_class_is_assignable_from, (intptr_t klass, intptr_t oklass));\ 35 | API_FUNC(bool, il2cpp_class_is_subclass_of, (intptr_t klass, intptr_t klassc, bool check_interfaces));\ 36 | API_FUNC(bool, il2cpp_class_has_parent, (intptr_t klass, intptr_t klassc));\ 37 | API_FUNC(intptr_t, il2cpp_class_from_il2cpp_type, (intptr_t type));\ 38 | API_FUNC(intptr_t, il2cpp_class_from_name, (intptr_t image, const char* namespaze, const char* name));\ 39 | API_FUNC(intptr_t, il2cpp_class_from_system_type, (intptr_t type));\ 40 | API_FUNC(intptr_t, il2cpp_class_get_element_class, (intptr_t klass));\ 41 | API_FUNC(intptr_t, il2cpp_class_get_events, (intptr_t klass, intptr_t& iter));\ 42 | API_FUNC(intptr_t, il2cpp_class_get_fields, (intptr_t klass, intptr_t& iter));\ 43 | API_FUNC(intptr_t, il2cpp_class_get_nested_types, (intptr_t klass, intptr_t& iter));\ 44 | API_FUNC(intptr_t, il2cpp_class_get_interfaces, (intptr_t klass, intptr_t& iter));\ 45 | API_FUNC(intptr_t, il2cpp_class_get_properties, (intptr_t klass, intptr_t& iter));\ 46 | API_FUNC(intptr_t, il2cpp_class_get_property_from_name, (intptr_t klass, const char* name));\ 47 | API_FUNC(intptr_t, il2cpp_class_get_field_from_name, (intptr_t klass, const char* name));\ 48 | API_FUNC(intptr_t, il2cpp_class_get_methods, (intptr_t klass, intptr_t& iter));\ 49 | API_FUNC(intptr_t, il2cpp_class_get_method_from_name, (intptr_t klass, const char* name, int argsCount));\ 50 | API_FUNC(char*, il2cpp_class_get_name, (intptr_t klass));\ 51 | API_FUNC(char*, il2cpp_class_get_namespace, (intptr_t klass));\ 52 | API_FUNC(intptr_t, il2cpp_class_get_parent, (intptr_t klass));\ 53 | API_FUNC(intptr_t, il2cpp_class_get_declaring_type, (intptr_t klass));\ 54 | API_FUNC(int, il2cpp_class_instance_size, (intptr_t klass));\ 55 | API_FUNC(int, il2cpp_class_num_fields, (intptr_t enumKlass));\ 56 | API_FUNC(bool, il2cpp_class_is_valuetype, (intptr_t klass));\ 57 | API_FUNC(int, il2cpp_class_value_size, (intptr_t klass, int& align));\ 58 | API_FUNC(bool, il2cpp_class_is_blittable, (intptr_t klass));\ 59 | API_FUNC(int, il2cpp_class_get_flags, (intptr_t klass));\ 60 | API_FUNC(bool, il2cpp_class_is_abstract, (intptr_t klass));\ 61 | API_FUNC(bool, il2cpp_class_is_interface, (intptr_t klass));\ 62 | API_FUNC(int, il2cpp_class_array_element_size, (intptr_t klass));\ 63 | API_FUNC(intptr_t, il2cpp_class_from_type, (intptr_t type));\ 64 | API_FUNC(intptr_t, il2cpp_class_get_type, (intptr_t klass));\ 65 | API_FUNC(int, il2cpp_class_get_type_token, (intptr_t klass));\ 66 | API_FUNC(bool, il2cpp_class_has_attribute, (intptr_t klass, intptr_t attr_class));\ 67 | API_FUNC(bool, il2cpp_class_has_references, (intptr_t klass));\ 68 | API_FUNC(bool, il2cpp_class_is_enum, (intptr_t klass));\ 69 | API_FUNC(intptr_t, il2cpp_class_get_image, (intptr_t klass));\ 70 | API_FUNC(char*, il2cpp_class_get_assemblyname, (intptr_t klass));\ 71 | API_FUNC(int, il2cpp_class_get_rank, (intptr_t klass));\ 72 | API_FUNC(int, il2cpp_class_get_bitmap_size, (intptr_t klass));\ 73 | API_FUNC(void, il2cpp_class_get_bitmap, (intptr_t klass, int& bitmap));\ 74 | API_FUNC(intptr_t, il2cpp_get_meta_data_pool_memory, ());\ 75 | API_FUNC(bool, il2cpp_stats_dump_to_file, (intptr_t path));\ 76 | /*API_FUNC(long, il2cpp_stats_get_value, (IL2CPP_Stat stat));\*/ \ 77 | API_FUNC(intptr_t, il2cpp_domain_get, ());\ 78 | API_FUNC(intptr_t, il2cpp_domain_assembly_open, (intptr_t domain, const char* name));\ 79 | API_FUNC(intptr_t*, il2cpp_domain_get_assemblies, (intptr_t domain, int& size));\ 80 | API_FUNC(intptr_t, il2cpp_exception_from_name_msg, (intptr_t image, intptr_t name_space, intptr_t name, intptr_t msg));\ 81 | API_FUNC(intptr_t, il2cpp_get_exception_argument_null, (intptr_t arg));\ 82 | API_FUNC(void, il2cpp_format_exception, (intptr_t ex, void* message, int message_size));\ 83 | API_FUNC(void, il2cpp_format_stack_trace, (intptr_t ex, void* output, int output_size));\ 84 | API_FUNC(void, il2cpp_unhandled_exception, (intptr_t ex));\ 85 | API_FUNC(int, il2cpp_field_get_flags, (intptr_t field));\ 86 | API_FUNC(char*, il2cpp_field_get_name, (intptr_t field));\ 87 | API_FUNC(intptr_t, il2cpp_field_get_parent, (intptr_t field));\ 88 | API_FUNC(int, il2cpp_field_get_offset, (intptr_t field));\ 89 | API_FUNC(intptr_t, il2cpp_field_get_type, (intptr_t field));\ 90 | API_FUNC(void, il2cpp_field_get_value, (intptr_t obj, intptr_t field, void* value));\ 91 | API_FUNC(intptr_t, il2cpp_field_get_value_object, (intptr_t field, intptr_t obj));\ 92 | API_FUNC(bool, il2cpp_field_has_attribute, (intptr_t field, intptr_t attr_class));\ 93 | API_FUNC(void, il2cpp_field_set_value, (intptr_t obj, intptr_t field, void* value));\ 94 | API_FUNC(void, il2cpp_field_static_get_value, (intptr_t field, void* value));\ 95 | API_FUNC(void, il2cpp_field_static_set_value, (intptr_t field, void* value));\ 96 | API_FUNC(void, il2cpp_field_set_value_object, (intptr_t instance, intptr_t field, intptr_t value));\ 97 | API_FUNC(void, il2cpp_gc_collect, (int maxGenerations));\ 98 | API_FUNC(int, il2cpp_gc_collect_a_little, ());\ 99 | API_FUNC(void, il2cpp_gc_disable, ());\ 100 | API_FUNC(void, il2cpp_gc_enable, ());\ 101 | API_FUNC(bool, il2cpp_gc_is_disabled, ());\ 102 | API_FUNC(long, il2cpp_gc_get_used_size, ());\ 103 | API_FUNC(long, il2cpp_gc_get_heap_size, ());\ 104 | API_FUNC(void, il2cpp_gc_wbarrier_set_field, (intptr_t obj, intptr_t& targetAddress, intptr_t gcObj));\ 105 | API_FUNC(int, il2cpp_gchandle_new, (intptr_t obj, bool pinned));\ 106 | API_FUNC(int, il2cpp_gchandle_new_weakref, (intptr_t obj, bool track_resurrection));\ 107 | API_FUNC(intptr_t, il2cpp_gchandle_get_target, (int gchandle));\ 108 | API_FUNC(void, il2cpp_gchandle_free, (int gchandle));\ 109 | API_FUNC(intptr_t, il2cpp_unity_liveness_calculation_begin, (intptr_t filter, int max_object_count, intptr_t callback, intptr_t userdata, intptr_t onWorldStarted, intptr_t onWorldStopped));\ 110 | API_FUNC(void, il2cpp_unity_liveness_calculation_end, (intptr_t state));\ 111 | API_FUNC(void, il2cpp_unity_liveness_calculation_from_root, (intptr_t root, intptr_t state));\ 112 | API_FUNC(void, il2cpp_unity_liveness_calculation_from_statics, (intptr_t state));\ 113 | API_FUNC(intptr_t, il2cpp_method_get_return_type, (intptr_t method));\ 114 | API_FUNC(intptr_t, il2cpp_method_get_declaring_type, (intptr_t method));\ 115 | API_FUNC(char*, il2cpp_method_get_name, (intptr_t method));\ 116 | API_FUNC(intptr_t, il2cpp_method_get_from_reflection, (intptr_t method));\ 117 | API_FUNC(intptr_t, il2cpp_method_get_object, (intptr_t method, intptr_t refclass));\ 118 | API_FUNC(bool, il2cpp_method_is_generic, (intptr_t method));\ 119 | API_FUNC(bool, il2cpp_method_is_inflated, (intptr_t method));\ 120 | API_FUNC(bool, il2cpp_method_is_instance, (intptr_t method));\ 121 | API_FUNC(int, il2cpp_method_get_param_count, (intptr_t method));\ 122 | API_FUNC(intptr_t, il2cpp_method_get_param, (intptr_t method, int index));\ 123 | API_FUNC(intptr_t, il2cpp_method_get_class, (intptr_t method));\ 124 | API_FUNC(bool, il2cpp_method_has_attribute, (intptr_t method, intptr_t attr_class));\ 125 | API_FUNC(int, il2cpp_method_get_flags, (intptr_t method, int& iflags));\ 126 | API_FUNC(int, il2cpp_method_get_token, (intptr_t method));\ 127 | API_FUNC(char*, il2cpp_method_get_param_name, (intptr_t method, int index));\ 128 | API_FUNC(void, il2cpp_profiler_install, (intptr_t prof, intptr_t shutdown_callback));\ 129 | API_FUNC(void, il2cpp_profiler_install_enter_leave, (intptr_t enter, intptr_t fleave));\ 130 | API_FUNC(void, il2cpp_profiler_install_allocation, (intptr_t callback));\ 131 | API_FUNC(void, il2cpp_profiler_install_gc, (intptr_t callback, intptr_t heap_resize_callback));\ 132 | API_FUNC(void, il2cpp_profiler_install_fileio, (intptr_t callback));\ 133 | API_FUNC(void, il2cpp_profiler_install_thread, (intptr_t start, intptr_t end));\ 134 | API_FUNC(int, il2cpp_property_get_flags, (intptr_t prop));\ 135 | API_FUNC(intptr_t, il2cpp_property_get_get_method, (intptr_t prop));\ 136 | API_FUNC(intptr_t, il2cpp_property_get_set_method, (intptr_t prop));\ 137 | API_FUNC(char*, il2cpp_property_get_name, (intptr_t prop));\ 138 | API_FUNC(intptr_t, il2cpp_property_get_parent, (intptr_t prop));\ 139 | API_FUNC(intptr_t, il2cpp_object_get_class, (intptr_t obj));\ 140 | API_FUNC(int, il2cpp_object_get_size, (intptr_t obj));\ 141 | API_FUNC(intptr_t, il2cpp_object_get_virtual_method, (intptr_t obj, intptr_t method));\ 142 | API_FUNC(intptr_t, il2cpp_object_new, (intptr_t klass));\ 143 | API_FUNC(intptr_t, il2cpp_object_unbox, (intptr_t obj));\ 144 | API_FUNC(intptr_t, il2cpp_value_box, (intptr_t klass, intptr_t data));\ 145 | API_FUNC(void, il2cpp_monitor_enter, (intptr_t obj));\ 146 | API_FUNC(bool, il2cpp_monitor_try_enter, (intptr_t obj, int timeout));\ 147 | API_FUNC(void, il2cpp_monitor_exit, (intptr_t obj));\ 148 | API_FUNC(void, il2cpp_monitor_pulse, (intptr_t obj));\ 149 | API_FUNC(void, il2cpp_monitor_pulse_all, (intptr_t obj));\ 150 | API_FUNC(void, il2cpp_monitor_wait, (intptr_t obj));\ 151 | API_FUNC(bool, il2cpp_monitor_try_wait, (intptr_t obj, int timeout));\ 152 | API_FUNC(intptr_t, il2cpp_runtime_invoke, (intptr_t method, intptr_t obj, void** param, intptr_t& exc));\ 153 | API_FUNC(intptr_t, il2cpp_runtime_invoke_convert_args, (intptr_t method, intptr_t obj, void** param, int paramCount, intptr_t& exc));\ 154 | API_FUNC(void, il2cpp_runtime_class_init, (intptr_t klass));\ 155 | API_FUNC(void, il2cpp_runtime_object_init, (intptr_t obj));\ 156 | API_FUNC(void, il2cpp_runtime_object_init_exception, (intptr_t obj, intptr_t& exc));\ 157 | API_FUNC(int, il2cpp_string_length, (intptr_t str));\ 158 | API_FUNC(char*, il2cpp_string_chars, (intptr_t str));\ 159 | API_FUNC(intptr_t, il2cpp_string_new, (const char* str));\ 160 | API_FUNC(intptr_t, il2cpp_string_new_len, (const char* str, int length));\ 161 | API_FUNC(intptr_t, il2cpp_string_new_utf16, (const char* text, int len));\ 162 | API_FUNC(intptr_t, il2cpp_string_new_wrapper, (char* str));\ 163 | API_FUNC(intptr_t, il2cpp_string_intern, (const char* str));\ 164 | API_FUNC(intptr_t, il2cpp_string_is_interned, (const char* str));\ 165 | API_FUNC(intptr_t, il2cpp_thread_current, ());\ 166 | API_FUNC(intptr_t, il2cpp_thread_attach, (intptr_t domain));\ 167 | API_FUNC(void, il2cpp_thread_detach, (intptr_t thread));\ 168 | API_FUNC(void**, il2cpp_thread_get_all_attached_threads, (int& size));\ 169 | API_FUNC(bool, il2cpp_is_vm_thread, (intptr_t thread));\ 170 | API_FUNC(void, il2cpp_current_thread_walk_frame_stack, (intptr_t func, intptr_t user_data));\ 171 | API_FUNC(void, il2cpp_thread_walk_frame_stack, (intptr_t thread, intptr_t func, intptr_t user_data));\ 172 | API_FUNC(bool, il2cpp_current_thread_get_top_frame, (intptr_t frame));\ 173 | API_FUNC(bool, il2cpp_thread_get_top_frame, (intptr_t thread, intptr_t frame));\ 174 | API_FUNC(bool, il2cpp_current_thread_get_frame_at, (int offset, intptr_t frame));\ 175 | API_FUNC(bool, il2cpp_thread_get_frame_at, (intptr_t thread, int offset, intptr_t frame));\ 176 | API_FUNC(int, il2cpp_current_thread_get_stack_depth, ());\ 177 | API_FUNC(int, il2cpp_thread_get_stack_depth, (intptr_t thread));\ 178 | API_FUNC(intptr_t, il2cpp_type_get_object, (intptr_t type));\ 179 | API_FUNC(int, il2cpp_type_get_type, (intptr_t type));\ 180 | API_FUNC(intptr_t, il2cpp_type_get_class_or_element_class, (intptr_t type));\ 181 | API_FUNC(char*, il2cpp_type_get_name, (intptr_t type));\ 182 | API_FUNC(bool, il2cpp_type_is_byref, (intptr_t type));\ 183 | API_FUNC(int, il2cpp_type_get_attrs, (intptr_t type));\ 184 | API_FUNC(bool, il2cpp_type_equals, (intptr_t type, intptr_t otherType));\ 185 | API_FUNC(char*, il2cpp_type_get_assembly_qualified_name, (intptr_t type));\ 186 | API_FUNC(intptr_t, il2cpp_image_get_assembly, (intptr_t image));\ 187 | API_FUNC(char*, il2cpp_image_get_name, (intptr_t image));\ 188 | API_FUNC(char*, il2cpp_image_get_filename, (intptr_t image));\ 189 | API_FUNC(intptr_t, il2cpp_image_get_entry_point, (intptr_t image));\ 190 | API_FUNC(int, il2cpp_image_get_class_count, (intptr_t image));\ 191 | API_FUNC(intptr_t, il2cpp_image_get_class, (intptr_t image, int index));\ 192 | API_FUNC(intptr_t, il2cpp_capture_memory_snapshot, ());\ 193 | API_FUNC(void, il2cpp_free_captured_memory_snapshot, (intptr_t snapshot));\ 194 | API_FUNC(void, il2cpp_set_find_plugin_callback, (intptr_t method));\ 195 | API_FUNC(void, il2cpp_register_log_callback, (intptr_t method));\ 196 | API_FUNC(void, il2cpp_debugger_set_agent_options, (intptr_t options));\ 197 | API_FUNC(bool, il2cpp_is_debugger_attached, ());\ 198 | API_FUNC(void, il2cpp_unity_install_unitytls_interface, (void* unitytlsInterfaceStruct));\ 199 | API_FUNC(intptr_t, il2cpp_custom_attrs_from_class, (intptr_t klass));\ 200 | API_FUNC(intptr_t, il2cpp_custom_attrs_from_method, (intptr_t method));\ 201 | API_FUNC(intptr_t, il2cpp_custom_attrs_get_attr, (intptr_t ainfo, intptr_t attr_klass));\ 202 | API_FUNC(bool, il2cpp_custom_attrs_has_attr, (intptr_t ainfo, intptr_t attr_klass));\ 203 | API_FUNC(intptr_t, il2cpp_custom_attrs_construct, (intptr_t cinfo));\ 204 | API_FUNC(void, il2cpp_custom_attrs_free, (intptr_t ainfo)); 205 | #pragma endregion 206 | 207 | #define API_FUNC(rt, n, p) rt (*n) p 208 | FUNCTIONS 209 | #undef API_FUNC 210 | 211 | void il2cpp_header_AllocConsole() 212 | { 213 | AllocConsole(); 214 | freopen_s((FILE**)stdin, "CONIN$", "r", stdin); 215 | freopen_s((FILE**)stdout, "CONOUT$", "w", stdout); 216 | freopen_s((FILE**)stderr, "CONOUT$", "w", stderr); 217 | }; 218 | bool il2cpp_header_isInit = false; 219 | void il2cpp_header_init() 220 | { 221 | if (il2cpp_header_isInit) { return; } 222 | il2cpp_header_isInit = true; 223 | HMODULE GameAssembly = LoadLibraryA("GameAssembly.dll"); 224 | if (!GameAssembly) 225 | return; 226 | #define API_FUNC(r, n, p) n = (r (*) p)(GetProcAddress(GameAssembly, #n)) 227 | FUNCTIONS 228 | #undef API_FUNC 229 | }; 230 | #undef FUNCTIONS -------------------------------------------------------------------------------- /GameAssemblyEx/dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include "Il2cpp/Il2cppInclude.h" 2 | 3 | void Main() { 4 | il2cpp_header_init(); 5 | il2cpp_header_AllocConsole(); 6 | 7 | auto domain = Domain::get_main(); 8 | auto _thread = Thread::Attach(domain); 9 | try 10 | { 11 | for (Assembly* assembly : domain->GetAssemblies()) { 12 | std::cout << assembly->GetImage()->GetFilename() << '\n'; 13 | } 14 | } 15 | catch(Exception* ex) 16 | { 17 | std::cout << "ERROR: " << ex->ReadMessage() << '\n'; 18 | } 19 | _thread->Detatch(); 20 | return; 21 | } 22 | 23 | 24 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 25 | { 26 | if (ul_reason_for_call == DLL_PROCESS_ATTACH) { 27 | CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Main, 0, 0, 0); 28 | } 29 | return TRUE; 30 | } 31 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Glatrix 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GameAssemblyEx 2 | A C++ Library aimed at making mod development with Il2cpp compiled Unity Engine games easier 3 | 4 |

Features:

5 | 6 | - Il2cpp Domain Functions 7 | - Il2cpp Assembly Functions 8 | - Il2cpp Image Functions 9 | - Il2cpp Class Functions 10 | - Il2cpp Field Functions 11 | - Il2cpp Property Functions 12 | - Il2cpp Method Functions (including invokers) 13 | - Il2cpp Object Functions (Only some for now, plan to add more soon) 14 | 15 |

Coming Soon (hopfully):

16 | 17 | - Exception Throwing, Handling, and Formatting (with stack data) 18 | - Type Injection via MonoBehaviour hooking 19 | - Add more functions and Il2cpp Types. (String, Object, ValueTypes, Collections, etc) 20 | - Cleaner Code 21 | --------------------------------------------------------------------------------