在C#.NET 3.5中获取模块地址?

时间:2016-10-19 04:50:29

标签: c# .net .net-3.5

我正在为游戏中的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。

为什么会这样?有没有其他方法可以获得模块的基地址?

1 个答案:

答案 0 :(得分:0)

之所以只看到5个模块,是因为您使用的是x86程序来解析x64进程的模块。如果要编写与外部进程的内存交互的程序,则应始终针对目标进程的体系结构对其进行编译。这将为您节省很多头痛。

对地址和偏移量使用IntPtr并编译x86和x64版本,然后对每种类型的目标进程使用正确的版本,这将确保最少的问题。

此外,请确保您始终以管理员身份运行。