Egorka Опубликовано 26 августа, 2017 Поделиться Опубликовано 26 августа, 2017 Решил в игре получить невосприимчивость к вражеским объектам (неуязвимость). Но т.к. в этой игре умираешь с одного раза, то у меня возникли трудности. Сначала я пытался в интернете найти похожие запросы, но ничего, кроме уже готовых трейнеров/таблиц не увидел для других игр. Тогда я решил искать 4-байтное значение по признаку "изменилось/не изменилось". Однако таким образом я смог найти только время респа персонажа после смерти (оно длиться 1 секунду). Я предположил, что инструкция, работающая с этим таймером находится внутри подпрограммы, связанной со смертью персонажа. Значит необходимо посмотреть, что находится раньше вызова этой подпрограммы. Но ничего определенного я не нашел (там естественно было сравнение с условным переходом, но по моим наблюдениям этот условный переход всегда выполняется: и когда жив персонаж, и когда мертв): Скрытый текст Тогда я решил выполнить трассировку этой подпрограммы в случаях, когда персонаж жив и когда мертв, сравнить их и "проанализировать отличающиеся моменты" (хотя это слишком громкое заявление): Скрытый текст Посмотрев на инструкцию с адресом 0x20DAE917, решил узнать, что находится в ячейке памяти по адресу [eax+142]. А там первый байт как раз отвечает за жизнь (1 - жив, 0 - мертв). Ну а дальше поставил брейкпоинт на запись. Там 1-ая инструкция записывает 0 в ячеку памяти с жизнью, а 2-ая - 1. Ну я опять делаю предположение, что 1-ая инструкция находится в подпрограмме, отвечающей за смерть персонажа, выхожу на вызов этой подпрограммы, и ради прикола меняю условный переход на безусловный: Скрытый текст Ну и я получил бессмертие, но только для определенных вражеских предметов (шипы меня не убивали, но вот, например, лава для меня смертельна). Тогда я опять поставил брейкпоинт на запись для той же ячейки памяти, в которой находится жизнь персонажа, и выяснил, что эту подпрограмму вызывают еще в других местах. Единственное, что пришло мне в голову, это после вызова подпрограммы сразу написать инструкцию "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 } И этот скрипт работает так, как я планировал (ну т.е. я получил неуязвимость ко всем вражеским объектам). Но я столкнулся с проблемами. Во-первых, в игре есть такой вражеский объект как "каменный кулак", который падает вниз, когда персонаж находится под этим кулаком. И когда этот кулак падает на персонажа при включенном скрипте неуязвимости, я не могу двигаться (но при этом сквозь шипы я могу спокойно проходить). Во-вторых, если перезапустить игру и попытаться активировать скрипт, то он не сработает (не активируется). Позже методом проб и ошибок я выяснил, что если хотя бы один раз умереть, то скрипт заработает. Почему так происходит? Как это починить? Правильно ли я сделал взлом? Есть ли в интернете подробные разборы того, как получить неуязвимость, когда персонаж умирает с одного удара, или как сделать так, чтобы персонаж проходил сквозь вражеские объекты? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения