#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, затем используйте правильную версию для каждого типа целевого процесса, это обеспечит минимальное количество проблем.
Кроме того, убедитесь, что вы всегда запускаетесь от имени администратора.