Awesome
[!NOTE]
有新的功能建议或者Bug可以提交Issues (当然你也可以尝试自己修改代码后提交到该仓库
New feature suggestions or bugs can be commit as issues. Of course, you can also try modifying the code yourself and then commit it to the repository.Dome
<hr> <h3 align="center">简要概述 (Brief overview)</h3> <hr>如果编译器支持请打开SEH选项
If your compiler supports it, please enable SEH option.
对于高版本安卓程序崩溃的可能问题请参阅 link
For potential issues related to crashes in higher version Android programs, please refer to the link link
UnityResolve.hpp
<hr> <h3 align="center">功能使用 (How to use)</h3> <hr>支持的平台 (Supported platforms)
- Windows
- Android
- Linux
- IOS
- HarmonyOS
类型 (Type)
- Camera
- Transform
- Component
- Object (Unity)
- LayerMask
- Rigidbody
- MonoBehaviour
- Renderer
- Mesh
- Behaviour
- Physics
- GameObject
- Collider
- Vector4
- Vector3
- Vector2
- Quaternion
- Bounds
- Plane
- Ray
- Rect
- Color
- Matrix4x4
- Array
- String
- Object (C#)
- Type (C#)
- List
- Dictionary
- Animator
- CapsuleCollider
- BoxCollider
- Time
- FieldInfo
- More...
功能 (Function)
- Mono注入 (Mono Inject)
- DumpToFile
- 附加线程 (Thread Attach / Detach)
- 修改静态变量值 (Modifying the value of a static variable)
- 获取对象 (Obtaining an instance)
- 创建C#字符串 (Create C# String)
- 创建C#数组 (Create C# Array)
- 创建C#对象 (Create C# instance)
- 世界坐标转屏幕坐标/屏幕坐标转世界坐标 (WorldToScreenPoint/ScreenToWorldPoint)
- 获取继承子类的名称 (Get the name of the inherited subclass)
- 获取函数地址(变量偏移) 及调用(修改/获取) (Get the function address (variable offset) and invoke (modify/get))
- 获取Gameobject组件 (Get GameObject component)
- More...
使用GLM (use glm)
#define USE_GLM #include "UnityResolve.hpp"
更改平台 (Change platform)
#define WINDOWS_MODE 1 // 如果需要请改为 1 | 1 if you need #define ANDROID_MODE 0 #define LINUX_MODE 0
初始化 (Initialization)
UnityResolve::Init(GetModuleHandle(L"GameAssembly.dll | mono.dll"), UnityResolve::Mode::Mono); // Linux or Android UnityResolve::Init(dlopen(L"GameAssembly.so | mono.so", RTLD_NOW), UnityResolve::Mode::Mono);
参数1: dll句柄
Parameter 1: DLL handle
参数2: 使用模式
Parameter 2: Usage mode
- Mode::Il2cpp
- Mode::Mono
附加线程 (Thread Attach / Detach)
// C# GC Attach UnityResolve::ThreadAttach(); // C# GC Detach UnityResolve::ThreadDetach();
Mono注入 (Mono Inject)
UnityResolve::AssemblyLoad assembly("./MonoCsharp.dll"); UnityResolve::AssemblyLoad assembly("./MonoCsharp.dll", "MonoCsharp", "Inject", "MonoCsharp.Inject:Load()");
获取函数地址(变量偏移) 及调用(修改/获取) (Get the function address (variable offset) and invoke (modify/get))
const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll"); const auto pClass = assembly->Get("className | 类名称"); // assembly->Get("className | 类名称", "*"); // assembly->Get("className | 类名称", "namespace | 空间命名"); const auto field = pClass->Get<UnityResolve::Field>("Field Name | 变量名"); const auto fieldOffset = pClass->Get<std::int32_t>("Field Name | 变量名"); const int time = pClass->GetValue<int>(obj Instance | 对象地址, "time"); // pClass->GetValue(obj Instance*, name); = pClass->SetValue<int>(obj Instance | 对象地址, "time", 114514); // pClass->SetValue(obj Instance*, name, value); const auto method = pClass->Get<UnityResolve::Method>("Method Name | 函数名"); // pClass->Get<UnityResolve::Method>("Method Name | 函数名", { "System.String" }); // pClass->Get<UnityResolve::Method>("Method Name | 函数名", { "*", "System.String" }); // pClass->Get<UnityResolve::Method>("Method Name | 函数名", { "*", "", "System.String" }); // pClass->Get<UnityResolve::Method>("Method Name | 函数名", { "*", "System.Int32", "System.String" }); // pClass->Get<UnityResolve::Method>("Method Name | 函数名", { "*", "System.Int32", "System.String", "*" }); // "*" == "" const auto functionPtr = method->function; const auto method1 = pClass->Get<UnityResolve::Method>("method name1 | 函数名称1"); const auto method2 = pClass->Get<UnityResolve::Method>("method name2 | 函数名称2"); method1->Invoke<int>(114, 514, "114514"); // Invoke<return type>(args...); // Cast<return type, args...>(void); // Cast(UnityResolve::MethodPointer<return type, args...>&); const UnityResolve::MethodPointer<void, int, bool> ptr = method2->Cast<void, int, bool>(); ptr(114514, true); UnityResolve::MethodPointer<void, int, bool> add; ptr = method1->Cast(add); std::function<void(int, bool)> add2; method->Cast(add2); UnityResolve::Field::Variable<Vector3, Player> syncPos; syncPos.Init(pClass->Get<UnityResolve::Field>("syncPos")); auto pos = syncPos[playerInstance]; auto pos = syncPos.Get(playerInstance);
转存储到文件 (DumpToFile)
UnityResolve::DumpToFile("./output/");
创建C#字符串 (Create C# String)
const auto str = UnityResolve::UnityType::String::New("string | 字符串"); std::string cppStr = str.ToString();
创建C#数组 (Create C# Array)
const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll"); const auto pClass = assembly->Get("className | 类名称"); const auto array = UnityResolve::UnityType::Array<T>::New(pClass, size); std::vector<T> cppVector = array.ToVector();
创建C#对象 (Create C# instance)
const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll"); const auto pClass = assembly->Get("className | 类名称"); const auto pGame = pClass->New<Game*>();
获取对象 (Obtaining an instance)
const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll"); const auto pClass = assembly->Get("className | 类名称"); std::vector<Player*> playerVector = pClass->FindObjectsByType<Player*>(); // FindObjectsByType<return type>(void); playerVector.size();
世界坐标转屏幕坐标/屏幕坐标转世界坐标 (WorldToScreenPoint/ScreenToWorldPoint)
Camera* pCamera = UnityResolve::UnityType::Camera::GetMain(); Vector3 point = pCamera->WorldToScreenPoint(Vector3, Eye::Left); Vector3 world = pCamera->ScreenToWorldPoint(point, Eye::Left);
获取继承子类的名称 (Get the name of the inherited subclass)
const auto assembly = UnityResolve::Get("UnityEngine.CoreModule.dll"); const auto pClass = assembly->Get("MonoBehaviour"); Parent* pParent = pClass->FindObjectsByType<Parent*>()[0]; std::string child = pParent->GetType()->GetFullName();
获取Gameobject组件 (Get GameObject component)
std::vector<T*> objs = gameobj->GetComponents<T*>(UnityResolve::Get("assembly.dll")->Get("class"))); // gameobj->GetComponents<return type>(Class* component) std::vector<T*> objs = gameobj->GetComponentsInChildren<T*>(UnityResolve::Get("assembly.dll")->Get("class"))); // gameobj->GetComponentsInChildren<return type>(Class* component) std::vector<T*> objs = gameobj->GetComponentsInParent<T*>(UnityResolve::Get("assembly.dll")->Get("class"))); // gameobj->GetComponentsInParent<return type>(Class* component)