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

[CE] Вопрос по возврату значения в [DISABLE]


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

Ребят, у меня такой вопрос:

К примеру есть инжект на кусок кода не связанный с изменяемой частью. К примеру я нашел место где код обращается к инвентарю персонажа, через который легко получить доступ к экипированному оружию. И я захотел поменять у этого оружия какие-то статы, но, при отключении, мне нужно восстановить статы у оржия. Как вы понимаете, сам код этого не сделает, потому как работает он с инвентарем. И я не могу допереть как правильно засунуть в конструкцию [DISABLE] мой код (так как надо вернуть данные при отключении скрипта), и вообще можно ли такое делать? Если нет, то как в таких случаях обходить данный кейс. Я понимаю, что можно найти непосредственно тот участок памяти, который работает со статой оружия, но вопрос касается именно такого кейса.

Пример кода:
 

Спойлер

[ENABLE]
  ********
newmem:
  push rdi
  mov rdi,[rсx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+13c],#9999
@@:
  pop rdi
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

return:

[DISABLE]
 ********

 

 

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

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

Спойлер

[ENABLE]

label(savedadr)


newmem:
  push rdi
  mov rdi,[rсx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  lea rdi,[rdi+13c] //
  mov [rdi],#9999
  mov [savedadr],rdi //сохранение адреса в котором нужно восстановить
@@:
  pop rdi
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

savedadr:
dq 0 //dq или dd, 64 или 32 бит

return:

[DISABLE]
[savedadr]: //Это делать до dealloc
dd #200 //dd или dq или db или dw твоё значение

 

 

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

6 минут назад, imaginary сказал:

Нужно создать метку, сохранить туда адрес того что нужно потом восстановить

спасибо, попробую, правда у меня в rdi структура а не значение одного поля, получается в данном примере что в savedadr полетит целая структура и потом как-то надо будет обращаться к ее св-ам для изменения значений. Я вижу что ты изменил код и через lea прокидываешь в rdi только значение. Но если к примеру в коде будет 10 изменяемых значений? Тут запаришься создать метки :D

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

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

Обращайся так же, по моему работает

интересная конструкция, сейчас попробую. В любом случае больше спасибо, жаль нет возможности лайк влепить 

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

@imaginary пока сплошные краши даже с банальным первым примером.... краш возникает при выключении скрипта. 

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

ЗЗЫ. если unregistersymbol(SUPER_WPN) переместить над [savedadr]: то игра крашиться сразу при включении скрипта %) Что-то я совсем запутался

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)

label(savedadr)
label(code)
label(return)
registersymbol(SUPER_WPN)

newmem:
  push rbx
  push rdi
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  lea rdi,[rdi+140]
  mov [rdi],#9999
  mov [savedadr],rdi
@@:
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

savedadr:
  dd 0

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)
[savedadr]:
  dd 1
dealloc(newmem)

 

 

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

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

А какой скрипт у тебя не портит игру?

Вот весь скрипт, который работает как нужно, но при отключении как ты понимаешь нифига не восстанавливает

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)

label(code)
label(return)
registersymbol(SUPER_WPN)

newmem:
  push rbx
  push rdi
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov [rdi+13c],#9999
  mov [rdi+140],#9999
@@:
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)
dealloc(newmem)

 

 

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

И по факту мне нужно запихнуть куда-то весь RDI чтобы при отключении восстановить значения что под спойлером, но он будет расширяться, так как перс носит несколько оружий в слотах, для этого и используется rbx

Спойлер

  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov [rdi+13c],#9999
  mov [rdi+140],#9999

 

 

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

Тогда попробуй

 

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)

label(code)
label(return)
label(saveaddr) ///
registersymbol(SUPER_WPN)

newmem:
  push rbx
  push rdi
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov [saveaddr],rdi ///
  mov [rdi+13c],#9999
  mov [rdi+140],#9999
@@:
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

saveaddr: ///
dq 0

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
[saveaddr]+13c: ///
dd 0
[saveaddr]+140: ///
dd 0

SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)
dealloc(newmem)

 


И почему ты используешь dd, ведь тут 8 байт регистр

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

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

Тогда попробуй

да, я так пробовал уже писать, но он говорит, что не весь код инжектебельный(какое интересное слово я придумал) и что адрес [saveaddr]+13c не валидный. Сейчас скопипастил твой код и проверил еще раз, ничего не изменилось, выплевывает ошибку

 

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

Не могу проверить это у себя, можешь попробовать зарегистрировать с помощью registersymbol(saveaddr), если нет, то останется только lua, но всё и так должно работать.

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

Сделал регу, в итоге весь код выглядит так:

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)

label(code)
label(return)
label(saveaddr) ///
registersymbol(SUPER_WPN)
registersymbol(saveaddr)

newmem:
  push rbx
  push rdi
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov [saveaddr],rdi ///
  mov [rdi+13c],#9999
  mov [rdi+140],#9999
@@:
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

saveaddr: ///
dq 0

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
[saveaddr]+13c: ///
  dd 0
[saveaddr]+140: ///
  dd 0

SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)
unregistersymbol(saveaddr)
dealloc(newmem)

 

но все равно кроет матом http://skrinshoter.ru/s/210820/ZsCTD0zo?a

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

42 минуты назад, FENIX145 сказал:

мне нужно запихнуть куда-то весь RDI чтобы при отключении восстановить значения

 

мне кажеться  здесь лучше применить команду  readmem .
readmem(address, size)
можно сразу  сохранить весь участок  патмяти  структуры  за один шаг , а потом так же  его вернуть обратно .

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

30 минут назад, Alex2411 сказал:

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

? вот это прям не плохо, чуть позже попробую, только не совсем понятно. readmem я так понял позволяет считать с уже записанного адреса (судя по названию метода) а как записать тогда? Если можно - маленький примерчик, буду признателен

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

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

мне кажеться  здесь лучше применить команду  readmem .

Посмотрел как написал пример Dark Byte и что-то оно не завелось у меня 

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)

label(code)
label(return)
registersymbol(SUPER_WPN)
registersymbol(SAVED_ADDR)

newmem:
  push rbx
  push rdi
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov [SAVED_ADDR],rdi
  Readmem(SAVED_ADDR,64)
  mov rdi,[rdi+18]
  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov [rdi+13c],#9999
  mov [rdi+140],#9999
@@:
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

SAVED_ADDR:
  dq 0

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
SAVED_ADDR:
  Readmem(SAVED_ADDR,64)
unregistersymbol(SAVED_ADDR)

SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)

dealloc(newmem)

 

что не так делаю?

ЗЫ. Ошибка Invalid addres for ReadMem на первом его вызове

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

54 минуты назад, FENIX145 сказал:

Если можно - маленький примерчик, буду признателен

 

примерно такое

 

[ENABLE]

alloc(original_wpn,4096)

original_wpn:
readmem(weapon,4096)

[DISABLE]

weapon:
readmem(original_wpn,4096)

dealloc(original_wpn)

сперва выделить  память original_wpn  сколько нужно  например 4096. потом туда записать  что надо сохранить  от адреса структуры  weapon . возврат значенией  то же , но наоборот  записываешь из  выделенной памяьти  обратно  в weapon .  не забудь  символы зарегить .

 

 

 

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

12 минут назад, FENIX145 сказал:

осмотрел как написал пример Dark Byte и что-то оно не завелось у меня

Это для твоих нужд не подходит, потому что readmem это команда для CE, а не ассемблера, выполняется один раз в [ENABLE], или [DISABLE]

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

Да тут вариантов много... Писать на прямую в рег... либо пиши через флаг.. либо смотреть над :) 

Спойлер

[ENABLE]
  ********
  newmem:
  
  cmp [xxxxxxxx],0
  jz .zzzz1
  cmp [xxxxxxxx],0
  jz .zzzz2
  jmp original
  
  .zzzz1:
  push rdi
  mov rdi,[rсx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+13c],#9999
  jmp original
  
  .zzzz2:
  push rdi
  mov rdi,[rсx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+13c], // сколько там оригинал то над ? 
  
  original:
  
  jmp ret
  
  

 

Думаю намек понятен.. Но нужна будет активация... Ну и получается... Если 0 к примеру  - то прыг делаем в .zzzzz2 и пишем туда автоматом (сколько над) а если 1 то пишем #9999 сам там настроишь... Я как пример показал.. Можно конечно и возврат сделать... Тот о котором ты пишешь.. то есть при отключении запишет туда что над и вырубится.  Можно писать самим флагом прям без всяких нулей...

[ENABLE]
.zzzzz1:
dd #9999
[DISABLE]
.zzzzz1:
dd # original

тут идей просто до крена как подобное провернуть.. 

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

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

тут идей просто до крена как подобное провернуть.. 

да в целом то как раз с @imaginary сделали рабочий вариант, теперь только нужно схранить значение до изменения и просто потом восстановить. Пытаюсь провернуть что-то подобное:

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)

label(code)
label(return)
registersymbol(SUPER_WPN)
registersymbol(SAVED_ADDR)
registersymbol(SAVED_VALUES)

newmem:
  push rbx
  push rdi
  push rdx
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov rdi,[rdi+18]
  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov rdx,[rdi+13c]
  mov [SAVED_VALUES],rdx
  mov [rdi+13c],#9999
  mov rdx,[rdi+140]
  mov [SAVED_VALUES+4],rdx
  mov [rdi+140],#9999
  mov [SAVED_ADDR],rdi
@@:
  pop rdx
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

SAVED_ADDR:
  dq 0
SAVED_VALUES:
  dd 0

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
[SAVED_ADDR]+13c:
  dd SAVED_VALUES
[SAVED_ADDR]+140:
  dd SAVED_VALUES+4
unregistersymbol(SAVED_ADDR)
unregistersymbol(SAVED_VALUES)

SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)

dealloc(newmem)

 

но пока мало что выходит, потому как при восстановлении хреначит огромное отрицательное число.... пробовал заменить с mov rdx,[rdi+13c] на lea  mov rdx,[rdi+13c] но никакой разницы.... в общем не хватает основ и знания судя по всему :(

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

Если сохранять, тогда можно использовать readmem при восстановлении, просто написать внизу readmem из памяти куда сохранены значения ассемблером. Вообще у тебя такая задача которая намного проще может быть написана на lua. Разбирайся сам лучше, материалов достаточно ?.

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

26 минут назад, Alex2411 сказал:

не забудь  символы зарегить

Спойлер

[ENABLE]

aobscanregion(SUPER_WPN, BoardHUD:Invalidate+615, BoardHUD:Invalidate+661, 48 8B 41 78 48 63 89 10 01 00 00) // should be unique
alloc(newmem,$1000,SUPER_WPN)
alloc(original_struct,4096)

label(code)
label(return)
registersymbol(SUPER_WPN)
registersymbol(SAVED_ADDR)

newmem:
  push rbx
  push rdi
  mov rbx,[rcx+78]
  mov rdi,[rbx+20]
  test rdi,rdi
  jz @F
  mov [SAVED_ADDR],rdi
  mov rdi,[rdi+18]
  mov [rdi+50],#1
  mov [rdi+78],#1
  mov [rdi+a0],#1
  mov [rdi+13c],#9999
  mov [rdi+140],#9999
@@:
  pop rdi
  pop rbx
code:
  mov rax,[rcx+78]
  movsxd rcx,dword ptr [rcx+00000110]
  jmp return

SAVED_ADDR:
  dq 0

original_struct:
  readmem(SAVED_ADDR,4096)

SUPER_WPN:
  jmp newmem
  nop 6
return:

[DISABLE]
SAVED_ADDR:
  readmem(SAVED_ADDR,4096)
unregistersymbol(SAVED_ADDR)

SUPER_WPN:
  db 48 8B 41 78 48 63 89 10 01 00 00
unregistersymbol(SUPER_WPN)

dealloc(original_struct)
dealloc(newmem)

 

память выделил, вроде все как надо передал, восстановил тоже как ты указал, но скрипт не активируется, пишет Invalid addres for ReadMem. В конструкции original_struct :( Чет у меня сегодня вообще нифига не получается, бесит прям. Казалось бы по логике - сохранить, изменить, восстановить. Несколько простейших операций, но нет 

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

25 минут назад, FENIX145 сказал:

скрипт не активируется, пишет Invalid addres for ReadMem. В конструкции original_struct

 

надо попробоавть зарегить  символ original_struct.
еще может быть что  readmem сначала читает  адрес SAVED_ADDR , а потом  ты туда  записываешь rdi . поэтому у тебя  адрес SAVED_ADDR для readmem будет  равно нулю и чит енжин ругается .

 

 

26 минут назад, FENIX145 сказал:

восстановил тоже как ты указал

 

 у тебя  в [DISABLE] написано

SAVED_ADDR:
  readmem(SAVED_ADDR,4096)

  сам в себя  записываеться память

 

 

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

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

Ребят, у меня такой вопрос

А обычный вариант с флагом, наподобие телепорта., т.е сохранить первоначальные значения. нужных адресов, потом записать что тебе нужно и перед отключением скрипта - восстановить, тебя не устроит? 

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

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

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

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