Вопрос по трюку в скрипте автоассеблера
-
Добрый день. Прошу подсказки у знающих людей, как можно реализовать вот какую фишку. У меня есть инструкция в коде игры через которую проходит несколько адресов. Объясню поточнее. Я нашёл инструкцию нужного мне действия в игре. Делаю поиск адресов к котором обращается эта инструкция и там в результатах выводит сразу 4-7 адресов и счётчик хитов увеличивается постоянно. Так вот мне нужно каждый из этих 7 адресов вывести в отдельную метку (переменную). Как это сделать?
Если я делаю известным мне способом: создаю label(z1), registersymbol(z1) и т.д. потом записываю из регистра в метку z1, то у меня в метке оказывается лишь самое последнее значение из семи адресов. Т.е. самый последний адрес в метке оказывается, а остальные 6 нет. А мне надо, чтоб было z1,z2,z3,z4...z7 и каждый адрес записался в свою метку. Чтоб я потом в таблице мог их прикрепить к скрипту и выводить в них значения из каждого адреса по порядку. -
@Iniar привет! Привет! Перед записью в метку тебе надо проверять, какой адрес записан в метку, и если не совпадает, записывать его в другое место. Скорее всего, на ассемблере тебе для этого понадобится цикл, ну и адреса нужно будет помещать в стартовую метку плюс смещение размером с размер адреса (4 байта, если игра 32 бит, и 8 байт, если игра 64 бита).
-
@StoneWeaver Я думаю, что это немного не то решение. Потому как я не знаю какие будут адрес. Они всегда разные. Я забыл об этом упомянуть в начальном топике. А то о чём ты говоришь, подходит для того если я знаю адреса. В частности для того чтоб их сверять, надо знать с чем сверять.
-
@StoneWeaver На примере объясню что мне надо... Я нашёл инструкцию в героях 7 которая показывает кол-во войск в битве. Так вот эта инструкция обращается сразу и к моим и к войскам соперника. Когда я ищу адреса к которым обращается данная инструкция, то она выводит и допустим 4 вида войск с моей стороны и 5 видов войск с стороны врага. Так вот мне нужно под скриптом сделать 9 меток в каждую из которых будет выводиться кол-во соответственно по порядку сначала моих 4 видов и потом 5 видов соперника.
-
Тебе нужно сделать фильтр. По типу "свой чужой"
Это как я отфильтровывал слоты друг от друга в инвенторе героя в игрушке dysmantle.
Как спойлер добавить? Хотел скрипт выложить а он 188 строк. -
@Partizan1078 Да, почти тоже самое задумываю. Тоже скрипт, а ниже будут метки с соответствующим значением. Но я так понимаю, у тебя где сравнение r15 с 00,01,02.... идёт - это ты точно знаешь что есть слот 00, 01 и т.д... Т.е. подозреваю, что в r15 у тебя чередуется индекс слота инвентаря и ты можешь сравнивать их и записывать. Это то я бы с лёгкостью сделал по данной логике. А как быть мне с рандомными адресами? С чем мне их сравнивать?
-
@Partizan1078 По поводу спойлера во время написания ответа есть выше над текстом раздел Код. Наверно его надо... Это конечно не спойлер, но код будет отдельно видно. Спойлер тоже не нашёл.
123-321
-
@Iniar Тебе надо найти фильт. Это может быть как у меня в скрипте регистр или он (фильтр) может быть в структуре, стеке. Что конкретно ломаешь ща сам хочу глянуть.
-
@Partizan1078 Ломаю героев 7. Там весьма много новых для меня решений от разрабов. Пока что интересный процесс. Там они замутили одну инструкцию на сразу много разных значений. К примеру инструкция обращающаяся к войскам вне боя обращается ещё к куче разных параметров. Т.е. когда ищу адреса к которым обращается инструкция, то там и кол-во войск и где-то там же какие-то параметры войск... Но я отрыл инструкцию которая конкретно уже в бою обращается исключительно к кол-ву войск. И их можно прям в бою редактировать под себя как у врагов поставить по 1 воину, так и у себя сделать 999 состава войска. И нужно отцидить их как-то. По анализу структуры для каждого моего и каждого вражеского войска по началу структуры вижу, что есть некоторые различители для видимо очерёдности... На данный момент у меня в бою 3 моих войска и 3 вражеских. И по смещению некоему от начала структуры идёт 121, 122, 123,124,125,126. Из них первые 3 моих, потом 3 врага. Но пока не понял, постоянные ли это значения или меняются из боя в бой.
-
Пользователь @Partizan1078 написал в Вопрос по трюку в скрипте автоассеблера:
Хотел скрипт выложить а он 188 строк
Выкладывай, обернув тегом "Код", система сама его ограничит в небольшом окне, в котором будет отдельная возможность листать код.
-
Пользователь @Iniar написал в Вопрос по трюку в скрипте автоассеблера:
@StoneWeaver Я думаю, что это немного не то решение. Потому как я не знаю какие будут адрес. Они всегда разные. Я забыл об этом упомянуть в начальном топике. А то о чём ты говоришь, подходит для того если я знаю адреса. В частности для того чтоб их сверять, надо знать с чем сверять.
А я разве говорил, что заранее будет известно? Я сказал, что ты сверяешь значение, которое записываешь. Хотя сейчас подумал, и это годится только для одного прохода цикла, для многократного прохода так не сработает.
-
@StoneWeaver Хм. Я пока не совсем понял твою идею. Пока не понял с чем сравнивать имеешь в виду. Если у тебя та же идея, что и у Partizan1078, то мне для этого надо найти сначала по какому триггеру можно фильтровать.
-
@Iniar Нет, у меня была идея при первом проходе в пустую ячейку записывать адрес, а потом сравнивать, есть ли он уже в массиве, но это непростой алгоритм, для многократного прохода цикла нужно внимательно думать, чтобы не перетереть адреса
-
@StoneWeaver Ну да, в такой реализации получится не малый код на создание массива, заполнение его и сравнивание потом с регистром инструкции. Ну и наверно да, чтоб в каждом следующем бою данные актуализировались - нужно будет выключать и включать скрипт каждый раз наверно. Я так понял.
-
@Partizan1078 если есть герои меча и магии 7, посмотри инструкцию - 1401E4F72 - MMH7Game-Win64-Shipping.PIBGetInterface+2D2 - cmp [rcx+000006EC],eax. Посмотри адреса к которым она обращается именно в бою когда поле боя на экране.
-
Дело такое.
Игра сделана на Unreal engine.
Это говорит о том что проще всего выходить на игровой мир и уже от него строить указатели. Как то так.
Версия игры 1.8 37786Сделал скрит на World.
[ENABLE] aobscanmodule(pWorld,MMH7Game-Win64-Shipping.exe,48 8B ? ? ? ? ? 8B ? 8B ? ? 85 ? 7F ? 74) alloc(newmem,$1000,pWorld) label(return) label(World) registersymbol(World) registersymbol(pWorld) newmem: mov [World],rcx mov rbx,[rcx+00000080] jmp return World: dq 00 pWorld: jmp newmem nop 2 return: [DISABLE] pWorld: db 48 8B 99 80 00 00 00 unregistersymbol(*) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: MMH7Game-Win64-Shipping.exe+78BDEA MMH7Game-Win64-Shipping.exe+78BDD8: 5F - pop rdi MMH7Game-Win64-Shipping.exe+78BDD9: 5E - pop rsi MMH7Game-Win64-Shipping.exe+78BDDA: F3 C3 - repe ret MMH7Game-Win64-Shipping.exe+78BDDC: CC - int 3 MMH7Game-Win64-Shipping.exe+78BDDD: CC - int 3 MMH7Game-Win64-Shipping.exe+78BDDE: CC - int 3 MMH7Game-Win64-Shipping.exe+78BDDF: CC - int 3 MMH7Game-Win64-Shipping.exe+78BDE0: 48 89 5C 24 08 - mov [rsp+08],rbx MMH7Game-Win64-Shipping.exe+78BDE5: 57 - push rdi MMH7Game-Win64-Shipping.exe+78BDE6: 48 83 EC 20 - sub rsp,20 // ---------- INJECTING HERE ---------- MMH7Game-Win64-Shipping.exe+78BDEA: 48 8B 99 80 00 00 00 - mov rbx,[rcx+00000080] // ---------- DONE INJECTING ---------- MMH7Game-Win64-Shipping.exe+78BDF1: 8B FA - mov edi,edx MMH7Game-Win64-Shipping.exe+78BDF3: 8B 43 68 - mov eax,[rbx+68] MMH7Game-Win64-Shipping.exe+78BDF6: 85 C0 - test eax,eax MMH7Game-Win64-Shipping.exe+78BDF8: 7F 22 - jg MMH7Game-Win64-Shipping.exe+78BE1C MMH7Game-Win64-Shipping.exe+78BDFA: 74 20 - je MMH7Game-Win64-Shipping.exe+78BE1C MMH7Game-Win64-Shipping.exe+78BDFC: 4C 8D 0D 9D D1 10 01 - lea r9,[MMH7Game-Win64-Shipping.exe+1898FA0] MMH7Game-Win64-Shipping.exe+78BE03: 48 8D 15 56 D5 10 01 - lea rdx,[MMH7Game-Win64-Shipping.exe+1899360] MMH7Game-Win64-Shipping.exe+78BE0A: 48 8D 0D 17 D5 10 01 - lea rcx,[MMH7Game-Win64-Shipping.exe+1899328] MMH7Game-Win64-Shipping.exe+78BE11: 41 B8 3F 02 00 00 - mov r8d,0000023F MMH7Game-Win64-Shipping.exe+78BE17: E8 24 D5 91 FF - call MMH7Game-Win64-Shipping.exe+A9340 }
Пользовался инструментом для СЕ
Тык -
@Partizan1078 оу, сколько инфы... Расскажи по подробней что за приспособа и как её пользовать? На моей СЕ 6.8.3 приспособа не работает. Когда запускаю скрипт Unreal Engine, то он не активируется. А Tools просто везде по вопросам выдаёт.
Ну и скрипт World тоже не отрабатывает. По оффсетам с скрина твоего у меня пусто. Видимо версия игры не та. К тому же ты говоришь - выходить на мир. Но на скрине я у тебя не увидел кол-во войск в бою которые мне нужны. А только касаемо перса информация выводится. -
@Partizan1078 И можешь поподробней объяснить как мне к примеру попасть в анализе структур в такой же массив как у тебя на скрине с описанием смещения? Как отловить начало структуры мира? Моя версия игры - 1.6 34396
-
@Iniar ce 7.5. Я и не искал того что тебе нужно. Я по быстрому просто глянул. Что к чему.
-
@Partizan1078 Ну я пока ничего не понял, как с твоей приспособой взаимодействовать. Поставил 7.5, но просто тыкаю по пунктам скриптов и не понимаю связей пока. Что-то срабатывает, где-то просто вопросы. Так что вопрос по поводу моего начального топика всё ещё актуален. Как по очереди записать в метки значение нескольких адресов. По твоему примеру сделал скрипт которые сверяет по смещению 4C от начала структуры войск в бою значения 121,122,123... о которых писал выше, но в переменных w1,w2 и т.д. помещается один и тот же адрес и значения скачут.