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

[Bloody Trapland] Вопрос по скрипту


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

Решил в игре получить невосприимчивость к вражеским объектам (неуязвимость). Но т.к. в этой игре умираешь с одного раза, то у меня возникли трудности. Сначала я пытался в интернете найти похожие запросы, но ничего, кроме уже готовых трейнеров/таблиц не увидел для других игр. Тогда я решил искать 4-байтное значение по признаку "изменилось/не изменилось". Однако таким образом я смог найти только время респа персонажа после смерти (оно длиться 1 секунду). Я предположил, что инструкция, работающая с этим таймером находится внутри подпрограммы, связанной со смертью персонажа. Значит необходимо посмотреть, что находится раньше вызова этой подпрограммы. Но ничего определенного я не нашел (там естественно было сравнение с условным переходом, но по моим наблюдениям этот условный переход всегда выполняется: и когда жив персонаж, и когда мертв):
 

Скрытый текст

image.png


Тогда я решил выполнить трассировку этой подпрограммы в случаях, когда персонаж жив и когда мертв, сравнить их и "проанализировать отличающиеся моменты" (хотя это слишком громкое заявление):
 

Скрытый текст

image.png

Посмотрев на инструкцию с адресом 0x20DAE917, решил узнать, что находится в ячейке памяти по адресу [eax+142]. А там первый байт как раз отвечает за жизнь (1 - жив, 0 - мертв). Ну а дальше поставил брейкпоинт на запись. Там 1-ая инструкция записывает 0 в ячеку памяти с жизнью, а 2-ая - 1. Ну я опять делаю предположение, что 1-ая инструкция находится в подпрограмме, отвечающей за смерть персонажа, выхожу на вызов этой подпрограммы, и ради прикола меняю условный переход на безусловный:
 

Скрытый текст

image.png

Ну и я получил бессмертие, но только для определенных вражеских предметов (шипы меня не убивали, но вот, например, лава для меня смертельна). Тогда я опять поставил брейкпоинт на запись для той же ячейки памяти, в которой находится жизнь персонажа,  и выяснил, что эту подпрограмму вызывают еще в других местах. Единственное, что пришло мне в голову, это после вызова подпрограммы сразу написать инструкцию "ret":
 

Скрытый текст

[ENABLE]

aobscan(inf3,55 8B EC 57 56 53 83 EC 18 8B F1 8B FA 80) // should be unique
alloc(newmem,$1000)

inf3:
  ret

registersymbol(inf3)

[DISABLE]

inf3:
  db 55 8B EC 57 56

unregistersymbol(inf3)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 06E0AA30

""+6E0AA15: 5E                    -  pop esi
""+6E0AA16: 5F                    -  pop edi
""+6E0AA17: 5D                    -  pop ebp
""+6E0AA18: C2 10 00              -  ret 0010
""+6E0AA1B: 00 00                 -  add [eax],al
""+6E0AA1D: 00 00                 -  add [eax],al
""+6E0AA1F: 00 9C 02 84 00 00 00  -  add [edx+eax+00000084],bl
""+6E0AA26: 00 00                 -  add [eax],al
""+6E0AA28: 40                    -  inc eax
""+6E0AA29: 02 84 00 70 02 1D 05  -  add al,[eax+eax+051D0270]
// ---------- INJECTING HERE ----------
""+6E0AA30: 55                    -  push ebp
""+6E0AA31: 8B EC                 -  mov ebp,esp
""+6E0AA33: 57                    -  push edi
""+6E0AA34: 56                    -  push esi
// ---------- DONE INJECTING  ----------
""+6E0AA35: 53                    -  push ebx
""+6E0AA36: 83 EC 18              -  sub esp,18
""+6E0AA39: 8B F1                 -  mov esi,ecx
""+6E0AA3B: 8B FA                 -  mov edi,edx
""+6E0AA3D: 80 BE 50 01 00 00 00  -  cmp byte ptr [esi+00000150],00
""+6E0AA44: 0F 84 3D 03 00 00     -  je 06E0AD87
""+6E0AA4A: 80 BE 42 01 00 00 00  -  cmp byte ptr [esi+00000142],00
""+6E0AA51: 0F 84 21 03 00 00     -  je 06E0AD78
""+6E0AA57: 83 FF 10              -  cmp edi,10
""+6E0AA5A: 74 33                 -  je 06E0AA8F
}

 

И этот скрипт работает так, как я планировал (ну т.е. я получил неуязвимость ко всем вражеским объектам). Но я столкнулся с проблемами. Во-первых, в игре есть такой вражеский объект как "каменный кулак", который падает вниз, когда персонаж находится под этим кулаком. И когда этот кулак падает на персонажа при включенном скрипте неуязвимости, я не могу двигаться (но при этом сквозь шипы я могу спокойно проходить). Во-вторых, если перезапустить игру и попытаться активировать скрипт, то он не сработает (не активируется). Позже методом проб и ошибок я выяснил, что если хотя бы один раз умереть, то скрипт заработает. Почему так происходит? Как это починить? Правильно ли я сделал взлом? Есть ли в интернете подробные разборы того, как получить неуязвимость, когда персонаж умирает с одного удара, или как сделать так, чтобы персонаж проходил сквозь вражеские объекты?

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

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

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

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