Foxhound Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 Привет. Делаю самые первые шаги взлома, помогите пожалуйста новичку. Игра старая, пошаговая стратегия 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 не ставилось автоматом, а можно было менять вручную из таблицы, чтобы когда включил скрипт, значение установилось текущее, поменял вручную число в таблице - изменилось. Если правильно понимаю (статьи читал, видеоуроки смотрел), в скрипте нужно скопировать куда-то текущее значение, там его изменить и вернуть обратно. Пробовал сначала сделать сам, не получилось, потом смотрел, как сделаны похожие скрипты на другие игры, которые нормально работают, но у меня всё равно ничего не получается, число в таблице появляется, меняю, но кликаю юнита снова и оно восстанавливается как было или СЕ пишет ошибку создания скрипта или игра виснет. Помогите пожалуйста. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 2 апреля, 2017 Поделиться Опубликовано 2 апреля, 2017 Привет! Я бы пошел другим путем - предположив, что юниты явно хранятся в каких-нибудь коллекциях (например, в массивах), я нашел бы характеристики одного юнита (текущее здоровье, к примеру), затем - массив, в котором хранится тип этого юнита и все эти юниты соответственно, а затем - функцию, которая создает новые юниты этого типа и записывает их в массив. В этой функции явно будут читаться минимальные и максимальные значения всех параметров в зависимости от типа создаваемого юнита. Твой пост я чуток подправил - исходный код принято запихивать под соответствующий тэг и под спойлер, потому что кода бывает много и не очень удобно читать эти простыни. Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 2 апреля, 2017 Автор Поделиться Опубликовано 2 апреля, 2017 1 hour ago, keng said: Привет! Я бы пошел другим путем - предположив, что юниты явно хранятся в каких-нибудь коллекциях (например, в массивах), я нашел бы характеристики одного юнита (текущее здоровье, к примеру), затем - массив, в котором хранится тип этого юнита и все эти юниты соответственно, а затем - функцию, которая создает новые юниты этого типа и записывает их в массив. В этой функции явно будут читаться минимальные и максимальные значения всех параметров в зависимости от типа создаваемого юнита. Наверное, для меня это пока слишком сложно или я что-то не так делаю. Во всяком случае у меня не получилось, хотя я искал очень долго и терпеливо. Не знаю, важно это для взлома или нет, но в отличие от многих других, особенность этой игры в том, что новые юниты не появляются, сама игра их вообще не генерит никак, там сразу готовые сценарии с уже размещёнными юнитами, иногда сотнями. Параметры и вся иерархия войск записаны заранее в отдельном файле, однотипные юниты неравномерно разбросаны по более крупным соединениям. Например, два совершенно одинаковых по характеристикам батальона могут быть в одной дивизии, а могут принадлежать разным фронтам, начальные параметры и характер их изменения у одного и того же полка в разных сценариях могут сильно отличаться и т.д., всё это жёстко задано изначально, игра просто загружает готовый order of battle. Характеристики каждого отдельного юнита ищутся очень легко, 2-3 отсева, но найти структуры у меня не получилось. Или игра не позволяет, или отсутствие знаний. Автопоиском указатели ищутся тоже легко и при перезапуске сценария указатели не слетают, даже адреса иногда повторяются, но на другом сценарии уже ни один указатель не работает. У меня получилось найти только ту инструкцию, что я привёл, которая обращается к параметрам выбранного в данный момент юнита, своего или чужого, и я хотел параметры привязать к ней, чтобы в таблице был скрипт и список текущих параметров юнита. Параметр в таблице, значение которого меняется в зависимости от выбранного юнита, я сделал, но не знаю, как сделать, чтобы с его помощью менять игровое значение, а не только считывать. Видел возможность менять параметры выбранного игрового объекта во многих готовых таблицах к стратегиям с форума СЕ. Как это можно сделать? Пользуясь случаем, хочу поблагодарить за видеоуроки, отсмотрел почти весь цикл, наглядно и доходчиво. В качестве пожелания: больше уроков, хороших и разных, рассчитанных на начинающих. Что-то типа "маленькие хитрости от больших профи" или вроде того. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 В 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. Ссылка на комментарий Поделиться на другие сайты Поделиться
Foxhound Опубликовано 3 апреля, 2017 Автор Поделиться Опубликовано 3 апреля, 2017 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 или есть разница? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 23 минуты назад, Foxhound сказал: зачем же она указана? Это обычное смещение по модулю особого смысла от него нет т.к аоб будет искать твои байты по всему модулю, можешь в документации глянуть. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 3 апреля, 2017 Поделиться Опубликовано 3 апреля, 2017 6 часов назад, Foxhound сказал: немного переделал (перенёс часть в другое место), Да не много косякнул - утром перед работой торопился. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения