我有代码从内存中读取一个值,当内存地址指向一个静态的4字节值时,它正在工作,但我正在尝试访问一个位于动态位置的4字节值,因此需要搜索首先指针然后再次搜索以获得4字节值。
下面是我应该返回指针地址的代码,但它只输出0 ...
bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50)
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW);
output = BitConverter.ToInt32(buffer, 0);
txtOutput.Text = output.ToString();
伪代码我看作是:
bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50)
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW);
output = BitConverter.ToInt32(buffer, 0);
bAddr = (IntPtr)output; // Should now contain the address 0x00267A50
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW);
output = BitConverter.ToInt32(buffer, 0);
txtOutput.Text = output.ToString();
任何人都可以了解我需要做些什么来查找地址然后搜索该地址才能找到值吗?
答案 0 :(得分:4)
使用pinvoke执行Win32函数时,这是一个非常经典的错误,您没有进行任何错误检查。所以任何失败都是无法确定的。首先确保你正确地宣布它:
[DllImport("user32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
[In, Out] byte[] buffer, IntPtr size, out IntPtr lpNumberOfBytesRead);
然后执行它:
bool ok = ReadProcessMemory(...);
if (!ok) throw new System.ComponentModel.Win32Exception();
现在你会知道为什么它不起作用。在您至少以这种方式进行测试之前,我们无法帮助您弄清楚出了什么问题。最基本的问题当然是猜错地址。由于没有足够的权限,ReadProcessMemory是一个具有高权限的功能,原因显而易见。