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

[Call of Duty Modern Warfare 2] - изменение скорости персонажа


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

1 час назад, Sergey99 сказал:

esp+70

Со стеком надо немного по другому работать, обычным получением значения по инструкции ничего не выйдет.
 

В зависимости от размера кадра стека для текущей функции твое значение может быть локальной переменной.

 

К примеру возьмем кадр стека размером 78 байт(в прологе функции можно посмотреть, сколько "выделяется" памяти под кадр инструкцией sub esp, <размер>, тогда получается так.

esp = ebp - 78 является верхушкой стека

...
...
...
...
esp+70 = ebp-8 = 1337
...
...
ebp = esp+78 указатель на базовый адрес стека. 

 

если же смещение превышает размер выделенного кадра, тогда это переменная из другой функции, можно даже высчитать из какой посчитав размер всех выделенных кадров.

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

  • Ответов 53
  • Создана
  • Последний ответ

Топ авторов темы

Популярные дни

2 минуты назад, partoftheworlD сказал:

Со стеком надо немного по другому работать, обычным получением значения по инструкции ничего не выйдет.
 

В зависимости от размера кадра стека для текущей функции твое значение может быть локальной переменной.

 

К примеру возьмем кадр стека размером 78 байт(в прологе функции можно посмотреть, сколько выделяет памяти под кадр инструкция sub esp, <размер>, тогда получается так.


esp = ebp - 78 является верхушкой стека

...
...
...
...
esp+70 = ebp-8 = 1337

...
...
ebp = esp+78 указатель на базовый адрес стека. 

 

если же смещение превышает размер выделенного кадра, тогда это переменная из другой функции, можно даже высчитать из какой посчитав размер всех выделенных кадров.

Думаю это легче через Olly делать, а то я это в CE брейки ставил

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

2 минуты назад, Sergey99 сказал:

Думаю это легче через Olly делать

Пора про неё забыть, это инструмент наших предков, есть современная альтернатива - x64dbg

 

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

2 часа назад, partoftheworlD сказал:

Пора про неё забыть, это инструмент наших предков, есть современная альтернатива - x64dbg

 

Ой да ладно вам, Olly живи :) 

Однако более детального способа найти скорость персонажа ещё не нашёл, может быть всё очень замудрено там в игре?

Есть ли кто-нибудь ещё по мимо меня, кто увлекается CoD MW2, кто более прошарен чем я, подскажите в какую сторону копать, чтобы найти "некую константу для скорости персонажа", на наглядном примере (у кого игра сейчас имеется при себе).

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

53 55 8B 6C 24 0C 56 68 ? ? ? ? E8 ? ? ? ? A1 ? ? ? ? 8B ? ? ? ? ? 83 C4 04 3D ? ? ? ? 7C 2B 68 ? ? ? ? FF D3 68 ? ? ? ? E8 ? ? ? ? 68 ? ? ? ? 55 68 ? ? ? ? 6A 00 E8 ? ? ? ? A1 ? ? ? ? 83 C4 14 8D 34 80 C1 E6 04 81 C6 ? ? ? ? 89 ? ? ? ? ? ? 83 C0 01 F7 44

if [0x01968FE8] == 0x4D1:
    (0x4D1 + 0x4D1 * 4 << 4) = 0x0018150
    00018150 + 0x196E010 + 10 = speed
    

 

 

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

Ок, вижу что адрес получен в результате математической операции, можете сказать от куда начали реверс? Если ставили отладчик на проверку "какая инструкция пишет в этот адрес", то в какой, где координата хранится или что-то другое?

И не совсем понятно от куда нашлось число 1233 (0x4D1) и зачем сдвигать операнд влево через  оператор <<, если можно объясните подробнее, чтобы я понял :)

Изменено пользователем Xipho
Не нужно цитировать все сообщение целиком, цитируй только ту часть, на которую отвечаешь. Первый раз устное предупреждение.
Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Sergey99 сказал:

и зачем сдвигать операнд влево через  оператор <<

Бинарное умножение на 16

 

4 часа назад, Sergey99 сказал:

если можно объясните подробнее, чтобы я понял

 

В общем-то тут все достаточно просто. Начнем с того, что все игры основанные на движке квейка и имеющие мультиплеер, для одиночной игры так же поднимают локальный сервер. Но в подобной архитектуре, чтобы построить игру надо прописывать игровые команды(DVAR) задавая физику, гравитацию и много-много чего еще. С этого я и начал, нашел текстовую строку "g_speed", а дальше реверс, по ходу дела нашел функцию регистрирующую команды в памяти игры. Эти вычисления как раз регистрируют блок памяти всех значений связанных с g_speed. 0x4D1 это индекс команды g_speed.

 

if [0x01968FE8] == 0x4D1:
    (0x4D1 + 0x4D1 * 4 << 4) = 0x0018150
    00018150 + 0x196E010 + 10 = speed


image.png.72e9414e4fc9c846ac82039b1677815a.png

 

 

 

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

2 минуты назад, Sergey99 сказал:

То есть в адресе 0x01968FE8  команда g_speed?

 Нет, это адрес указывающий на индекс команды с которой функция работает в настоящее время. 

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

2 минуты назад, partoftheworlD сказал:

 Нет, это адрес указывающий на индекс команды с которой функция работает в настоящее время. 

Ок, я как раз поставил отладчик x64dbg, тот самый, пока привыкать буду :) 

Я так полагаю версии у нас разные поэтому мне сперва надо найти текстовую метку g_speed?

Сейчас у меня открыт именно файл .exe игры, а не присоединён к процессу

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

4 минуты назад, Sergey99 сказал:

Сейчас у меня открыт именно файл .exe игры, а не присоединён к процессу

Поиск по сигнатуре делай. ПКМ по листингу Поиск в текущем модуле -> Шаблон. Ах, да шаблон надо исправить, вместо "?" должно быть "??"

Если с нуля, то ПКМ по листингу Поиск в текущем модуле -> поиск ссылок на строки 

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

5 минут назад, partoftheworlD сказал:

Поиск по сигнатуре делай. ПКМ по листингу Поиск в текущем модуле -> Шаблон. Ах, да шаблон надо исправить, вместо "?" должно быть "??"

Это точно нужно искать в листинге, где дизассемблированный код файла лежит, где адреса, инструкции и байты?

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

2 минуты назад, Sergey99 сказал:

Это точно нужно искать в листинге, где дизассемблированный код файла лежит, где адреса, инструкции и байты?

Да

 

53 55 8B 6C 24 0C 56 68 ?? ?? ?? ?? E8 ?? ?? ?? ?? A1
Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, Xipho сказал:

На анализ нужно открывать сдампленный файл, а не основную версию.

Я просто привык к стандартному отладчику СЕ и Olly, к тому же процесс игры не запускаю.

Как мне здесь сделать дамп файла? Видимо буду теперь привыкать к новому отладчику :)

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

30 минут назад, Sergey99 сказал:

к тому же процесс игры не запускаю.

 

Многие игры распаковывают различные данные только после запуска, а взлом не запуская игру сравним с гаданием по солнцу с закрытыми глазами.

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

Чтобы было более понятно, я запустил процесс, присоединился, приступаю к поиску в модуле, а как сюда картинки вставлять, а то я новенький на сайте, не вижу формуляра для добавление картинок к сообщению?

18 минут назад, partoftheworlD сказал:

 

Многие игры распаковывают различные данные только после запуска, а взлом не запуская игру сравним с гаданием по солнцу с закрытыми глазами.

Тогда будем присоединять отладчик уже к процессу

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

1 час назад, partoftheworlD сказал:

 

Многие игры распаковывают различные данные только после запуска, а взлом не запуская игру сравним с гаданием по солнцу с закрытыми глазами.

Есть способ тут картинку к сообщению присобачить, чтобы проще ориентироваться по ходу?

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

27 минут назад, partoftheworlD сказал:

Если картинка в буфере - CTRL+V, если в файле - то куда-нибудь на imgur и вставлять ссылку. Если картинок больше 1, то под спойлер.

Вот как я делаю когда присоединил отладчик к процессу игры, ведь правильно?

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

? Конечно он ничего не найдет, ты ведь делаешь поиск сигнатур в ntdll модуле, а нужно выбрать модуль игры. Это во вкладке отладочные символы выбирается.

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

38 минут назад, partoftheworlD сказал:

? Конечно он ничего не найдет, ты ведь делаешь поиск сигнатур в ntdll модуле, а нужно выбрать модуль игры. Это во вкладке отладочные символы выбирается.

Загрузил в модуль, теперь у меня вот это окно, правильно двигаюсь?

https://imgur.com/AagL2I7

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

2 часа назад, partoftheworlD сказал:

? Конечно он ничего не найдет, ты ведь делаешь поиск сигнатур в ntdll модуле, а нужно выбрать модуль игры. Это во вкладке отладочные символы выбирается.

Вы все не поверите, но я блин посмотрел настройки по умолчанию и выяснил следующее: раз уж при стандартных настройках параметр g_speed равен 190, то я нашёл его через CE методом тыка :)

Но всё же, всё равно интересно, как вы нашли этот параметр, я видел что адрес состоит из нескольких значений и умножения на 4 (видимо это размер 4 байта, непонятно зачем там нужен оператор смещения >>)

Я всё ещё не допёр как же найти эту метку и провести анализ, чтобы в итоге получить тот же адрес?

Потому что ведь может быть игра, в которой нет мультиплеера, в которой даже нет файла с конфигами, чтобы можно было подсмотреть значение

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


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

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

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