From c7ca81827da238239371f4fc1743aa976fa190d8 Mon Sep 17 00:00:00 2001 From: gggaa2152 <60614405+gggaa2152@users.noreply.github.com> Date: Mon, 6 Apr 2026 06:10:57 +0800 Subject: [PATCH] Create memory_utils.h --- memory_utils.h | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 memory_utils.h diff --git a/memory_utils.h b/memory_utils.h new file mode 100644 index 000000000..a5cffd598 --- /dev/null +++ b/memory_utils.h @@ -0,0 +1,57 @@ +#ifndef MEMORY_UTILS_H +#define MEMORY_UTILS_H + +#include +#include +#include +#include +#include + +// --- 安全读取内存逻辑 (学习自“那份代码”) --- +// 使用 process_vm_readv 或者 pipe 探测法来防止非法地址读取导致的闪退 + +template +T Read(uintptr_t address) { + T data{}; + if (address < 0x1000000 || address > 0x7FFFFFFFFFFF) { + return data; // 过滤明显的非法指针 + } + + struct iovec local[1]; + struct iovec remote[1]; + + local[0].iov_base = &data; + local[0].iov_len = sizeof(T); + remote[0].iov_base = (void*)address; + remote[0].iov_len = sizeof(T); + + // 在内部注入时,如果 process_vm_readv 不可用,可以尝试使用安全拷贝 + // 这里的实现保证了如果地址无效,程序不会直接崩溃 + ssize_t nread = process_vm_readv(getpid(), local, 1, remote, 1, 0); + + if (nread < 0) { + // 如果系统不支持 vm_readv,回退到基本内存校验(可选实现) + return data; + } + + return data; +} + +// 专门用于读取 Il2cpp 字符串或游戏名称的工具 +inline char* ReadString(uintptr_t address, size_t size) { + static char buffer[256]; + memset(buffer, 0, sizeof(buffer)); + + struct iovec local[1]; + struct iovec remote[1]; + + local[0].iov_base = buffer; + local[0].iov_len = (size > 255) ? 255 : size; + remote[0].iov_base = (void*)address; + remote[0].iov_len = local[0].iov_len; + + process_vm_readv(getpid(), local, 1, remote, 1, 0); + return buffer; +} + +#endif // MEMORY_UTILS_H