Перейти к содержанию

Рекомендуемые сообщения

Привет. Делаю самые первые шаги взлома, помогите пожалуйста новичку.
Игра старая, пошаговая стратегия Kursk'43 от HPS Simulations. Нужна возможность менять параметры выбранного юнита, численность и некоторые другие.
Нашёл в СЕ адрес численности одного юнита, потом нашёл инструкцию, которая его меняет на запись, она только одна.
kursk43.exe+95C8D - 8B 6F 10  - mov ebp,[edi+10]
Если по ней включить Find out what addresses this instruction accesses, то по каждому клику в игре на любом юните в окошке СЕ появляется адрес его численности. Сделал из шаблона скрипт:

 

Spoiler

[ENABLE]
alloc(newMem, 2048)
label(returnHere)
newMem:
    mov [edi+10],#100
    mov ebp,[edi+10]
    mov [esp+1C],eax
    jmp returnHere
kursk43.exe+95C8D:
    jmp newMem
    nop
    nop
returnHere:
[DISABLE]
    
kursk43.exe+95C8D:
    mov ebp,[edi+10]
    mov [esp+1C],eax
dealloc(newMem)

 

 

С ним по каждому клику на любом юните его численность становится 100. Но я хотел, чтобы число 100 не ставилось автоматом, а можно было менять вручную из таблицы, чтобы когда включил скрипт, значение установилось текущее, поменял вручную число в таблице - изменилось. Если правильно понимаю (статьи читал, видеоуроки смотрел), в скрипте нужно скопировать куда-то текущее значение, там его изменить и вернуть обратно. Пробовал сначала сделать сам, не получилось, потом смотрел, как сделаны похожие скрипты на другие игры, которые нормально работают, но у меня всё равно ничего не получается, число в таблице появляется, меняю, но кликаю юнита снова и оно восстанавливается как было или СЕ пишет ошибку создания скрипта или игра виснет. Помогите пожалуйста.

Ссылка на комментарий
Поделиться на другие сайты

Привет! Я бы пошел другим путем - предположив, что юниты явно хранятся в каких-нибудь коллекциях (например, в массивах), я нашел бы характеристики одного юнита (текущее здоровье, к примеру), затем - массив, в котором хранится тип этого юнита и все эти юниты соответственно, а затем - функцию, которая создает новые юниты этого типа и записывает их в массив. В этой функции явно будут читаться минимальные и максимальные значения всех параметров в зависимости от типа создаваемого юнита. Твой пост я чуток подправил - исходный код принято запихивать под соответствующий тэг и под спойлер, потому что кода бывает много и не очень удобно читать эти простыни.

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, keng said:

Привет! Я бы пошел другим путем - предположив, что юниты явно хранятся в каких-нибудь коллекциях (например, в массивах), я нашел бы характеристики одного юнита (текущее здоровье, к примеру), затем - массив, в котором хранится тип этого юнита и все эти юниты соответственно, а затем - функцию, которая создает новые юниты этого типа и записывает их в массив. В этой функции явно будут читаться минимальные и максимальные значения всех параметров в зависимости от типа создаваемого юнита.

 

Наверное, для меня это пока слишком сложно или я что-то не так делаю. Во всяком случае у меня не получилось, хотя я искал очень долго и терпеливо.
Не знаю, важно это для взлома или нет, но в отличие от многих других, особенность этой игры в том, что новые юниты не появляются, сама игра их вообще не генерит никак, там сразу готовые сценарии с уже размещёнными юнитами, иногда сотнями. Параметры и вся иерархия войск записаны заранее в отдельном файле, однотипные юниты неравномерно разбросаны по более крупным соединениям. Например, два совершенно одинаковых по характеристикам батальона могут быть в одной дивизии, а могут принадлежать разным фронтам, начальные параметры и характер их изменения у одного и того же полка в разных сценариях могут сильно отличаться и т.д., всё это жёстко задано изначально, игра просто загружает готовый order of battle. Характеристики каждого отдельного юнита ищутся очень легко, 2-3 отсева, но найти структуры у меня не получилось. Или игра не позволяет, или отсутствие знаний. Автопоиском указатели ищутся тоже легко и при перезапуске сценария указатели не слетают, даже адреса иногда повторяются, но на другом сценарии уже ни один указатель не работает.
У меня получилось найти только ту инструкцию, что я привёл, которая обращается к параметрам выбранного в данный момент юнита, своего или чужого, и я хотел параметры привязать к ней, чтобы в таблице был скрипт и список текущих параметров юнита. Параметр в таблице, значение которого меняется в зависимости от выбранного юнита, я сделал, но не знаю, как сделать, чтобы с его помощью менять игровое значение, а не только считывать. Видел возможность менять параметры выбранного игрового объекта во многих готовых таблицах к стратегиям с форума СЕ. Как это можно сделать?


Пользуясь случаем, хочу поблагодарить за видеоуроки, отсмотрел почти весь цикл, наглядно и доходчиво. В качестве пожелания: больше уроков, хороших и разных, рассчитанных на начинающих. Что-то типа "маленькие хитрости от больших профи" или вроде того. :)

Ссылка на комментарий
Поделиться на другие сайты

В 02.04.2017в19:31, Foxhound сказал:

Но я хотел, чтобы число 100 не ставилось автоматом, а можно было менять вручную из таблицы,

Скрытый текст

[ENABLE]
alloc(newMem, 2048)
label(returnHere)
label(Amount)
registersymbol(Amount)

newMem:
    push [Amount]
    pop [edi+10]
    mov ebp,[edi+10]
    mov [esp+1C],eax
    jmp returnHere
    
Amount:
    dd #100   

kursk43.exe+95C8D:
    jmp newMem
    nop
    nop
returnHere:

[DISABLE]
kursk43.exe+95C8D:
    mov ebp,[edi+10]
    mov [esp+1C],eax
unregistersymbol(Amount)
dealloc(newMem)

 

Добавь в таблицу адрес с адресом "Amount" и названием например "Нужное количество юнитов" - по умолчанию в нём будет 100.

 

Ссылка на комментарий
Поделиться на другие сайты

7 hours ago, Garik66 said:

Добавь в таблицу адрес с адресом "Amount" и названием например "Нужное количество юнитов" - по умолчанию в нём будет 100.

 

К сожалению, этот скрипт не работает, игра вылетает, как только я кликаю по любому юниту, но идею я вроде понял, спасибо за помощь. Поразмыслив и поплясав с бубном, я его немного переделал (перенёс часть в другое место), вот в таком виде скрипт работает:

Spoiler

[ENABLE]
alloc(newMem, 2048)
label(returnHere)
label(Amount)
registersymbol(Amount)

newMem:
    push [Amount]
    pop [edi+10]
    mov ebp,[edi+10]
    mov [esp+1C],eax
    jmp returnHere

Amount:
    dd #100

kursk43.exe+95C8D:
    jmp newMem
    nop
    nop

returnHere:

[DISABLE]
kursk43.exe+95C8D:
    mov ebp,[edi+10]
    mov [esp+1C],eax
unregistersymbol(Amount)
dealloc(newMem)

 

но я не уверен, правильно ли я изменил, хотя оно и заработало. Прокомментируй пожалуйста.


Вопрос по aob.
Когда я создаю из встроенного шаблона СЕ, то строка aob выглядит так:
aobscanmodule(INJECT,kursk43.exe,8B 6F 10 89 44 24 1C) // should be unique
а когда из шаблона aamaker, то так:
aobscanmodule(INJECT,kursk43.exe+95C8D,8B 6F 10 89)
Мне непонятно, почему в первом случае указано "kursk43.exe", а во втором "kursk43.exe+95C8D"? Ведь насколько я понимаю, функция aob как раз и должна сама найти эту часть "+95C8D", зачем же она указана?

 

И ещё. Как в приведённом примере:
aobscanmodule(INJECT,kursk43.exe,8B 6F 10 89 44 24 1C)
указать не конкретно kursk43.exe, а любой процесс, к которому подсоединён в данный момент СЕ? И если такое возможно, то будет ли это то же самое, что и команда aobscan или есть разница?

Ссылка на комментарий
Поделиться на другие сайты

23 минуты назад, Foxhound сказал:

зачем же она указана?

 

 

Это обычное смещение по модулю особого смысла от него нет т.к аоб будет искать твои байты по всему модулю, можешь в документации глянуть.

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Foxhound сказал:

немного переделал (перенёс часть в другое место),

Да не много косякнул - утром перед работой торопился.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.