Как в C# выполнить аналогичную работу что делает ArtMoney. Я сделал чтобы моя программа находила процесс меняла его значение в игре (например количество гранат) все пашет но вот все адреса после перезапуска игры меняются.. Почитал вот эту статью http://www.gamewrite.ru/gamedev/21.html там написано как получить адрес который не изменяется ("а слева = 4A094D это адрес этого выражения и он никогда не меняется, хоть после перезагрузки, хоть после переустанови игры! то, что нужно") так вот я пытаюсь записать в этот адрес значение но игра просто экстренно завершает процесс (причем при броске гранаты))) подскажите в чем ошибка? Вот код моей программы: Код (Text): [DllImport("kernel32.dll")] public static extern bool WriteProcessMemory(IntPtr hProcess, uint lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesWritten); [DllImport("Kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, uint lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesRead); ------------------------------------------------------- var processes = Process.GetProcessesByName("FarCry2"); if (processes.Length != 1) return; var process = processes[0]; const uint address = 0x10148B2B; uint bytesToRead = 4; var buffer = new byte[bytesToRead]; ReadProcessMemory(process.Handle, address, buffer, bytesToRead, out bytesToRead); byte[] buff; buff = new byte[1]; buff[0] = (byte)(200); uint Read; WriteProcessMemory(process.Handle, address, buff, bytesToRead, out Read); как я понял там есть формула определенная по которой надо вычислить истинное значение в памяти к примеру 4A094D: mov eax,[eax+0x24330] 4A094D = адрес инструкции mov eax,[eax+0x24330] [eax+0x24330] = значение в регистре eax со смещением 0×24330 т.е в этом выражении и лежат гранаты)) .
ну WinAPI ... так вопрос как? хотя бы теоретически приближенно к коду.. ведь как то трейнеры пишут... какая разница на чем C++ или C#...
через VirtualProtectEx на адрес нужный даем права на запись.Прежед чем писать такие программы нужно бы почитать про организацию памяти процесса.
эта программа прекрасно работает! Я запускаю игру нахожу нужную ячейку в памяти потом присваиваю переменной адрес и все отлично меняется прекрасно получается сделать 200 гранат!! При перезапуске новых игр она меняется => не работает. По вопрос в другом как найти ячейку памяти которая не меняется посмотрите статью что я выше указал там вычисляется этот адрес... но каким образом это сделать программно?
Это DMA. Если у меня значение что я нахожу во время текущей игры например 187E83A8 то это совершенно другое значение, т.к уже при следующем запуске игры этот адрес поменяется! так вот как вычислить истинный адрес?
Как вариант - Ставиться бряк на регион памяти, по чтению\записи, в любом случае изменение параметров будет фиксироваться, они не могут постоянно быть в регистрах - их попросту не хватит. В обработчике бряка узнаете куда была запись. Далее изменяете ячейку, адрес которой узнали в обработчике.
Модуль что-ли грузится каждый раз по разному адресу? Если эта не локальная переменная из стека, на нее будет релок. Тогда надо просто найти ее номер в таблице релоков, и прочитать ее текущий адрес. PS.Тема явно не для os.kernel