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

Таймер как значение регистра


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

Всем опять и снова привед!

Продолжаем мучать старенькую игрушку "Гарри Поттер и Философский камень" =)

 

На сей раз чисто умозрительный вопрос по таймерам, использующихся на урока по обучению заклинаниям.

Вот так это выглядит:

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

8594833.jpg

 

Ломаем таймер в нижнем углу. За таймер отвечают три значения: 

  • закрашивание полоски красным цветом, тип float, реализовано декрементацией (~14->0);
  • скорость воспроизведения звука часов, тип float, реализовано декрементацией (~14->0);
  • сам таймер, тип float, реализовано инкрементацией (0->~14).

 

Окно обращений инструкций:

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

8600977.jpg

 

8597905.jpg

 

Во всех трёх инструкциях работа идёт с одним и тем же адресом; под адресу не структура, а значение.

 

Листинг кода №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]

 

 

И вопросы, которые меня мучают:

  1. Если писать скрипт, то, НЯП, надо работать со стеком, так как показывал srg91; т.е. заместить значение, вкладываемое инструкцией "fld dword ptr [esp+10]"?
  2. Если работать со стеком, что будет правильнее в использовании – просто положить в стеке значение сверху или вытолкнуть и затем положить своё?
  3. Как тут организовать фильтр?
  4. При заморозке адреса таймер, подсчёт очков начинает работать некорректно. Каким образом это может быть завязано на таймер?

 

Как работает корректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра повторяет его движение и выставляет очки.

Как работает некорректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра не повторяет движение, а соединяет две конечных точки.

 

Вот так это выглядит:

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

8588689.jpg

Т.е. тут что-то вроде запоминания положения курсора в определённой точке относительно таймера?

 

P.S.

Игрушка сделана на Unreal Engine, может кого на мысль натолкнёт =)

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

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 возможно мои подсказки будут не верны т.к в любой непонятной ситуации я начинаю реверсить код, вместо поиска других значений.:D

 

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

3 часа назад, partoftheworlD сказал:

в любой непонятной ситуации я начинаю реверсить код

Я думаю, что все так делают (или пытаются делать ;)).

5 часов назад, SergBrNord сказал:

Как работает корректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра повторяет его движение и выставляет очки.

Как работает некорректный подсчёт – игрок рисует изображение по контуру мышкой, не открывая ЛКМ до завершения, а затем игра не повторяет движение, а соединяет две конечных точки.

Если уж так долго копаться в игрушке, то я бы выходил, на этот прыжок  и правил бы его, чтобы:

 

5 часов назад, SergBrNord сказал:

игра повторяла его движение и выставляла очки.

 в любом случае - накосячил Гарри или нет.

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

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

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

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