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

[Serious Sam 4] телепорт в точку прицеливания


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

Делаю разные виды телепорта в serious sam 4. Получилось написать телепорт к сохраненной точке, а вот при телепортации в место прицеливания происходит телепорт, затем через пару секунд вылет с игры(Код такой же, как телепорт в сохраненные координаты, за исключением подставления координат прицеливания). В чем может быть проблема?(3й день сижу над ней)

код(много букаф) :

Спойлер

{ Game   : Sam4.exe
  Version: 
  Date   : 2020-10-02
  Author : vlad

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(testnewtp,Sam4.exe,C3 CC CC CC 48 83 EC 28 48 8D 0D * * * * E8 C8 9E) // should be unique
alloc(newmem,$1000,"Sam4.exe"+BEE6F4)
alloc(store_coord,256)

label(code)
label(return)
label(xpos)
label(ypos)
label(zpos)
label(en_save)
label(en_load)
label(en_load_aim)
label(increasey)
label(incr)
label(save)
label(load)
label(popRDX)
label(load_aim)

registersymbol(en_load)
registersymbol(en_save)
registersymbol(en_load_aim)
registersymbol(xpos)
registersymbol(ypos)
registersymbol(zpos)
//место для сохранения координат
store_coord:
xpos:
dd 0
ypos:
dd 0
zpos:
dd 0

en_save:
dd 0
en_load:
dd 0
en_load_aim:
dd 0
//фильтр на проверку игрока и проверка флагов
newmem:
  push rdx
  mov rdx,[pbase]
  cmp rcx,rdx
  jne popRDX
  pop rdx
  cmp [en_save],1
  je save
  cmp [en_load],1
  je load
  cmp [en_load_aim],1
  je load_aim
  jmp code

popRDX:
  pop rdx
  jmp code
//сохранить координаты
save:
  mov [en_save],0
  push rdx
  mov rdx,[rcx+4c]
  mov [xpos],rdx
  mov rdx,[rcx+50]
  mov [ypos],rdx
  mov rdx,[rcx+54]
  mov [zpos],rdx
  pop rdx
  jmp code
//телепорт к созраненным координатам
load:
  mov [en_load],0
  push rdx
  mov rdx,[xpos]
  mov [rcx+4c],rdx
  mov rdx,[ypos]
  mov [rcx+50],rdx
  mov rdx,[zpos]
  mov [rcx+54],rdx
  pop rdx
  jmp code
//телепорт к координатам прицеливания(вылет с игры после телепорта)
load_aim:
  mov [en_load_aim],0
  push rdx
  mov rdx,[x_aim]
  mov [rcx+4c],rdx
  call increasey
  mov rdx,[z_aim]
  mov [rcx+54],rdx
  pop rdx
  jmp code
//увеличение y при телепорте в место прицеливания
increasey:
  movss xmm10,[y_aim]
  addss xmm10,[incr]
  movss [rcx+50],xmm10
  xorps xmm10,xmm10
  ret

code:
  ret 
  int 3 
  int 3 
  int 3 
  sub rsp,28
  jmp return

incr:
  dd (float)1

testnewtp:
  jmp newmem
  nop 3
return:
registersymbol(testnewtp)

[DISABLE]

testnewtp:
  db C3 CC CC CC 48 83 EC 28

unregistersymbol(testnewtp)
unregistersymbol(en_save)
unregistersymbol(en_load)
unregistersymbol(en_load_aim)
unregistersymbol(xpos)
unregistersymbol(ypos)
unregistersymbol(zpos)
dealloc(newmem)
dealloc(store_coord

{
// ORIGINAL CODE - INJECTION POINT: "Sam4.exe"+BEE6F4

"Sam4.exe"+BEE6C5: 41 0F 28 7B E0           -  movaps xmm7,[r11-20]
"Sam4.exe"+BEE6CA: 45 0F 28 43 D0           -  movaps xmm8,[r11-30]
"Sam4.exe"+BEE6CF: 45 0F 28 4B C0           -  movaps xmm9,[r11-40]
"Sam4.exe"+BEE6D4: 45 0F 28 53 B0           -  movaps xmm10,[r11-50]
"Sam4.exe"+BEE6D9: 45 0F 28 5B A0           -  movaps xmm11,[r11-60]
"Sam4.exe"+BEE6DE: 45 0F 28 63 90           -  movaps xmm12,[r11-70]
"Sam4.exe"+BEE6E3: 45 0F 28 6B 80           -  movaps xmm13,[r11-80]
"Sam4.exe"+BEE6E8: 45 0F 28 B3 70 FF FF FF  -  movaps xmm14,[r11-00000090]
"Sam4.exe"+BEE6F0: 49 8B E3                 -  mov rsp,r11
"Sam4.exe"+BEE6F3: 5D                       -  pop rbp
// ---------- INJECTING HERE ----------
"Sam4.exe"+BEE6F4: C3                       -  ret 
"Sam4.exe"+BEE6F5: CC                       -  int 3 
"Sam4.exe"+BEE6F6: CC                       -  int 3 
"Sam4.exe"+BEE6F7: CC                       -  int 3 
"Sam4.exe"+BEE6F8: 48 83 EC 28              -  sub rsp,28
// ---------- DONE INJECTING  ----------
"Sam4.exe"+BEE6FC: 48 8D 0D 5D 08 22 01     -  lea rcx,[Sam4.exe+1E0EF60]
"Sam4.exe"+BEE703: E8 C8 9E 4D 00           -  call Sam4.exe+10C85D0
"Sam4.exe"+BEE708: 48 83 C4 28              -  add rsp,28
"Sam4.exe"+BEE70C: C3                       -  ret 
"Sam4.exe"+BEE70D: CC                       -  int 3 
"Sam4.exe"+BEE70E: CC                       -  int 3 
"Sam4.exe"+BEE70F: CC                       -  int 3 
"Sam4.exe"+BEE710: 48 8B 01                 -  mov rax,[rcx]
"Sam4.exe"+BEE713: 83 61 60 FB              -  and dword ptr [rcx+60],-05
"Sam4.exe"+BEE717: 48 FF 60 38              -  jmp qword ptr [rax+38]
}

 

 

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

В 03.10.2020 в 10:18, Rest0rer сказал:

В чем может быть проблема?

Где объявление переменных x_aim, y_aim иz_aim? 
И откуда ты их берешь?
В другом скрипте?

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

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

Где объявление переменных x_aim, y_aim иz_aim? 
И откуда ты их берешь?
В другом скрипте?

Да, в другом.

Вот:

Спойлер

[ENABLE]

aobscanmodule(AimCoords,Sam4.exe,F2 0F 10 87 60 21 00 00) // should be unique
alloc(newmem,$1000,"Sam4.exe"+11EA1F)
alloc(store_aimcoords,24)

label(code)
label(return)
label(x_aim)
label(y_aim)
label(z_aim)
registersymbol(x_aim)
registersymbol(y_aim)
registersymbol(z_aim)

store_aimcoords:
x_aim:
dd 0
y_aim:
dd 0
z_aim:
dd 0

newmem:
push rbx
mov rbx,[rdi+00002160]
mov [x_aim],rbx
mov rbx,[rdi+00002164]
mov [y_aim],rbx
mov rbx,[rdi+00002168]
mov [z_aim],rbx
pop rbx
jmp code

code:
  movsd xmm0,[rdi+00002160]
  jmp return

AimCoords:
  jmp newmem
  nop 3
return:
registersymbol(AimCoords)

[DISABLE]

AimCoords:
  db F2 0F 10 87 60 21 00 00

unregistersymbol(AimCoords)
unregistersymbol(x_aim)
unregistersymbol(y_aim)
unregistersymbol(z_aim)
dealloc(newmem)
dealloc(store_aimcoords)

 

 

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

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

Да, в другом.

Попробуй сделать без call:

Спойлер

load_aim:
  mov [en_load_aim],0
  push rdx
  mov rdx,[x_aim]
  mov [rcx+4c],rdx
  movss xmm10,[y_aim]
  addss xmm10,[incr]
  movss [rcx+50],xmm10
  xorps xmm10,xmm10
  mov rdx,[z_aim]
  mov [rcx+54],rdx
  pop rdx
  jmp code

 

отпишись

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

В 03.10.2020 в 10:18, Rest0rer сказал:

increasey:

И вопрос - для чего тебе эта функция? Если для подъема на высоту. то ее лучше писать отдельно.

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

4 часа назад, Garik66 сказал:

И вопрос - для чего тебе эта функция? Если для подъема на высоту. то ее лучше писать отдельно.

Функция для того чтобы при восстановлении координат увеличить Y, чтобы не провалиться под карту.

Я пробовал без нее, вообще не увеличивая, проблема такая-же.

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

Может быть координаты прицела записываются слишком далеко в памяти или что то типа такого?

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

4 часа назад, Garik66 сказал:

Попробуй сделать без call:

  Показать контент


load_aim:
  mov [en_load_aim],0
  push rdx
  mov rdx,[x_aim]
  mov [rcx+4c],rdx
  movss xmm10,[y_aim]
  addss xmm10,[incr]
  movss [rcx+50],xmm10
  xorps xmm10,xmm10
  mov rdx,[z_aim]
  mov [rcx+54],rdx
  pop rdx
  jmp code

 

отпишись

Краш

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

15 минут назад, Rest0rer сказал:

Краш

а ...

подожди а почему ты не разово записываешь координаты прицела?

у тебя же постоянно значение меняется

 

 

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

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

проверяй что у тебя в  x_aim, y_aim иz_aim. 

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

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

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

а ...

подожди а почему ты не разово записываешь координаты прицела?

у тебя же постоянно значение меняется

 

 

Упс, а это влияет как то? 

 

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

7 минут назад, Rest0rer сказал:

А можно как то быстро узнать на какой инструкции происходит краш?

бряк ставить нужно и пошагово смотреть

 

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

Можно установить бряк, перед инструкцией на которую делается инжект. Затем активировать скрипт телепорта  и клавишей F7 двигаться по коду.

Еще можно перейти на FPU иструкции и избавиться от CALL.

Еще смотреть на значение RSP.

 

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

10 минут назад, Rest0rer сказал:

А можно как то быстро узнать на какой инструкции происходит краш?

а координаты и координаты прицела в одном типе

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

На метро я делал что то типа такого!

Спойлер

loadcrosshaircoordinatehook:
mov rax,[rbx + 1B58h]    // загружка значения координат в пределах карты
mov [loadmaxaddr],eax   // загружаем его... что бы в некуда не улететь
mov edx,[rbx + 1B30h]  // далее загружаем коориднаты прицела
mov [crosshairX],edx
mov edx,[rbx + 1B34h]
mov [crosshairY],edx
mov edx,[rbx + 1B38h]
mov [crosshairZ],edx
mov rax,[rbx]  // оригинал код....
lea rdx,[rsp + 20h + 8]
ret
pointerplayercoordinatehook:
movss [rax + 18h],xmm0 
sub rax,30h 
mov [loadaddrpointer],rax   // поинтер - проще говоря фильтр
mov eax,[rbx + 0Ch]
ret
baseplatercoordinatehook:
cmp [loadaddrpointer],rcx  // смотрим ровно ли - перс или нет
jne @f
movss xmm0,[loadmaxaddr]  // проверям координаты прицела с максимально допустимым расстоянием
comiss xmm0,[maxaddr]    // если всё норм то под флаг
je @f
cmp [enableteleport],0  // ну и сам флаг на запись данных в коориднаны персонажа
jz @f
mov eax,[crosshairX]
mov [rcx + 40h],eax
mov eax,[crosshairY]
mov [rcx + 44h],eax
mov eax,[crosshairZ]
mov [rcx + 48h],eax
@@:
mov eax,[rcx + 48h]  // оригинал
mov [rcx + F8h],eax
ret

 

Зачем загружал максимально допустимое значение ? Хм.... игры разные... у меня перс улетал просто в некуда - это если без них! В другой игре к примеру, если улететь так же в не куда, она просто зависала и вылетала. 

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

1 час назад, LIRW сказал:

На метро я делал что то типа такого!

  Скрыть контент


loadcrosshaircoordinatehook:
mov rax,[rbx + 1B58h]    // загружка значения координат в пределах карты
mov [loadmaxaddr],eax   // загружаем его... что бы в некуда не улететь
mov edx,[rbx + 1B30h]  // далее загружаем коориднаты прицела
mov [crosshairX],edx
mov edx,[rbx + 1B34h]
mov [crosshairY],edx
mov edx,[rbx + 1B38h]
mov [crosshairZ],edx
mov rax,[rbx]  // оригинал код....
lea rdx,[rsp + 20h + 8]
ret
pointerplayercoordinatehook:
movss [rax + 18h],xmm0 
sub rax,30h 
mov [loadaddrpointer],rax   // поинтер - проще говоря фильтр
mov eax,[rbx + 0Ch]
ret
baseplatercoordinatehook:
cmp [loadaddrpointer],rcx  // смотрим ровно ли - перс или нет
jne @f
movss xmm0,[loadmaxaddr]  // проверям координаты прицела с максимально допустимым расстоянием
comiss xmm0,[maxaddr]    // если всё норм то под флаг
je @f
cmp [enableteleport],0  // ну и сам флаг на запись данных в коориднаны персонажа
jz @f
mov eax,[crosshairX]
mov [rcx + 40h],eax
mov eax,[crosshairY]
mov [rcx + 44h],eax
mov eax,[crosshairZ]
mov [rcx + 48h],eax
@@:
mov eax,[rcx + 48h]  // оригинал
mov [rcx + F8h],eax
ret

 

Зачем загружал максимально допустимое значение ? Хм.... игры разные... у меня перс улетал просто в некуда - это если без них! В другой игре к примеру, если улететь так же в не куда, она просто зависала и вылетала. 

вроде загрузка, выгрузка такая же.. Завтра попробую все сначала сделать 

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

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

Пока что решение данной проблемы не найдено

если всё сделано верно, значит игре не нравится что-то ещё. Может стоит попробовать при телепорте сначала сохранять координаты прицеливания, потом изменять их и перемещаться на сохранённые?

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

6 часов назад, youneuoy сказал:

если всё сделано верно, значит игре не нравится что-то ещё. Может стоит попробовать при телепорте сначала сохранять координаты прицеливания, потом изменять их и перемещаться на сохранённые?

Тоже не прокатило

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

2 минуты назад, Rest0rer сказал:

Тоже не прокатило

Делись тогда самими координатами и координатами прицела.. у мня заработает.  Мне функция не нужна искать лень, по этому и спрашиваю.

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

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

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

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