0

我想做的是制作一个游戏和一个更新游戏的启动器。

此启动器将更新游戏而不覆盖游戏的 .exe 文件。

我认为这可以通过使用 dll 来实现,但我不知道在哪里学习这个......

这可能吗?

4

2 回答 2

1

在我看来,您希望在不修改可执行文件(无论是游戏还是其他程序)的情况下修改正在运行的进程的内存。

您可以使用属于 kernel32.dll 库的 ReadProcessMemory 和 WriteProcessMemory API 调用来读取和写入正在运行的进程的内存。您还需要使用 OpenProcess 创建进程的有效句柄,然后才能读取和写入其内存。

根据您使用的语言,访问它们非常简单。在 C# 中,您需要使用以下语法声明一个 Dll 导入:

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, ref byte[] buffer, int size, ref int lpNumberOfBytesRead);

[DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(IntPtr hProcess, int lpBaseAddress, ref byte[] buffer, int size, ref int lpNumberOfBytesWritten);

然后,您使用 OpenProcess 获取进程的句柄,并使用 ReadProcessMemory 和 WriteProcessMemory 适当地读取和写入内存。

您可以使用 OLLYDBG 之类的调试工具来帮助您找出要编辑的内存位置。另一个很棒的工具是 ArtMoney,它允许您监控和跟踪运行过程中的值,以识别存储游戏信息的位置,例如金钱、健康等。

如果您需要进一步的帮助,添加一些关于您正在做什么的附加信息可能会很有用。

于 2013-03-14T13:45:05.997 回答
0

有许多资源可用于学习如何制作 dll 项目。

从微软教程开始 - http://msdn.microsoft.com/en-us/library/ms235636(v=vs.100).aspx

从一开始就仔细考虑游戏的设计。为了使它更易于管理和更容易更新,您可能希望将您的游戏分成核心部分,即物理、渲染等,并将它们作为 dll。

如果以后升级渲染器,您只需要交换 dll,或者如您所说,拥有一个覆盖客户端计算机上的渲染器 dll 的启动器。

使用 dll 的一些缺点是您现在需要为游戏提供更多文件,并且最终用户可能会发现为了他们自己的修改目的而包装您的 dll 更容易(尽管也许您发现使游戏可修改是一个加号?)。

于 2013-03-14T12:56:35.833 回答