【发布时间】:2021-01-10 23:47:48
【问题描述】:
我想找到其他程序 (other.exe) 存储某些特定值的地址
然后从我的程序 (C#) 中读取它,但我真的不明白如何实现它
我尝试使用 CheatEngine 找到它,并设法在两个地址下找到该值,例如 0x048907B0
现在我尝试将这个特定地址添加到进程的基地址中,但返回的值只是混乱,甚至没有接近我的值
我在这里做错了什么?
以前我见过一些涉及“xor”的“证明”方法,基本上你必须读取一些具有已知“xor 地址”的“xor”值,然后为了读取其他值,公式是
info.MyValue = BitConverter.ToInt32(buffer, 0) ^ xor;
提前致谢!
我的代码:
var process = Process.GetProcessesByName(processName).FirstOrDefault();
if (process == null)
{
throw new Exception($"Process with name: '{processName}' is not running");
}
var mc = new MemoryContext(process);
public class MemoryContext
{
const int PROCESS_WM_READ = 0x0010;
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
private int baseAddress;
private Process _process;
private IntPtr handle;
public MemoryContext(Process process)
{
_process = process;
baseAddress = _process.MainModule.BaseAddress.ToInt32();
handle = OpenProcess(PROCESS_WM_READ, false, _process.Id);
}
public ProcessDetails RefreshData()
{
var info = new ProcessDetails();
int bytesRead = 0;
byte[] buffer = new byte[4];
// here I'm trying to read that value
ReadProcessMemory((int)handle, 0x048907B0 + baseAddress, buffer, buffer.Length, ref bytesRead);
info.MyValue = BitConverter.ToInt32(buffer, 0);
return info;
}
}
【问题讨论】:
-
该值不应该被添加到基地址;否则它会起作用吗?至于每次查找地址,如果您遵循 Cheat Engine 的教程,它应该向您展示如何找到指向某些动态分配的数据地址的可靠指针链。然后,您只需在程序中执行指针逻辑即可获取最终地址。
-
@RandomDavis 我设法在 CE 中找到它,但你所说的“指针逻辑”到底是什么意思?
-
哦,我删除了
+ baseAddress,我得到了价值,谢谢! -
“指针逻辑”是指从作为指针的静态地址开始的整个业务,然后遵循一些指针链和偏移量以最终到达最终地址。如果这对您来说是全新的,那么一定要完成教程和更多关于指针的研究。这样您就不必每次都运行作弊引擎来获取地址。
标签: c# memory reverse-engineering