Редактирование кода программы - Assembler

Узнай цену своей работы

Формулировка задачи:

Написал трейнер для игры, который делает бесконечные жизни и патроны путём перезаписывания в цикле соответствующих значений в памяти
Листинг программы
  1. int MAX_HEALTH = 100;
  2. DWORD health_adr = 0x3A93A480; // адрес жизней, который нашёл через CheatEngine
  3. WriteProcessMemory(hProc, (LPVOID) health_adr, &MAX_HEALTH , 4, NULL);
Всё отлично работает. Решил пойти дальше и узнал, что можно изменять сам код игры
Зачем изменять память, когда мы можем изменять сам код игры? Код, во время выполнения, тоже хранится в памяти, его тоже можно изменять, в т.ч. программно. Это гораздо удобнее - код не меняет адрес, мы можем заставить игру делать что угодно: например, значения не придётся "замораживать" таймерами. В общем, сами увидите, как это здорово 8)
Поставив брекпойнт на запись в адрес жизней (0x3A93A480) нашёл инструкцию, которая уменьшает количество жизней при получении урона

1012954E - 89 03 - mov [ebx],eax

Листинг программы
  1. originalcode:
  2. mov [ebx],eax
  3. mov ebx,eax
  4. mov eax,[esp+14]
и вот когда заменяю первую строчку
Листинг программы
  1. mov [ebx],eax
на
Листинг программы
  1. mov [ebx],64
то при получении урона как и должно быть кол-во жизней принимает значение 100, но и количество патрон и гранат тоже принимает значение 100. Т.е. получается что одна инструкция

1012954E

отвечает за изменение и жизней, и патронов, и гранат. Для справки сейчас в трейнере по умолчанию заморозка отключена, по нажатию кнопки F6 переменная bool godMode принимает true, по нажатию F7 - bool unlimitedAmmo = true. И далее в бесконечном цикле while(1) выполняется перезапись:
Листинг программы
  1. // Rewrite data if FREEZE FLAG enabled
  2. if(bGodMode)
  3. {
  4. setPoints(MAX_HEALTH, MAX_ARMOUR);
  5. }
  6. if(bUnAmmo)
  7. {
  8. updateAmmo();
  9. }
Собственно вопрос можно ли как-нибудь сделать так, чтобы если захотел заморозить кол-во жизней, то кол-во патронов и гранат не будут замораживаться? Думаю может нужно проверять что приходит в

ebx

- жизни, патроны, гранаты и в зависимости от флагов bool godmode, bool unlimitedAmmo выполнять заморозку. Что-то например:
Листинг программы
  1. if (ebx == adr_ammo){
  2. if(unlimitedAmmo == true){
  3. nop
  4. }
  5. else {
  6. mov [ebx],eax
  7. }
  8. }
  9. else if (ebx == adr_health){
  10. if(godMode == true){
  11. nop
  12. }
  13. else {
  14. mov [ebx],eax
  15. }
  16. }

Решение задачи: «Редактирование кода программы»

textual
Листинг программы
  1.     while(true)
  2.     {
  3.  
  4.         // Close Trainer IF GAME is NOT RUNNING
  5.         if(!gameIsRun())
  6.         {
  7.             break;
  8.         }
  9.  
  10.         // Continue IF GAME is not active
  11.         if(!gameOnFocus())
  12.         {
  13.             Sleep(1000);
  14.             continue;
  15.         }
  16.  
  17.         // Continue IF PLAYER is DEAD
  18.         iHealth = Game.getHealth();
  19.         if(iHealth < 1 || iHealth > MAX_HEALTH)
  20.         {
  21.             Sleep(1000);
  22.             Game.refresh();
  23.             continue;
  24.         }
  25.  
  26.         // Rewrite data if FREEZE FLAG enabled
  27.         if(bGodMode)
  28.         {
  29.             Game.setPoints(MAX_HEALTH, MAX_ARMOUR);
  30.         }
  31.         if(bUnAmmo)
  32.         {
  33.             Game.updateAmmo();
  34.         }
  35.         Sleep(100);
  36.     }

Объяснение кода листинга программы

  1. Происходит проверка, запущена ли игра. Если игра не запущена, то цикл прерывается.
  2. Происходит проверка, активна ли игра. Если игра не активна, то происходит задержка в 1 секунду и цикл продолжается.
  3. Происходит проверка, жив ли игрок. Если здоровье игрока меньше 1 или больше максимального значения здоровья, то происходит задержка в 1 секунду, обновляется здоровье игрока и цикл продолжается.
  4. Происходит проверка, включен ли режим бога. Если режим бога включен, то устанавливается максимальное здоровье и броня игрока.
  5. Происходит проверка, включен ли режим отсутствия боеприпасов. Если режим отсутствия боеприпасов включен, то обновляется количество боеприпасов игрока.
  6. Происходит задержка в 0,1 секунды и цикл продолжается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут