FENIX145 Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 (изменено) Ребят, у меня такой вопрос: К примеру есть инжект на кусок кода не связанный с изменяемой частью. К примеру я нашел место где код обращается к инвентарю персонажа, через который легко получить доступ к экипированному оружию. И я захотел поменять у этого оружия какие-то статы, но, при отключении, мне нужно восстановить статы у оржия. Как вы понимаете, сам код этого не сделает, потому как работает он с инвентарем. И я не могу допереть как правильно засунуть в конструкцию [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] ******** Изменено 21 августа, 2020 пользователем FENIX145 Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Нужно создать метку, сохранить туда адрес того что нужно потом восстановить, и после записать в неё: Спойлер [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 твоё значение Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 (изменено) 6 минут назад, imaginary сказал: Нужно создать метку, сохранить туда адрес того что нужно потом восстановить спасибо, попробую, правда у меня в rdi структура а не значение одного поля, получается в данном примере что в savedadr полетит целая структура и потом как-то надо будет обращаться к ее св-ам для изменения значений. Я вижу что ты изменил код и через lea прокидываешь в rdi только значение. Но если к примеру в коде будет 10 изменяемых значений? Тут запаришься создать метки Изменено 21 августа, 2020 пользователем FENIX145 Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Обращайся так же, по моему работает [[[saveadr]+2C]+4]: db 200 [[[saveadr]+2C]+8]: db 5 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 Только что, imaginary сказал: Обращайся так же, по моему работает интересная конструкция, сейчас попробую. В любом случае больше спасибо, жаль нет возможности лайк влепить Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 (изменено) @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) Изменено 21 августа, 2020 пользователем FENIX145 Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 А какой скрипт у тебя не портит игру? Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 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) Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 (изменено) И по факту мне нужно запихнуть куда-то весь RDI чтобы при отключении восстановить значения что под спойлером, но он будет расширяться, так как перс носит несколько оружий в слотах, для этого и используется rbx Спойлер mov [rdi+50],#1 mov [rdi+78],#1 mov [rdi+a0],#1 mov [rdi+13c],#9999 mov [rdi+140],#9999 Изменено 21 августа, 2020 пользователем FENIX145 Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Тогда попробуй Спойлер [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 байт регистр Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 1 минуту назад, imaginary сказал: Тогда попробуй да, я так пробовал уже писать, но он говорит, что не весь код инжектебельный(какое интересное слово я придумал) и что адрес [saveaddr]+13c не валидный. Сейчас скопипастил твой код и проверил еще раз, ничего не изменилось, выплевывает ошибку Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Не могу проверить это у себя, можешь попробовать зарегистрировать с помощью registersymbol(saveaddr), если нет, то останется только lua, но всё и так должно работать. Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 Сделал регу, в итоге весь код выглядит так: Спойлер [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 Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Ну так нажимай "Yes", главное что бы он включался. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 42 минуты назад, FENIX145 сказал: мне нужно запихнуть куда-то весь RDI чтобы при отключении восстановить значения мне кажеться здесь лучше применить команду readmem . readmem(address, size) можно сразу сохранить весь участок патмяти структуры за один шаг , а потом так же его вернуть обратно . Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 30 минут назад, Alex2411 сказал: можно сразу сохранить весь участок патмяти структуры за один шаг , а потом так же его вернуть обратно . ? вот это прям не плохо, чуть позже попробую, только не совсем понятно. readmem я так понял позволяет считать с уже записанного адреса (судя по названию метода) а как записать тогда? Если можно - маленький примерчик, буду признателен Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 (изменено) 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 на первом его вызове Изменено 21 августа, 2020 пользователем FENIX145 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 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 . не забудь символы зарегить . Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 12 минут назад, FENIX145 сказал: осмотрел как написал пример Dark Byte и что-то оно не завелось у меня Это для твоих нужд не подходит, потому что readmem это команда для CE, а не ассемблера, выполняется один раз в [ENABLE], или [DISABLE] Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Да тут вариантов много... Писать на прямую в рег... либо пиши через флаг.. либо смотреть над Спойлер [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 тут идей просто до крена как подобное провернуть.. Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 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] но никакой разницы.... в общем не хватает основ и знания судя по всему Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 Если сохранять, тогда можно использовать readmem при восстановлении, просто написать внизу readmem из памяти куда сохранены значения ассемблером. Вообще у тебя такая задача которая намного проще может быть написана на lua. Разбирайся сам лучше, материалов достаточно ?. Ссылка на комментарий Поделиться на другие сайты Поделиться
FENIX145 Опубликовано 21 августа, 2020 Автор Поделиться Опубликовано 21 августа, 2020 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 Чет у меня сегодня вообще нифига не получается, бесит прям. Казалось бы по логике - сохранить, изменить, восстановить. Несколько простейших операций, но нет Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 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) сам в себя записываеться память Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 августа, 2020 Поделиться Опубликовано 21 августа, 2020 4 часа назад, FENIX145 сказал: Ребят, у меня такой вопрос А обычный вариант с флагом, наподобие телепорта., т.е сохранить первоначальные значения. нужных адресов, потом записать что тебе нужно и перед отключением скрипта - восстановить, тебя не устроит? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения