我试图愚弄Windows的扫雷,得到多少炸弹等等。
了解并工作:
public static byte[] ReadBytes(IntPtr memoryAddress, uint bytesToRead, out int bytesReaded)
{
byte[] buffer = new byte[bytesToRead];
IntPtr ptrBytesReaded;
ReadProcessMemory(process, memoryAddress, buffer, bytesToRead, out ptrBytesReaded);
bytesReaded = ptrBytesReaded.ToInt32();
return buffer;
}
但我需要一些帮助,如何读取int和字符串?猜猜我将int的大小传递给函数?怎么样的字符串?
谢谢:) }
答案 0 :(得分:3)
我想你已经阅读了Code Project article如何从Arik Poznanski修补扫雷。您的代码是从该文章中复制的。
那里显示如何读取int。如果您知道字符串的地址,则可以使用字符串构造函数,当您使用不安全的代码时,该构造函数将void *作为参数。这是最简单的方法。
但是你应该先阅读文章completeley,然后再提出已经通过真正好的写作回答的问题。
答案 1 :(得分:0)
要获得int,您必须读取4个字节,然后使用BitConverter.ToInt32 Method。
对于string
来说,它更复杂,你必须逐个读取字节,直到你遇到代码为0
的字节。
答案 2 :(得分:0)
根据其他人的见解,您可以阅读已复制代码的4.8星级CodeProject文章。但是:
这里的问题是你正在读完全原始内存。您不知道特定位置的内存是int还是字符串。 BytesToRead
参数是一个暗示,您必须知道(先验)您尝试读取的特定内存地址所期望的数据类型。
您最好的选择可能是大块数据的反复试验。字符串很容易识别,但隔离整数可能非常困难。你可能不得不尝试很多游戏,你的应用程序会调整游戏以查看更改。祝好运!您可能需要创建某种查看器like this, as an example。您实际上可以使用此实用程序帮助您在某些内存上立足以阅读。
请注意,CodeProject代码包含作者必须以某种方式发现的硬编码的内存地址值...