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

Изменить скорость передвижения персонажа (инструкция изм. координаты)


DarkPower2

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

Игра: Command and Conquer 3.

Указатель на координаты: найден. 

Там 3 адреса  на 1 координату которые зависят друг от друга...

В итоге я дошел до такой команды: movss [eax+0C],xmm1

В xmm1 и содержится координата. Полистав выше, в поисках кто и что пишет в xmm1, я нашел только: movss xmm1,[ebp-30]

Регистр ebp вроде бы негде не менялся, я взял регистр ebp, отнял от него 30 по хексу и добавил его в СЕ.

Получил в итоге статический адрес значение которого не совпадает с координатой (при попытки его заморозить игра вылетает, при просмотре что пишет туда игра зависает, так как много команд пишут туда...)

 

Помогите найти инструкцию изменения координаты, вот листинг от movss [eax+0C],xmm1 и выше...

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

movss xmm1,[ebp-30]
movss xmm0,[ebp-2C]
cmp byte ptr [ebx+000001C2],00
lea eax,[ebx+38]
movss xmm2,[eax+08]
movss [ebp-28],xmm2
je cnc3game.Debug::PostStaticInit+2302BB
lea eax,[ebx+000001B4]
movss xmm3,[eax]
movss [ebp-20],xmm3
movss xmm3,[eax+04]
movss [ebp-1C],xmm3
movss [ebp-18],xmm2
lea edi,[ebx+000001B4]
lea esi,[ebp-20]
movsd 
movsd 
movsd 
mov esi,[ebp-08]
mov byte ptr [ebx+000001C2],01
lea eax,[esi+78]
movss [eax+1C],xmm0
movss [eax+0C],xmm1
movss [eax+2C],xmm2

 

 

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

45 минуты назад, DarkPower2 сказал:

Помогите найти инструкцию изменения координаты

Скорее всего вот они все три координаты:

movss [eax+1C],xmm0
movss [eax+0C],xmm1
movss [eax+2C],xmm2

 

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

1 минуту назад, Garik66 сказал:

Скорее всего вот они все три координаты:


movss [eax+1C],xmm0
movss [eax+0C],xmm1
movss [eax+2C],xmm2

 

Да, это они, но где они изменяются, это меня интересует. То есть где меняется xmm1 к примеру.

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

Только что, DarkPower2 сказал:

Да, это они, но где они изменяются, это меня интересует.

Именно этими инструкциями и  меняются координаты, которые находятся в [eax+1C], [eax+0C] и [eax+2C]. А в xmm0 (и соответственно в других) лежит новое значение координат.

А что ты пишешь? Для чего искал координаты? Телепорт?

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

Только что, Garik66 сказал:

Именно этими инструкциями и  меняются координаты, которые находятся в [eax+1C], [eax+0C] и [eax+2C]. А в xmm0 (и соответственно в других) лежит новое значение координат.

А что ты пишешь? Для чего искал координаты? Телепорт?

Да я понимаю... Вот я и хочу как раз узнать где меняются новые координаты... Хочу ускорить моего персонажа.

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

4 минуты назад, DarkPower2 сказал:

Хочу ускорить моего персонажа.

Если в игре, есть замедители (например в воде ГГ идёт медленнее) или ускорители, которые ускоряют скорость, то можно поискать коэффициент.

А так, если копать реверсингом, т.е. выходить через инструкции, то тебе судя по выложенному тобой листингу, нужно копать ещё дальше, чем:

movss xmm1,[ebp-30]
movss xmm0,[ebp-2C]

Потому что здесь идёт просто пересылка координат, но не их расчёт. Т.е. тебе нужно искать инструкция откуда в [ebp-30] и т.д. попадают значения, причём не по еbp, а по конкретному адресу, так как регистр может и поменяться.

Короче попробуй сделать "Анализ структуры" например из этой инструкции:

 

movss xmm0,[ebp-2C]

Скорее всего в ней и будет лежать коэффициент ускорения. 

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

9 минут назад, Garik66 сказал:

Короче попробуй сделать "Анализ структуры" например из этой инструкции:

 


movss xmm0,[ebp-2C]

Скорее всего в ней и будет лежать коэффициент ускорения. 

Спасибо, попробую. Я обновил пост из другой темы (про чтение из несуществующего адреса).

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

9 минут назад, Garik66 сказал:

отому что здесь идёт просто пересылка координат, но не их расчёт. Т.е. тебе нужно искать инструкция откуда в [ebp-30] и т.д. попадают значения, причём не по еbp, а по конкретному адресу, так как регистр может и поменяться.

Вот только, почему в xmm1 (то что сверху) не совпадают координатами xmm1 (то что снизу)?

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

18 минуту назад, DarkPower2 сказал:

Вот только, почему в xmm1 (то что сверху) не совпадают координатами xmm1 (то что снизу)?

По выложенному тобой участку кода, это не понятно.

ЗЫ: Хотя может здесь происходит какое-то изменение:

lea edi,[ebx+000001B4]
lea esi,[ebp-20]
movsd 
movsd 
movsd 

Что такое - 386+ MOVSD Пересылка двойного слова из строки в строку
Команда аналогична командам МП 86 movsb и movsw, но позволяет скопировать двойное слово из строки, адресуемой через регистры DS:ESI, в строку, адресуемую через регистры ES:EDI.

3 MOVSD = 3 координаты. Наверное здесь.

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

23 минуты назад, Garik66 сказал:

По выложенному тобой участку кода, это не понятно.

Ну вот побольше сделал.

 

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

test eax,eax
mov [ebp+0C],eax
fild dword ptr [ebp+0C]
jnl cnc3game.Debug::PostStaticInit+23017D
fadd dword ptr [cnc3game.dat+62AE40]
fdivr dword ptr [cnc3game.dat+634448]
movss xmm1,[ebp+08]
comiss xmm1,[edi+40]
fstp dword ptr [ebp+0C]
jna cnc3game.Debug::PostStaticInit+2301AA
test byte ptr [edi+54],01
jne cnc3game.Debug::PostStaticInit+2301AA
push ebx
mov ecx,edi
call cnc3game.Debug::PostStaticInit+22F82A
fadd dword ptr [edi+40]
movss xmm1,[ebp+08]
fstp dword ptr [edi+40]
movss xmm0,[edi+40]
comiss xmm0,xmm1
jna cnc3game.Debug::PostStaticInit+2301C8
subss xmm0,[ebp-04]
comiss xmm1,xmm0
movss [edi+40],xmm0
jna cnc3game.Debug::PostStaticInit+2301C8
movss [edi+40],xmm1
movss xmm0,[esi]
mov ecx,[ebp+14]
test ecx,ecx
movss [ebp-30],xmm0
movss xmm0,[esi+04]
movss [ebp-2C],xmm0
movss xmm0,[esi+08]
movss [ebp-28],xmm0
movss xmm0,[edi+40]
movss [ebp+08],xmm0
je cnc3game.Debug::PostStaticInit+230380
cmp byte ptr [ecx+0E],00
je cnc3game.Debug::PostStaticInit+23020C
xorps xmm0,xmm0
movss [edi+40],xmm0
mov byte ptr [ecx+0E],00
inc [ecx]
push edi
lea eax,[ebp-24]
push eax
call cnc3game.Debug::PostStaticInit+2F38F6
mov esi,eax
lea edi,[ebp-4C]
movsd 
movsd 
movsd 
movsd 
lea esi,[ebp-48]
lea edi,[ebp-30]
movsd 
movsd 
movsd 
mov esi,[ebp-08]
push 01
push ecx
fld dword ptr [esi+40]
mov ecx,[ebp+14]
lea eax,[ebp-30]
fstp dword ptr [esp]
push eax
call cnc3game.Debug::PostStaticInit+30E788
mov ecx,[ebp+14]
push esi
lea eax,[ebp-24]
push eax
call cnc3game.Debug::PostStaticInit+2F38F6
mov ecx,[ebp+14]
mov esi,eax
mov eax,[ecx]
test eax,eax
lea edi,[ebp-4C]
movsd 
movsd 
movsd 
movsd 
je cnc3game.Debug::PostStaticInit+230264
dec eax
mov [ecx],eax
movss xmm0,[ebp-48]
movss [ebp-20],xmm0
movss xmm0,[ebp-44]
movss [ebp-1C],xmm0
movss xmm0,[ebp-40]
movss [ebp-18],xmm0
lea edi,[ebx+000001B4]
lea esi,[ebp-20]
movsd 
movsd 
mov byte ptr [ebx+000001C2],01
movsd 
movss xmm1,[ebp-30] //этот xmm1 не совпадает
movss xmm0,[ebp-2C]
cmp byte ptr [ebx+000001C2],00
lea eax,[ebx+38]
movss xmm2,[eax+08]
movss [ebp-28],xmm2
je cnc3game.Debug::PostStaticInit+2302BB
lea eax,[ebx+000001B4]
movss xmm3,[eax]
movss [ebp-20],xmm3
movss xmm3,[eax+04]
movss [ebp-1C],xmm3
movss [ebp-18],xmm2
lea edi,[ebx+000001B4]
lea esi,[ebp-20]
movsd 
movsd 
movsd 
mov esi,[ebp-08]
mov byte ptr [ebx+000001C2],01
lea eax,[esi+78]
movss [eax+1C],xmm0
movss [eax+0C],xmm1 //xmm1 не совпадает с вот этим
movss [eax+2C],xmm2

 

 

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

3 минуты назад, DarkPower2 сказал:

Ну вот побольше сделал.

Прячь в спойлер, слишком большой код. На сегодня попрощаюсь - у меня уже 1.03 ночи.

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

9 часов назад, Garik66 сказал:

 


lea edi,[ebx+000001B4]
lea esi,[ebp-20]
movsd 
movsd 
movsd 

позволяет скопировать двойное слово из строки, адресуемой через регистры DS:ESI, в строку, адресуемую через регистры ES:EDI.

3 MOVSD = 3 координаты. Наверное здесь.

Как то странно, 3 раза копирует одно и тоже в edi.

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

23 минуты назад, DarkPower2 сказал:

Как то странно, 3 раза копирует одно и тоже в edi.

Не одно и тоже и не в одно и тоже место, а в edi и esi лежат указатели и запись происходит так:

lea edi,[ebx+000001B4]
lea esi,[ebp-20]
movsd 
// значение из [esi] переписывается в [edi]
movsd 
// значение из [esi+04] переписывается в [edi+04]
movsd 
// значение из [esi+08] переписывается в [edi+08]

Соответственно тебе скорее всего нужно копать по адресу esi, потому что там лежит новое значение координат, а перед этим оно как то рассчитывается. 

 

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

19 минуту назад, DarkPower2 сказал:

Вот оно как, не понятное описанее было.

Я только предполагаю что 

movsd 

работает именно так. Для того, чтобы убедиться в этом, нужно написать скрипт и проверить работу этого опкода. (Могу написать, представляю как это сделать, но времени нет).

22 минуты назад, DarkPower2 сказал:

Вот только они же не влияют на  xmm1, или же я ошибкюсь?

Я тоже этого не знаю, но предполагаю, что влияет, это тоже нужно исследовать, посмотреть, что произойдёт с регистрами FPU при выполнении опкода  

movsd 

Как отслеживать регистры FPU немного есть на видео в этом сообщении

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

46 минуты назад, Garik66 сказал:

Я только предполагаю что 

так и есть

46 минуты назад, Garik66 сказал:

Я тоже этого не знаю, но предполагаю, что влияет, это тоже нужно исследовать, посмотреть, что произойдёт с регистрами FPU при выполнении опкода  

xmm это sse, не влияет

 

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

34 минуты назад, gmz сказал:

так и есть

Да уже убедился - написал скрипт, проверил, что это так и записал видео.

Скрипт:

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

{ Game   : Tutorial-i386.exe
  Version: 
  Date   : 2016-04-07
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(Primer,Tutorial-i386.exe,89 83 80 04 00 00 8D 55 D4 E8 52) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(RegistrESI)
label(RegistrEDI)
registersymbol(RegistrESI)
registersymbol(RegistrEDI)
registersymbol(Primer)

newmem:
  push esi
  push edi
  lea edi,[RegistrEDI]
  lea esi,[RegistrESI]
  movsd
  movsd
  movsd

code:
  pop edi
  pop esi
  mov [ebx+00000480],eax
  jmp return

RegistrESI:
db 11 11 11 11 22 22 22 22 33 33 33 33
RegistrEDI:
db 0

Primer:
  jmp newmem
  nop
return:

[DISABLE]
Primer:
  db 89 83 80 04 00 00

unregistersymbol(RegistrESI)
unregistersymbol(RegistrEDI)
unregistersymbol(Primer)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23920

"Tutorial-i386.exe"+238FC: E8 0F 9B FE FF        -  call Tutorial-i386.exe+D410
"Tutorial-i386.exe"+23901: E8 1A B6 FE FF        -  call Tutorial-i386.exe+EF20
"Tutorial-i386.exe"+23906: 50                    -  push eax
"Tutorial-i386.exe"+23907: 85 C0                 -  test eax,eax
"Tutorial-i386.exe"+23909: 75 65                 -  jne Tutorial-i386.exe+23970
"Tutorial-i386.exe"+2390B: B8 05 00 00 00        -  mov eax,00000005
"Tutorial-i386.exe"+23910: E8 5B AD FE FF        -  call Tutorial-i386.exe+E670
"Tutorial-i386.exe"+23915: 8D 50 01              -  lea edx,[eax+01]
"Tutorial-i386.exe"+23918: 8B 83 80 04 00 00     -  mov eax,[ebx+00000480]
"Tutorial-i386.exe"+2391E: 29 D0                 -  sub eax,edx
// ---------- INJECTING HERE ----------
"Tutorial-i386.exe"+23920: 89 83 80 04 00 00     -  mov [ebx+00000480],eax
// ---------- DONE INJECTING  ----------
"Tutorial-i386.exe"+23926: 8D 55 D4              -  lea edx,[ebp-2C]
"Tutorial-i386.exe"+23929: E8 52 68 01 00        -  call Tutorial-i386.exe+3A180
"Tutorial-i386.exe"+2392E: 8B 55 D4              -  mov edx,[ebp-2C]
"Tutorial-i386.exe"+23931: 8B 83 6C 04 00 00     -  mov eax,[ebx+0000046C]
"Tutorial-i386.exe"+23937: E8 D4 DA 06 00        -  call Tutorial-i386.exe+91410
"Tutorial-i386.exe"+2393C: 83 BB 80 04 00 00 00  -  cmp dword ptr [ebx+00000480],00
"Tutorial-i386.exe"+23943: 7D 2B                 -  jnl Tutorial-i386.exe+23970
"Tutorial-i386.exe"+23945: A1 C4 F1 54 00        -  mov eax,[Tutorial-i386.exe+14F1C4]
"Tutorial-i386.exe"+2394A: E8 A1 29 0F 00        -  call Tutorial-i386.exe+1162F0
"Tutorial-i386.exe"+2394F: B8 64 00 00 00        -  mov eax,00000064
}

 

Видео (странно вроде уже обработано, наверное идёт какая-нибудь промодерация):

 

 

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

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

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

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