1) Открываешь ida pro закидываешь из доты файл particles.dll
2) когда все загрузилось жмешь shift+f12 (фото 1)
3) ctrl+f и пишешь Error in child list of particle system %s [%p], parent: %p\n (фото 2)
4) 2 раза по нему видишь aErrorInChildLi наводишься на него и жмешь x
5) тут просто ок (фото 3)
6) Появляется окно фото 4
7) листаешь вверх до loc_180039FD2: фото 5
8) тут чуть чуть объяснений именно [rsi+0A64h] — это структура или поле, отвечающее за отрисовку партиклей. Если мы пропатчим функцию так, чтобы этот флаг всегда был включен то и партикли буду рисоваться всегда.
9) тут нам нужен уже для иды модуль signmaker
10) наводимся на byte и ctrl + alt + s выбираем ida signature получаем что то в виде Signature for 180039FD2: 80 A6 ? ? ? ? ? 41 0F B6 C4 11) Сигнатура, которую мы нашли (80 A6 ?? ?? ?? ?? ?? 41 0F B6 C4). Здесь: 80 A6 - это опкод для инструкции and с байтом 64 0A 00 00 - это смещение 0A64h 7F - это значение для операции and (7Fh) 41 0F B6 C4 - это следующая инструкция следовательно нам надо всегда устанавливать старший бит в 1 (true): Оригинал: 80 A6 64 0A 00 00 7F (and byte ptr [rsi+0A64h], 7Fh) Патч: 80 8E 64 0A 00 00 80 (or byte ptr [rsi+0A64h], 80h)
Сейчас там другие значения, но принцип тот же самый
import pymem
import pymem.process
def main():
try:
pm = pymem.Pymem('dota2.exe')
particles = pymem.process.module_from_name(pm.process_handle, 'particles.dll')
particles_module = pm.read_bytes(particles.lpBaseOfDll, particles.SizeOfImage)
pattern = bytes([0x80, 0xA6, 0xA4, 0x09, 0x00, 0x00, 0x7F])
instruction_offset = particles_module.find(pattern)
if instruction_offset == -1:
print("Инструкция не найдена в particles.dll")
return
instruction_address = particles.lpBaseOfDll + instruction_offset
print(f"Инструкция найдена по адресу: 0x{instruction_address:X}")
patch_bytes = bytes([0x80, 0x8E, 0xA4, 0x09, 0x00, 0x00, 0x80])
pm.write_bytes(instruction_address, patch_bytes, len(patch_bytes))
print("Патч успешно применен")
verification = pm.read_bytes(instruction_address, len(patch_bytes))
if verification == patch_bytes:
print("Верификация успешна - патч применен корректно")
else:
print("Ошибка верификации - патч мог не примениться корректно")
except Exception as e:
print(f"Ошибка: {e}")
finally:
try:
pm.close_process()
except:
pass
if [B]name[/B] == '[B]main[/B]':
main()
но скажу честно, как будто после нескольких каток с такими приколами начинают попадаться типы с софтом