Используемые плагины: REtypedef
Берем любое автоматическое оружие и находим количество патронов.
Ставим бряк на доступ, переходим в игру и стреляем.
Нам нужна инструкция, отнимающая патроны, так мы выйдем на функцию выстрела.
7FFBCE59564A - FF 8F 98000000 - dec [rdi+00000098] <<
Дальше делаем дамп Disrupt_b64.dll, запускаем IDA и ждем пока завершится анализ.
Переходим по адресу 7FFBCE59564A, мы находимся в функции, которая отнимает патроны, значит нам надо посмотреть откуда она вызывается.
Поднимаемся к началу функции видим надпись CODE XREF: переходим по ней дважды кликнув.
Теперь мы находимся в функции выстрела.
Нажимаем F5, чтобы декомпилировать функцию в псевдокод.
Видим, что переменная v1 очень часто используется, скорее всего это базовый адрес. Можно его реконструировать в структуру, для повышения читабельности псевдокода.
Для того чтобы найти скорострельность, надо найти все условия, работающие с типом float, как их проверить? Лучше всего использовать ReClass. Где взять базовый адрес? использовать адрес регистра rdi в нем будет находится базовый адрес текущего оружия.
Я нашел всего 2 условия которые бы нам подходили:
if ( a3 <= *&WeaponBase->field_34 && *&WeaponBase->field_56 <= 0.0 )
if ( WeaponBase->field_152 && *&WeaponBase->field_904 > 0.0 )
После реконструкции типа базового адреса, автоматически дописывается смещение т.е
Field_34 это 0x34 и т.д. Значит нам надо проверить 0x34, 0x56, 0x152 , 0x904.
Единственное смещение, которое реагировало на выстрелы оказалось 0x34.
Теперь добавляем в таблицу базовый адрес оружия + 0x34, ставим бряк на доступ выбираем
F3 41 0F11 4C 24 34 - movss [r12+34],xmm1 <<
И пишем на нее скрипт.
cmp [r12+98],#10 //фильтр свой-чужой
jne code
mov [r12+34],(float)99 //любое значение больше 5