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

Как добавить Многоуровневый указатель в Авто Ассемблер?


TheErel

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

Здравствуйте, столкнулся с тем что мне нужно использовать указатель в АА,  если делать push,pop всё работает но когда я перемещаюсь по локациям в игре происходит краш. Поэтому нужно как-то загрузить указатель в символ без пуша.

Вот пример кода.  

 

Спойлер
define(address,"UnityPlayer.dll"+1459FB0)
define(bytes,8B 02 89 41 20 8B 42 04 89 41 24 8B 42 08 89 41 28 8B 42 0C 89 41 2C 8B 42 10 89 41 30 8B 42 14 89 41 34 8B 42 18 89 41 38 48 8B 49 08 48 85 C9 0F 85 2A 26 01 00 C3)

[ENABLE]

assert(address,bytes)
alloc(newmem,$1000,"UnityPlayer.dll"+1459FB0)

label(code)
label(return)
label(spawnX)
label(spawnY)
label(spawnZ)
label(playerBase)
registersymbol(playerBase)
registersymbol(spawnX)
registersymbol(spawnY)
registersymbol(spawnZ)

newmem:

code:
push rbp
mov rbp,["UserAssembly.dll"+0ADF1498]
cmp rbp,0
je return
mov rbp,[rbp+A0]
cmp rbp,0
je return
mov rbp,[rbp+0]
cmp rbp,0
je return
mov rbp,[rbp+F8]
cmp rbp,0
je return
mov rbp,[rbp+2D8]
cmp rbp,0
je return
mov rbp,[rbp+10]
cmp rbp,0
je return
mov rbp,[rbp+68]
cmp rbp,0
je return
mov rbp,[rbp+70]
cmp rbp,0
je return
mov [playerBase],rbp
cmp [playerBase],0
je return
cmp rcx,[playerBase]
je return
mov eax,[rdx]
mov [rcx+20],eax
mov eax,[rdx+04]
mov [rcx+24],eax
mov eax,[rdx+08]
mov [rcx+28],eax
mov eax,[rdx+0C]
mov [rcx+2C],eax
mov eax,[rdx+10]
mov [rcx+30],eax
mov eax,[rdx+14]
mov [rcx+34],eax
mov eax,[rdx+18]
mov [rcx+38],eax
mov rcx,[rcx+08]
test rcx,rcx
nop
nop
nop
nop
nop
nop
ret

playerBase:
dd 0
spawnX:
dd (float)1.0
spawnY:
dd (float)0.5
spawnZ:
dd (float)2.7


address:
  jmp newmem
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
return:

[DISABLE]

address:
  db bytes

dealloc(*)
unregistersymbol(*)

 


Было бы хорошо делать как-то так: 
[[[[[[["UserAssembly.dll"+0ADF1498]+A0]+0]+F8]+2D8]+10]+68]+70 но не знаю как сделать.

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

Это не подходит, я же показывал код, я делаю так же только с проверкой, можно и без нее, сути не меняет. Я попробовал так же как вы предложили. Это не помогает игра крашит, он работает как и мой код но если телепорт то краш, если бы оно не загружало в регистр который вроде как пустой но при телепорте он наверное заполняется, игра вылетает.

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

Так используй другой регистр, в чем проблема? Скорее всего, при перемещении по локациям у тебя проблема в том, что адрес, который ты сохранил ранее, используется чем-то другим. Или через эту инструкцию проскакивает что-то еще. Впрочем, без игры сложно утверждать.

 

UPDATE: Елки-палки, ты зачем rbp используешь??? rbp и rsp - служебные регистры, используемые для указания на вершину стека и базовый поинтер для текущего метода. Никогда не используй эти регистры.

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

8 минут назад, Xipho сказал:

Так используй другой регистр, в чем проблема? Скорее всего, при перемещении по локациям у тебя проблема в том, что адрес, который ты сохранил ранее, используется чем-то другим. Или через эту инструкцию проскакивает что-то еще. Впрочем, без игры сложно утверждать.

 

UPDATE: Елки-палки, ты зачем rbp используешь??? rbp и rsp - служебные регистры, используемые для указания на вершину стека и базовый поинтер для текущего метода. Никогда не используй эти регистры.

Это был пустой регистр, все остальные заняты. 
Игра Геншин Импакт. 
Вот скрин регистров 
mov [rcx+30],eax - rcx+30 координата Х в еах находится тоже координата Х
spacer.png

Какой тогда регистр использовать? Благодарю что отвечаете на вопрос. Я бы хотел не выключать каждый раз функцию при перемещении из локации в локацию.

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

Как я думаю, краш происходит в момент выполнения "mov rbp,["UserAssembly.dll"+0ADF1498]" инструкции. Либо далее, где происходит подобная попытка считывания возможного невалидного адреса в регистр. Адреса, у которого значение ????.

"cmp rbp,0" - проверяет значении на наличие указателя уже после краша.

Когда-то давно я сталкивался с подобной проблемой. Но не помню как решил.

push rbp
mov rbp,["UserAssembly.dll"+0ADF1498]
cmp rbp,0
Ссылка на комментарий
Поделиться на другие сайты

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

Как я думаю, краш происходит в момент выполнения "mov rbp,["UserAssembly.dll"+0ADF1498]" инструкции. Либо далее, где происходит подобная попытка считывания возможного невалидного адреса в регистр. Адреса, у которого значение ????.

"cmp rbp,0" - проверяет значении на наличие указателя уже после краша.

Когда-то давно я сталкивался с подобной проблемой. Но не помню как решил.

push rbp
mov rbp,["UserAssembly.dll"+0ADF1498]
cmp rbp,0

Да, в момент ТП происходит это ??? но как исправить то это?)

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

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

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

8 часов назад, TheErel сказал:

Вот пример кода.  

У меня вопрос:  
Зачем  взято  под  инъекцию столько  байт?

Если бы было с логами, то было бы более понятно, может там  где то краш игры  и происходит. (к примеру прыжок  какой нить попал в инъекцию и т.д.)  

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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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