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

Shared opcode для чайника?


Mikhailovich

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

Добрый вечер, уважаемые форумчане!

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

 

Итак, shared opcode. Я нахожу адрес здоровья, морожу значение, всё работает, хорошо. Нахожу инструкции, записывающие или обращающиеся к данному адресу. Методом научного тыка (ноплю по списку) нахожу нужную. Занопил - сам бессмертен, равно как и враги. Классика.

 

И тут у меня начинается брожение мозгов. Ищу адреса, по которым осуществляется доступ к инструкции. Ок. Теперь, кто-то инструктирует через "Анализ структуры", в другом гайде советуют "найти совпадения между адресами". Что мне лучше использовать, есть ли какая-то принципиальная разница между этими методами?

 

Идём далее. Допустим, я использовал поиск совпадений. получил список оффсетов для регистра. Надо ли их отсеивать (как временные указатели), вкл и выкл игру, перезагружать ПК и т.д.? Список вроде уменьшается.

 

И наконец, одна и та же строчка выглядит иначе в зависимости от типа отображения. Например,

оффсет 30        1103626240       0                   0                    0                   (4 байта)

                          1103626240       3328197       0                    0                   (8 байтов)

                           0000041с800    2у30220      0000             000000         (hex)

 

Что использовать при написании скрипта, если у меня тип адреса - Double? По умолчанию, скрипты читаются через hex (или так я понял), т.е. искать 16-ичное отображение? Или как-то записать условие вроде

smp [rcx+30],(double)0000041с800 (знаю, что строка не подходит, но для примера сойдёт) или smp [rcx+30],#1103626240?

 

Ещё раз прошу прощения за нубские вопросы, но я полный гуманитарий по природе и работаю  с СЕ по принципу "мартышка увидела и повторила".

                           

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

  • Garik66 изменил название на Shared opcode для чайника?
В 13.04.2022 в 8:43 PM, Mikhailovich сказал:

Что мне лучше использовать, есть ли какая-то принципиальная разница между этими методами?

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

 

В 13.04.2022 в 8:43 PM, Mikhailovich сказал:

Что использовать при написании скрипта, если у меня тип адреса - Double?

Числа с плавающей точкой двойной точности, как и обычные числа с плавающей точкой (float) надо сравнивать через определенные инструкции FPU или XMM. Инструкция cmp подходит только для целых чисел. Ты можешь попытаться сравнить hex представление, но, учитывая способ хранения типов double и float, вероятность срабатывания такого сравнения невелика.  

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

5 часов назад, Xipho сказал:

Инструкция cmp подходит только для целых чисел

Не правда, float можно так же сравнивать cmp, например:

cmp [eax+4],(float)50
je ...
jg ...
jl ...

и всё будет работать, потому что они уменьшаются и увеличиваются так же как обычные числа, хоть и в другом виде

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

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

Не правда, float можно так же сравнивать cmp, например:

Почитай про точность чисел с плавающей точкой, далее почитай про хранение и интерпретацию таких чисел в процессоре, далее почитай, почему может внезапно получиться при записи в переменную 50.00, а при чтении уже 50.0000000000000000000000000000000002, и затем почитай, как в этом случае сработает сравнение cmp

 

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

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

50.00, а при чтении уже 50.0000000000000000000000000000000002

Не важно что там будет, важно то что если писать например (float)2.56, получится к примеру 2.559999943, при этом в игре если было тоже самое значение - 2.559999943, тогда всё прекрасно будет работать, и вообще если сравнивается точное float то удобнее сравнивать их с видом hex, вроде такого - 4023D70A, а про больше и меньше всё так же остаётся, больше float число и в hex больше, меньше - меньше, так что их спокойно можно сравнивать в cmp. Как и с целыми числами никто не будет сравнивать 10 и 11, как будто они равны, во float тоже самое 5.5 и 5.55 это разные вещи, так что не понимаю что тебе не понравилось.
Если надо сравнивать целые доли то надо округлять с помощью fpu и тп, но это далеко не всегда нужно, я много раз сравнивала float и использовала fpu что бы сравнивать в том числе, поэтому говорю из своего опыта

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

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

важно то что если писать например (float)2.56, получится к примеру 2.559999943, при этом в игре если было тоже самое значение - 2.559999943

А какова вероятность, что в игре будет такое же значение? В общем, почитай теорию про хранение чисел с плавающей точке в памяти компьютера, не буду спорить, не вижу смысла одно и то же обсуждать.

 

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

я много раз сравнивала float

Это не значит, что ты делала это правильно, если ты сравнивала с помощью cmp. cmp допустим ТОЛЬКО если сравнение на больше/меньше делается. Но никак не на равенство.

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

Из своего опыта могу сказать что через cmp сравнение float работает некорректно. Особенно если float имеет отрицательное значение. Я использовал fpu.

Из старого трейнера -

fld dword ptr [Camera_Original_Pitch]
fcomp dword ptr [Mouse_Screen_Y_Min_Value]
fstsw ax
sahf
jae @f

 

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

Ок, ребята, спасибо всем за ответы, буду изучать дальше.

22 часа назад, Xipho сказал:

Ты можешь попытаться сравнить hex представление, но, учитывая способ хранения типов double и float, вероятность срабатывания такого сравнения невелика.  

Ну да, так и получилось. До Вашего ответа попробовал в 3 играх. В одной всё работает, в другой про прогрузке уровня работает, но если внутри уровня персонаж перемещается в доп. область, скрипт перестаёт фурычить. А 3 игруха меня вообще удивила. Если скрипт просто активировать - не работает, Х стоит, а здоровье уменьшается. НО если открыть скрипт для редактирования, даже ничего не изменить, затем подтвердить и снова включить - он начинает работать.? Как такое вообще возможно? :-)

 

Ещё раз всем спасибо.

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

Если хочешь использовать cmp, то можно сделать условное равенство, это будет костыльно, но срабатывать будет чаще, на C++ выглядит как то так:

Спойлер
if(b - a < 0.001)

 

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

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

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

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