SergBrNord Опубликовано 3 мая, 2017 Поделиться Опубликовано 3 мая, 2017 Всем опять и снова привед! Продолжаем мучать старенькую игрушку "Гарри Поттер и Философский камень" =) На сей раз чисто умозрительный вопрос по таймерам, использующихся на урока по обучению заклинаниям. Вот так это выглядит: Скрытый текст Ломаем таймер в нижнем углу. За таймер отвечают три значения: закрашивание полоски красным цветом, тип float, реализовано декрементацией (~14->0); скорость воспроизведения звука часов, тип float, реализовано декрементацией (~14->0); сам таймер, тип float, реализовано инкрементацией (0->~14). Окно обращений инструкций: Скрытый текст Во всех трёх инструкциях работа идёт с одним и тем же адресом; под адресу не структура, а значение. Листинг кода №1: Скрытый текст "Core.dll"+6D964: 8B 54 24 04 - mov edx,[esp+04] "Core.dll"+6D968: 8B 08 - mov ecx,[eax] "Core.dll"+6D96A: 89 0A - mov [edx],ecx "Core.dll"+6D96C: C2 08 00 - ret 0008 "Core.dll"+6D96F: 90 - nop "Core.dll"+6D970: 8B 49 34 - mov ecx,[ecx+34] "Core.dll"+6D973: 83 F9 01 - cmp ecx,01 "Core.dll"+6D976: 75 0F - jne Core.dll+6D987 "Core.dll"+6D978: 8B 44 24 08 - mov eax,[esp+08] "Core.dll"+6D97C: 8B 54 24 04 - mov edx,[esp+04] // ---------- INJECTING HERE ---------- "Core.dll"+6D980: 8B 08 - mov ecx,[eax] "Core.dll"+6D982: 89 0A - mov [edx],ecx "Core.dll"+6D984: C2 08 00 - ret 0008 // ---------- DONE INJECTING ---------- "Core.dll"+6D987: 85 C9 - test ecx,ecx "Core.dll"+6D989: 7E 0E - jle Core.dll+6D999 "Core.dll"+6D98B: 56 - push esi "Core.dll"+6D98C: 8B 74 24 0C - mov esi,[esp+0C] "Core.dll"+6D990: 57 - push edi "Core.dll"+6D991: 8B 7C 24 0C - mov edi,[esp+0C] "Core.dll"+6D995: F3 A5 - repe movsd "Core.dll"+6D997: 5F - pop edi "Core.dll"+6D998: 5E - pop esi "Core.dll"+6D999: C2 08 00 - ret 0008 Листинг кода №2 (инструкции рядом): Скрытый текст "Core.dll"+38D77: C7 44 24 10 00 00 00 00 - mov [esp+10],00000000 "Core.dll"+38D7F: 8D 4C 24 10 - lea ecx,[esp+10] "Core.dll"+38D83: 8A 10 - mov dl,[eax] "Core.dll"+38D85: 40 - inc eax "Core.dll"+38D86: 51 - push ecx "Core.dll"+38D87: 8B 4E 08 - mov ecx,[esi+08] "Core.dll"+38D8A: 56 - push esi "Core.dll"+38D8B: 89 46 0C - mov [esi+0C],eax "Core.dll"+38D8E: FF 14 95 68 55 1E 10 - call dword ptr [edx*4+Core.dll+E5568] "Core.dll"+38D95: D9 44 24 10 - fld dword ptr [esp+10] "Core.dll"+38D99: D8 07 - fadd dword ptr [edi] "Core.dll"+38D9B: 8B 46 0C - mov eax,[esi+0C] "Core.dll"+38D9E: 8B 54 24 14 - mov edx,[esp+14] "Core.dll"+38DA2: 40 - inc eax "Core.dll"+38DA3: 89 46 0C - mov [esi+0C],eax "Core.dll"+38DA6: D9 17 - fst dword ptr [edi] "Core.dll"+38DA8: D9 1A - fstp dword ptr [edx] "Core.dll"+38DAA: 5F - pop edi "Core.dll"+38DAB: 5E - pop esi "Core.dll"+38DAC: 59 - pop ecx "Core.dll"+38DAD: C2 08 00 - ret 0008 "Core.dll"+38DB0: 8B 0D 00 9A 1E 10 - mov ecx,[Core.dll+E9A00] И вопросы, которые меня мучают: Если писать скрипт, то, НЯП, надо работать со стеком, так как показывал srg91; т.е. заместить значение, вкладываемое инструкцией "fld dword ptr [esp+10]"? Если работать со стеком, что будет правильнее в использовании – просто положить в стеке значение сверху или вытолкнуть и затем положить своё? Как тут организовать фильтр? При заморозке адреса таймер, подсчёт очков начинает работать некорректно. Каким образом это может быть завязано на таймер? Как работает корректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра повторяет его движение и выставляет очки. Как работает некорректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра не повторяет движение, а соединяет две конечных точки. Вот так это выглядит: Скрытый текст Т.е. тут что-то вроде запоминания положения курсора в определённой точке относительно таймера? P.S. Игрушка сделана на Unreal Engine, может кого на мысль натолкнёт =) Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 3 мая, 2017 Поделиться Опубликовано 3 мая, 2017 (изменено) 2 часа назад, SergBrNord сказал: "Core.dll"+38D8E: FF 14 95 68 55 1E 10 - call dword ptr [edx*4+Core.dll+E5568] 2 часа назад, SergBrNord сказал: Если писать скрипт, то, НЯП, надо работать со стеком Отследи этот вызов, чтобы найти инструкцию которая кладет значение в [esp+10], которое перед этим рассчитывается и после выхода из функции кладется на вершину стека, тогда не придется работать со стеком. Core.dll+E5568 глобальная переменная это по любому виртуальная таблица, edx индекс. 2 часа назад, SergBrNord сказал: Unreal Engine Уфф, не знаю как в ГП, но в Dishonored много значений передавалось через стек и приходилось искать место где это значение появлялось перед укладкой в стек, иначе скрипт вызывал падения из-за ошибки доступа к памяти. 2 часа назад, SergBrNord сказал: При заморозке адреса таймер, подсчёт очков начинает работать некор Цикл от минимального значения до максимального, чтобы значение плавно перетекало в то которое тебе нужно, тогда и расчет должен быть корректным. Либо, забей вообще на подсчет очков и просто найди проверку, при которой тебе будет открываться заклинание, чтобы её найти ищи количество очков, от которых можно будет оттолкнуться, наверняка найдешь и формулу которая рассчитывает очки.. Ps возможно мои подсказки будут не верны т.к в любой непонятной ситуации я начинаю реверсить код, вместо поиска других значений. Изменено 3 мая, 2017 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 4 мая, 2017 Поделиться Опубликовано 4 мая, 2017 3 часа назад, partoftheworlD сказал: в любой непонятной ситуации я начинаю реверсить код Я думаю, что все так делают (или пытаются делать ). 5 часов назад, SergBrNord сказал: Как работает корректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра повторяет его движение и выставляет очки. Как работает некорректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра не повторяет движение, а соединяет две конечных точки. Если уж так долго копаться в игрушке, то я бы выходил, на этот прыжок и правил бы его, чтобы: 5 часов назад, SergBrNord сказал: игра повторяла его движение и выставляла очки. в любом случае - накосячил Гарри или нет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения