Skip to content

issuimo/UnityResolve.hpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

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

如果是MSVC编译器请打开SHE选项
If using the MSVC compiler, please open the Secure Heap Exceptions (SHE) option.
对于高版本安卓程序崩溃的可能问题请参阅 link
For potential issues related to crashes in higher version Android programs, please refer to the link link


简要概述 (Brief overview)


UnityResolve.hpp

支持的平台 (Supported platforms)

  • Windows
  • Android
  • Linux

类型 (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
  • More...

功能 (Function)

  • 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...

功能使用 (How to use)


更改平台 (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();

获取函数地址(变量偏移) 及调用(修改/获取) (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...);

const auto ptr = method2->Cast<void, int, bool>();
// Cast<return type, args...>(void);
ptr(114514, true);

转存储到文件 (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)