Как вскрыть процесс?

Тема в разделе "WASM.BEGINNERS", создана пользователем WebWolf, 21 июн 2009.

  1. WebWolf

    WebWolf New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2009
    Сообщения:
    4
    Как в C# выполнить аналогичную работу что делает ArtMoney. Я сделал чтобы моя программа находила процесс меняла его значение в игре (например количество гранат) все пашет но вот все адреса после перезапуска игры меняются..
    Почитал вот эту статью http://www.gamewrite.ru/gamedev/21.html там написано как получить адрес который не изменяется ("а слева = 4A094D это адрес этого выражения и он никогда не меняется, хоть после перезагрузки, хоть после переустанови игры! то, что нужно") так вот я пытаюсь записать в этот адрес значение но игра просто экстренно завершает процесс (причем при броске гранаты))) подскажите в чем ошибка?
    Вот код моей программы:

    Код (Text):
    1. [DllImport("kernel32.dll")]
    2. public static extern bool WriteProcessMemory(IntPtr hProcess, uint lpBaseAddress, byte[] lpBuffer, uint nSize,
    3. out uint lpNumberOfBytesWritten);
    4.  
    5. [DllImport("Kernel32.dll")]
    6. public static extern bool ReadProcessMemory(IntPtr hProcess, uint lpBaseAddress, byte[] lpBuffer,
    7. uint nSize, out uint lpNumberOfBytesRead);
    8. -------------------------------------------------------
    9. var processes = Process.GetProcessesByName("FarCry2");
    10. if (processes.Length != 1)
    11. return;
    12. var process = processes[0];
    13.  
    14. const uint address = 0x10148B2B;
    15. uint bytesToRead = 4;
    16.  
    17. var buffer = new byte[bytesToRead];
    18. ReadProcessMemory(process.Handle, address, buffer, bytesToRead, out bytesToRead);
    19.  
    20. byte[] buff;
    21. buff = new byte[1];
    22. buff[0] = (byte)(200);
    23.  
    24. uint Read;
    25. WriteProcessMemory(process.Handle, address, buff, bytesToRead, out Read);
    как я понял там есть формула определенная по которой надо вычислить истинное значение в памяти к примеру 4A094D: mov eax,[eax+0x24330]
    4A094D = адрес инструкции mov eax,[eax+0x24330]
    [eax+0x24330] = значение в регистре eax со смещением 0×24330 т.е в этом выражении и лежат гранаты)) .
     
  2. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    С# не нужен
     
  3. WebWolf

    WebWolf New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2009
    Сообщения:
    4
    ну WinAPI ... так вопрос как? хотя бы теоретически приближенно к коду.. ведь как то трейнеры пишут... какая разница на чем C++ или C#...
     
  4. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    через VirtualProtectEx на адрес нужный даем права на запись.Прежед чем писать такие программы нужно бы почитать про организацию памяти процесса.
     
  5. WebWolf

    WebWolf New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2009
    Сообщения:
    4
    эта программа прекрасно работает! Я запускаю игру нахожу нужную ячейку в памяти потом присваиваю переменной адрес и все отлично меняется прекрасно получается сделать 200 гранат!! При перезапуске новых игр она меняется => не работает. По вопрос в другом как найти ячейку памяти которая не меняется посмотрите статью что я выше указал там вычисляется этот адрес... но каким образом это сделать программно?
     
  6. WebWolf

    WebWolf New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2009
    Сообщения:
    4
    Это DMA. Если у меня значение что я нахожу во время текущей игры например 187E83A8 то это совершенно другое значение, т.к уже при следующем запуске игры этот адрес поменяется! так вот как вычислить истинный адрес?
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Как вариант - Ставиться бряк на регион памяти, по чтению\записи, в любом случае изменение параметров будет фиксироваться, они не могут постоянно быть в регистрах - их попросту не хватит. В обработчике бряка узнаете куда была запись. Далее изменяете ячейку, адрес которой узнали в обработчике.
     
  8. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Модуль что-ли грузится каждый раз по разному адресу? Если эта не локальная переменная из стека, на нее будет релок. Тогда надо просто найти ее номер в таблице релоков, и прочитать ее текущий адрес.

    PS.Тема явно не для os.kernel