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

Целевой адрес из обращающейся к нему инструкции. Aob.


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

Доброго здоровья, коллеги!

Пытаюсь перейти пониманием из высокоуровнего восприятия алгоритмов, к низкоуровневому.
Уже достаточно давно использую в своей поделке обращение к памяти процесса посредством указателей, которые получаю в CE, что существенно увеличивает скорость и возможности снятия данных. Но в связи с периодическими обновлениями контента и обилием получаемой информации, процесс поиска оных - настоящая мука.

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

Как я на своём уровне понимаю реализацию:

Спойлер


[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(name,process.exe,88 04 31 48 FF C6) // should be unique
alloc(newmem,$1000,"process.exe"+2F6DA3)

label(code)
label(return)
registersymbol(name)

newmem:

code:
  mov [rcx+rsi],al
  inc rsi
  jmp return

name:
  jmp newmem
  nop
return:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
name:
  db 88 04 31 48 FF C6

unregistersymbol(name)
dealloc(newmem)

 

Внутри инструкции, перед:

inc rsi

Выполнить запись уже модифицированного содержимого из "[rcx+rsi]", по какому-то адресу, к которому потом можно обращаться извне.

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

Прошу извинить, если разместил тему не в том разделе.

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

Ничего не понял, так что предположу, что нужно, что-то типа этого, но в CE.

 

И стоит указать название игры.

 

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

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

 

Предположил, что, раз инструкция, адрес которой находит "AoB-сканер" копирует значение по целевому адресу:

mov [rcx+rsi],al

То перед возвратом её конструкции на исходную, можно дополнить возможностью где-то разместить это значение так, чтобы потом к нему можно было обратиться. Нет? Это лишь предположение, основанное на самых примитивных методиках вроде:

function muFunc(address, value) {
	address = value;
  	return;
}

В  которой, раз мы вмешиваемся в локальное пространство этого кода, то имеем возможность дополнить её как-то так:

function myFunc(address, value) {
	address = value;
  	globalAddress = address;
  	return;
}

Но я скорее не прав, потому как рассуждаю не в "ASM-контексте" и пока что смотрю на это взглядом строителя заливавшего всю жизнь монолит, на творчество архитектора.

У меня есть инструменты, получающие "AoB-сканированием" статичные элементы интерфейса, "AoB-шаблоны" которых не меняются на протяжении всего времени, как я дошёл до этого пониманием, но некоторые данные не получить таким способом и после апдейтов приходится тратить время на поиск указателей.

Игра называется - "Neverwinter-online", но в общем, если такой подход имеет место быть, то он должен быть справедлив повсеместно.

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

33 минуты назад, KusochekDobra сказал:

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

да можно.

 

33 минуты назад, KusochekDobra сказал:

потому как рассуждаю не в "ASM-контексте"

Примерно так:

Спойлер

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(name,process.exe,88 04 31 48 FF C6) // should be unique
alloc(newmem,$1000,"process.exe"+2F6DA3)

label(code)
label(return)
registersymbol(name)
label(memory_Garik66)
registersymbol(memory_Garik66)


newmem:
  mov [rcx+rsi],al
  push [rcx+rsi]
  pop [memory_Garik66]               // Теперь можно будет обращаться к участку памяти memory_Garik66 из любого скрипта.
                                     // и в ней будет значение, которое лежало в [rcx+rsi] на этом участке игрового кода.   

code:
  inc rsi
  jmp return

memory_Garik66:
  dd 0

name:
  jmp newmem
  nop
return:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
name:
  db 88 04 31 48 FF C6

unregistersymbol(memory_Garik66)
unregistersymbol(name)
dealloc(newmem)

 

ЗЫ: только. если тебе что-то нужно было конкретное, то нужно будет ещё и по rsi  отфильтровать.

 

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

Благодарю!
Если не затруднит, о последнем(фильтр rsi), пожалуйста, поделитесь мудростью.

Сделал по "кальке", адрес получился, но не искомый. Значение адреса на порядок меньше. Вероятно, нужно ещё по другим инструкциям такие тесты провести. Верно?

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

Попробовал несколько mov-инструкций и все ведут к одному и тому же адресу.
 

Процесс игры x64. r-регистры, вроде бы только к длинным адресам относятся. Например, текущий, искомый адрес из 9 символов и в CE выглядит так:

14187E9AC

А найденный предложенным способом, всегда так:

13F25001D

Для пробы пытаю ячейку, в которую клиент пишет имя персонажа. Находится первым же сканированием без отсеивания и доступна по указателю вида:

"GameClient.exe" + 0261E9AC

Может, не все значения можно добыть таким нехитрым способом? Или это особенность x64?

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

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

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

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