我知道任何正在运行的应用程序(无论它是用 C#、C、C++、Java 等构建的)都会在内存中公开元素。我很好奇如何控制它在内存中暴露的内容和方式?
我很好奇,因为我知道许多游戏会被用户查看或修改游戏内存中的内容并更改它们。我只是想了解有关其工作原理的更多详细信息。我知道必须使用特殊程序才能深入到内存中,并且必须进行转换和其他操作才能使其具有可读性。
让我们举一个非常简单的例子,我会问一些关于它的问题。
using System.Security;
static class Program2
{
private static SecureString fSecureString;
public static string fPublicString = "Test123";
private static string fPrivateString = "321tesT";
static void Main2()
{
}
}
class TestClass
{
private string fInstancedPrivateString;
public TestClass()
{
fInstancedPrivateString = "InstancedSet";
}
private string DoSomething()
{
return fInstancedPrivateString.ToLower();
}
}
}
鉴于上面的代码,我想 fPublicString 很明显。阅读记忆的人可以看到哪些元素?他们可以读取变量名还是只看到内存地址和分配的值(Test123)。实例类中的 DoSomething 之类的函数呢?有人可以在内存中看到它并编写恶意代码以随意执行它吗?
我只是好奇在编写应用程序(或游戏)时我需要记住多少。我了解访问器属性(公共/私有/等)的一般概念以及它们与其他具有可见性的代码的关系,但我很好奇它们是否与它在内存中的表示方式有任何关系。
我的最后一个问题将非常具体:EverQuest(游戏)有一个名为 MacroQuest 的 hack,据我了解,它通过具有适当的偏移量来读取内存,然后可以从 EQ 客户端执行代码,或者只是为客户端更改存储在内存中的值。情商怎么弄错了?他们的编程很糟糕吗?一种现在已经解决的技术限制?或者,这在技术上可以用几乎每一个用适量知识编写的软件来完成吗?
总的来说,我想我可能会使用一个很好的教程、文章或书籍,其中提供了一些关于代码在内存中的外观等细节。