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

[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

 

отпишись

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
33 минуты назад, Rest0rer сказал:

Вот:

ну что? без вылета?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 03.10.2020 в 10:18, Rest0rer сказал:

increasey:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Garik66 сказал:

ну что? без вылета?

я отъехал, чуть позже буду

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

 

отпишись

Краш

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, Rest0rer сказал:

Краш

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
15 минут назад, Rest0rer сказал:

Краш

а ...

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Garik66 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Garik66 сказал:

а ...

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

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

 

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, Rest0rer сказал:

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

 

хотя нет - ты же один раз читаешь - не - не должно влиять

 

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

 

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

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 04.10.2020 в 17:21, Garik66 сказал:

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

да

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 часов назад, Rest0rer сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, youneuoy сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Rest0rer сказал:

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

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

Поделиться сообщением


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

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

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

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