我正在为游戏中的esp hack创建一个directx叠加层。 (我用C ++制作了几个但是想尝试c#)这个方法要求我使用一个只与.net framework 3.5或更早版本兼容的directx版本。我一直在使用此代码来获取特定模块的基址:
static int GetModuleAddress(string moduleName)
{
try
{
Process[] p = Process.GetProcessesByName(game.process);
if (p.Length > 0)
{
foreach (ProcessModule m in p[0].Modules)
{
if (m.ModuleName == moduleName)
{
//temp = (int)m.BaseAddress;
//return temp;
return (int)m.BaseAddress;
}
}
return -1;
}
else
{
return -1;
}
}
catch (Exception ex)
{
return -1;
}
}
这个代码在框架4.5.2中工作正常(它循环通过近100个不同的模块,并返回我正在寻找的任何模块的基址)。但是当使用3.5中的代码时,它只循环通过大约5个模块(其中没有一个是我需要的)并返回-1。
为什么会这样?有没有其他方法可以获得模块的基地址?
答案 0 :(得分:0)
之所以只看到5个模块,是因为您使用的是x86程序来解析x64进程的模块。如果要编写与外部进程的内存交互的程序,则应始终针对目标进程的体系结构对其进行编译。这将为您节省很多头痛。
对地址和偏移量使用IntPtr并编译x86和x64版本,然后对每种类型的目标进程使用正确的版本,这将确保最少的问题。
此外,请确保您始终以管理员身份运行。