Получить адрес модуля в C # .NET 3.5?

#c# #.net #.net-3.5

#c# #.net #.net-3.5

Вопрос:

Я создаю наложение directx для взлома esp в игре. (Я сделал несколько на C , но хотел попробовать c #) Этот метод требует, чтобы я использовал версию directx, которая совместима только с .net Framework 3.5 или старше. Я использовал этот код для получения базового адреса определенного модуля:

 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;
        }
    }
  

Этот код отлично работает в framework 4.5.2 (он перебирает почти 100 различных модулей и возвращает базовый адрес того модуля, который я ищу). Но при использовании кода в 3.5 он перебирает только около 5 модулей (ни один из которых мне не нужен) и возвращает -1.

Почему это вызвано? Есть ли другой способ получить базовый адрес модуля?

Комментарии:

1. Вы выполняете его с повышенными привилегиями? Кроме того, нет необходимости использовать FW 3.5, .net4.5 обратно совместим.

2. Он совместим только с версией 3.5 или меньше. Уверяю вас. Потратил около часа на эту головную боль сегодня. Я бы не использовал 3.5, если бы в этом не было необходимости. В противном случае у меня не было бы этой проблемы с самого начала. Какие повышенные привилегии мне понадобятся? Он отлично работает в 4.5.2, но не 3.5. Как указано в op.

3. В любом случае, вы выполняете его с повышенными привилегиями? в противном случае процесс может быть не в состоянии получить доступ к информации о другом процессе.

4. Да, это так. Это доступ к информации о других процессах. Несколько. Как я said…It считывает около 5 модулей вместо обычных 100.

5. Тогда в используемой вами версии 3.5 должна быть какая-то ошибка, вы всегда можете использовать P / Invoke с OpenProcess и EnumProcessModules.

Ответ №1:

Причина, по которой вы видите только 5 модулей, заключается в том, что вы используете программу x86 для анализа модулей процесса x64. Если вы создаете программу, которая взаимодействует с памятью внешнего процесса, вы всегда должны компилировать ее для архитектуры целевых процессов. Это избавит вас от большой головной боли.

Используйте IntPtr для адресов и смещений и скомпилируйте обе версии x86 и x64, затем используйте правильную версию для каждого типа целевого процесса, это обеспечит минимальное количество проблем.

Кроме того, убедитесь, что вы всегда запускаетесь от имени администратора.