对不起,如果这不是这个问题的正确论坛,但我真的找不到更好的地方(我前段时间试过ask on reddit但没有成功)所以我走了。
我正在建立一个游戏伴侣应用程序,旨在向玩家提供有关游戏当前状态的一些信息。只有通过阅读游戏的记忆才能访问此信息(顺便说一下,它符合游戏的ToS)。
游戏已在Unity中构建,我的应用程序在C#中。我正在努力寻找任何有关如何实现这一目标的良好文档/切入点 我得到的唯一指针是关于CheatEngine,但与直接访问Mono的结构相比,这看起来非常脆弱。
编辑:我已经开始构建GitHub回购以记录我的进度:https://github.com/sebastientromp/unity-memory-reading-step-by-step。
它仍然是一项正在进行的工作,所以请不要犹豫,发表评论或提供一些帮助:)
如my main class所示,这就是我今天的地方(删除了评论):
static void Main()
{
Process process = Process.GetProcessesByName("Hearthstone").FirstOrDefault();
Console.WriteLine("Hearthstone process: " + process);
IntPtr processHandle = process.Handle;
Console.WriteLine("Process Handle: " + processHandle);
ProcessModule monoModule = process.Modules
.OfType<ProcessModule>()
.FirstOrDefault(module => module.ModuleName == "mono.dll");
long monoModuleBaseAddress = monoModule.BaseAddress.ToInt64();
Console.WriteLine("monoModuleBaseAddress: " + monoModuleBaseAddress);
byte[] monoModuleContent = new byte[monoModule.ModuleMemorySize];
Console.WriteLine("monoModuleContent: " + monoModuleContent);
ReadBytes(processHandle, monoModuleBaseAddress, monoModuleContent);
int imageDosHeaderElfanew = BitConverter.ToInt32(monoModuleContent, (int)Offsets.ImageDosHeader_e_lfanew);
Console.WriteLine("imageDosHeaderElfanew: " + imageDosHeaderElfanew);
int exportDirectoryAddress = BitConverter.ToInt32(
monoModuleContent,
imageDosHeaderElfanew + (int)Offsets.ImageNTHeaders_ExportDirectoryAddress);
Console.WriteLine("exportDirectoryAddress: " + exportDirectoryAddress);
var functionAddressMap = MapAllExportFunctions(monoModuleBaseAddress, monoModuleContent, exportDirectoryAddress);
long monoRootDomainFunctionAddress;
functionAddressMap.TryGetValue("mono_get_root_domain", out monoRootDomainFunctionAddress);
Console.WriteLine("Mono rot domain address: " + monoRootDomainFunctionAddress);
var functionContent = new byte[4];
ReadBytes(processHandle, monoRootDomainFunctionAddress, functionContent);
Console.WriteLine("[{0}]", string.Join(", ", functionContent));
var rootDomainPointer = BitConverter.ToInt32(functionContent, 0);
Console.WriteLine("rootDomainPointer: " + rootDomainPointer);
ReadBytes(processHandle, rootDomainPointer, functionContent);
Console.WriteLine("[{0}]", string.Join(", ", functionContent)); // This gives me [0,0,0,0] -> error!
}
最后一行清楚地表明某处有错误,所以我想它必须是我从地址读取函数的方式。
你知道我应该做什么吗?