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

Как найти идентификатор игрока ( ID players )


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

Как найти идентификатор игрока ( ID players )

Это нужно когда одна инструкция работает с адресом к примкру нашего здоровья и адресами здоровья врагов.. И нужно для написания скрипта с фильтром.. для нашего здоровья.. и не только...


На примере игры Magicka + Magicka.Vietnam.v 1.3.6.0

1.Поиск адресов. Для начала найдем адреса здоровья.. ( Свой и двух или трех врагов.. )

Подробнее об этом....

post-117-1322405470,29_thumb.jpg

Ставим брак на Запись на нашем адресе..

post-117-1322405479,36_thumb.jpg

Открылось окно...

post-117-1322405619,34_thumb.jpg

Заходим в игру и пусть вас ударит ( выстрелит ) враг..

Сработала одна инструкция.. отлично.. Идем в отладчик и нажимаем правой клавишей мыши на инструкцию и выбираем. Найти адреса, получающие доступ к этой инструкции.

post-117-1322466913,49_thumb.jpg post-117-1322406314,2_thumb.jpg

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

post-117-1322406493,76_thumb.jpg

Идем в игру и наносим урон двум-трем врагам. Появившиеся адреса добавляем в основное окно Cheat Engine.

post-117-1322407081,3_thumb.jpg post-117-1322407173,76_thumb.jpg

2.Заглянем в структуру. ( Нашу и всех врагов )

Подробнее об этом....

Открываем Отладчик и в меню Инструменты выбираем Анализ Данных/Структур

post-117-1322407681,58_thumb.png

Открылось окно Анализ памяти. теперь нужно добавить в него все наши адреса.. Нажимаем меню Файл и там Добавить дополнительный адрес добавляем соответствующие количество.

post-117-1322408004,75_thumb.jpg post-117-1322408017,75_thumb.png

Адреса нужно добавлять в виде (Пример на нашем 1D26F694-104) Почему минус 104.. нам нужно начало структуры.. нашей и вражеской.. Инструкция работающая со всеми это..

fstp dword ptr [ebx+00000104]

Начало структуры это ebx что бы его получить нам нужно из нашего адреса вычесть 104..

post-117-1322408535,86_thumb.png

Как вписали все адреса должным образом... нажимаем меню Структуры и там Определить новую структуру. Можно дать имя нашей структуре но это не обязательно.. и потом жмем да..

post-117-1322408749,59_thumb.jpg

И получаем вот такое окно ... ( с красно зелеными цифрами ) на смещении +104 здоровье всех персонажей.

post-117-1322409147,66_thumb.jpg

Для лучшего анализа структуры нужно сгруппировать данные врагов и не врагов.. для этого на адресах врагов нажимаем правой кнопкой мыши и присваиваем им группу №-1 для всех трех врагов.. у нас остается группа №-0. И смотрим что получилось...

post-117-1322409488,44_thumb.png post-117-1322409570,51_thumb.jpg

Получилось что то новое ( добавился еще один цвет синий ) Ну тк вот Зеленый-Равны все значения у всех. Красный-Они не равны в группе. Синий-Равны только в своей группе.

Идентификатор игрока (дальше Id) находится не далеко от значения здоровья.. у всех на одном и том же месте... Анализируем и смотрим... в данный момент я сражаюсь с тремя врагами одного и того же типа.. Значит Id у врагов должен быть одинаковый.. а мой отличатся.. от ихнего ... смотрим и находим вот это...под смешением +100

post-117-1322410106,5_thumb.jpg

И сразу нужно перевести значение в 4 Bytes Hexadecimal для того что бы в скриптах работало...и получаем вот такую картину...Был наш ID 12 а стал FFFFFE0C=12... Для того что бы перевести нужно на выделенной строчке.. двойное нажатие левой клавиши мыши.. и там в новом окне выбираем новый тип данных...

post-117-1322410416,3_thumb.png

Предположим что все нашли правильно и попробуем написать скрипт..

3.Пишем скрипт. ( С фильтром для нашего героя с использованием Id игрока. )

Подробнее об этом....

Посмотрим в отладчик на нашу инструкцию.. и посмотрим код выше...на один шаг выше и видим инструкцию вычитания.. отлично она работает с тем же регистром и с тем же смещением.. значит и структуры те же...

fsubr dword ptr [ebx+00000104]

post-117-1322411054,14_thumb.png

Для других игр можно было оставить скрипит такого вида... но не для этой...


alloc(newmem,2048)
label(returnhere)
label(godmod)

newmem:
cmp dword ptr [ebx+00000100],0FFFFFE0C // Сравниваем [ebx+00000100] с нашим ID.
je godmod// Прыгаем если равно.
fsubr dword ptr [ebx+00000104]
jmp returnhere

godmod:
fsubr dword ptr [ebx+00000104]
fadd dword ptr [ebx+00000104]// Добавляем операцию сложения .. то есть ранее что то вычли .. и это же прибавляем..))
jmp returnhere

0EC2B8F4:
jmp newmem
nop
returnhere:

[DISABLE]
0EC2B8F4:
fsubr dword ptr [ebx+00000104]
dealloc(newmem)
[ENABLE]

Так как у этой игры нет модульной адресации.. и все равно при каждом запуске игры, эта инструкция всегда на новом месте под новым адресом... Но хорошо что есть такая штука.. как AOBscan

И скрипт для нее выглядит вот так..

Здоровье максимум ( Урон от врагов )


alloc(newmem,2048)
label(god_1)
label(godmod_1)
label(returnhere)
aobscan(aob_god_1,"D8 AB 04 01 00 00 D9 9B 04 01 00 00 8B 95 F0 F8 FF FF B9")
registersymbol(god_1)

newmem:
cmp [ebx+100],0FFFFFE0C// Сравниваем [ebx+100] с "0FFFFFE0C=12" это идентификатор игрока.
je godmod_1// Прыгаем если значаения равны.
fsubr dword ptr [ebx+00000104]// Оригинальная инструкция.
jmp returnhere// Прыжок на выход.

godmod_1:// Суда прыгнули после сравнения.
fsubr dword ptr [ebx+00000104]// Оригинальная инструкция.
fadd dword ptr [ebx+00000104]// Добавляем инструкцию добавления.. Прибавляем то что вычели..))
jmp returnhere// Прыжок на выход.

aob_god_1:
god_1:
jmp newmem
nop
returnhere:

[DISABLE]
god_1:
fsubr dword ptr [ebx+00000104]
dealloc(newmem)
unregistersymbol(god_1)
[ENABLE]

Проверяем... заходим в игру... нам наносят урон.. линия здоровья стоит на месте... мы не умираем..Теперь мы попробуем убить врагов.. да все ок враг погибаем от нашего урона..

С поставленной задачей справились.)))) Всем удачи при взломе игр...

P.s. У игры есть еще инструкция которая отнимает здоровье когда сам себе наносишь урон.

Спс.

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

Игра Rogue Warrior v 1.0

Структура

post-117-1322470264,11_thumb.jpg

Скрипт здоровья ( Урон от пуль )


alloc(newmem,2048)
label(returnhere)
label(GodMod)

newmem:
cmp [esi+50],1// [esi+50] хранит Id игроков.. наш Id "1".
je GodMod//Прыгаем если равно.
movss xmm0,[esi+2C]// Оригинальная инструкция.
jmp returnhere// Прыжок на выход.

GodMod:// Сюда прыгнули.
push [esi+30]// [esi+30] Хранит максимум здоровья запоминаем его...
pop [esi+2C]// И восстанавливаем максимум в наш адрес.
movss xmm0,[esi+2C]// Оригинальная инструкция.
jmp returnhere// Прыжок на выход.

acg3x.exe+817DB:
jmp newmem
returnhere:

[DISABLE]
acg3x.exe+817DB:
movss xmm0,[esi+2C]
dealloc(newmem)
[ENABLE]

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

Самое сложное здесь правильно угадать этот ID. В той же магике судя по скрину выше кандидатов как миниму 18 (18 синих строк). Ну float маловероятен, остаётся 13. И почему именно смещение +100? Я вот так ломал NWN2, сломал всё работало вплоть до постройки замка (т.е. довольно долго), а потом все враги как и я стали бессмертны(((((

PS нет желания глянуть на NWN2 в рамках данной темы? Цель - бессмертие союзников. С игроком всё легко и просто, но союзники неправильно находятся.

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

Самое сложное здесь правильно угадать этот ID. В той же магике судя по скрину выше кандидатов как миниму 18 (18 синих строк). Ну float маловероятен, остаётся 13. И почему именно смещение +100? Я вот так ломал NWN2, сломал всё работало вплоть до постройки замка (т.е. довольно долго), а потом все враги как и я стали бессмертны(((((

PS нет желания глянуть на NWN2 в рамках данной темы? Цель - бессмертие союзников. С игроком всё легко и просто, но союзники неправильно находятся.

Ну про магику... под сотым смещением точно id/// прошел игру два раза... все ок... там в скрипте легкое убийство.. в теме с трейнером... Id Военных.. Гражданских и мой...

Легкое убийство

[ENABLE]
alloc(newmem,2048)
label(ubiistvo)
label(returnhere)
aobscan(aob_ubiistvo,"D9 9B 04 01 00 00 8B 95 F0 F8 FF FF B9")
registersymbol(ubiistvo)

newmem:
cmp [ebx+100],0FFFFFF9C// Военные.
je +2A
cmp [ebx+100],032// Мирны жители.
je +21
cmp [ebx+100],0FFFFFE0C// Я.
je +15
fstp dword ptr [ebx+00000104]
mov [ebx+00000104],0
jmp returnhere
fstp dword ptr [ebx+00000104]
jmp returnhere

aob_ubiistvo:
ubiistvo:
jmp newmem
nop
returnhere:

[DISABLE]
ubiistvo:
fstp dword ptr [ebx+00000104]
dealloc(newmem)
unregistersymbol(ubiistvo)

Попробуем ... с NWN2

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

Статья хорошая. Это я писал в личном сообщении автору.

Напоминаю способы сравнения свой-чужой:

1) Сравнение данных в структурах как это было в этой статье. Если в этом случае ничего не находится, то ищем новый уровень в цепочке указателей и сравниваем структуры на этом уровне. Если опять не нашли, то опять ищем указатель и сравниваем аналогично. И так делать пока не построим полную цепочку указателей.

2) Если тратим много времени на пункт1, запутались или долго искать указатели, то ищем инструкции которые работали бы только с игроком за которого играем. Но и здесь свои трудности в случае, когда у героя есть дружественные единицы. Как бы там не было всегда надо помнить "код игры умеет выбирать кто друг твоему герою, а кто враг". При чем это сравнение может вообще отсутствовать, помним об этом.

Код дружественного бота может работать с адресом главного героя своими алгоритмами "дружбы". А код "врага" будет также работать с адресом вашего героя своими алгоритмами "врага". И никаких СРАВНЕНИЙ "кто свой, а кто чужой НЕТ (и нет их в структурах данных)" - только работа с адресами.

3) Наконец, третий вариант, если на верхние два тратили много времени. Учим как автоматически вести лог и трейсить места из call-ов из глубины вверх до места срабатывания клика мышкой или ввода с клавиатуры (делается на Cheat Engine или других отладчиках). Именно в местах, где читается ввод с мышки или клавиатуры, будет дизассемблированный код который будет работать только с твоим управляемым персонажем. Затем может идти вход в call или call-ы которые вызывались бы уже и ботами.

Когда у нас есть логи какие call-ы работают от ботов, а какие от мест сравнений нажатий мышки или клавиатуры, то мы можем составить схему какие участки кода работают, когда что-то происходит в игре... и это 99-100% поможет найти решение задачи "кто свой, а кто чужой".

Все пункты 1,2,3 требуют времени и опыта работы в отладке, а также интуицию. На интуицию благоприятно влияет опыт программирования 3Dигр или хотя бы представление как эти игры работают.

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

Чуток дополню пост №9 - ещё (часто - в стратегиях) бывает так, что в памяти игры висят структуры вида "свои игроки + игрок-человек" и "чужие игроки", в которых и хранятся айдишники всех юнитов\построек, привязка к ресурсам, открытость карты и прочие штуки. Ищется такое или методом тыка или по количеству игроков в той или иной группе на одной и той же карте. Я такое встретил один раз в одном старом клоне старкрафта, так что не утверждаю, что такое встречается и сейчас.

Ещё, кстати, бывает так, что отличается код каких-нибудь алгоритмов объекта. Как пример - стрельба или нанесение урона. Отличие игрока от бота состоит в том, что в случае игрока игре необходимо в буквальном смысле показать происходящее - вывести результат на экран. Обычно в отладчике это выглядит парой call'ов, а вот боту на экран по-барабану - он ориентируется чисто механически - только читает данные, смотреть ему ни на что не надо, так что код в случае бота может выглядеть иначе.

Такое, опять же, очень распостранено в стратегиях - бот ползёт по своему:

-Посмотреть, сколько у меня ресурсов
-Если достаточно для заказа юнита N, то
-Заказать юнит N
-Проверить, не закончен ли заказ юнита N
-Если да - послать юнит N в атаку

А вот в случае с человеком будет слегка иначе:

-Выводить на экран количество ресурсов и кнопку для заказа
-Если игрок нажал на кнопку заказа юнита N
-Проверить, достаточно ли ресурсов
-Если нет - вывести на экран много неприличных слов
-Если да - нарисовать прогресс-бар и вывести сообщение о заказе юнита
-Обновить экранное значение ресурсов
-Обновлять прогресс-бар в соответствии с прогрессом заказ

и так далее.

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

  • 3 месяца спустя...

Здравствуйте Grom-Skynet. Я делаю по вашей статье "Как найти идентификатор игрока ( ID players )" с такой же игрой как у вас. Нашёл адрес, заглянул в структуру. А вот на счёт 3 пишем скрипт я не понял. Как сделать скрипт, или самому писать.

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

Здравствуйте Grom-Skynet. Я делаю по вашей статье "Как найти идентификатор игрока ( ID players )" с такой же игрой как у вас. Нашёл адрес, заглянул в структуру. А вот на счёт 3 пишем скрипт я не понял. Как сделать скрипт, или самому писать.

Суть статьи в том, что есть в игре функция

ОтнятьЗдоровье(Персонаж);

Ей по-барабану, наш это персонаж или бот - она просто отнимает здоровье. Но игра каким-то хитрым образом определяет, когда стреляют по нашему персонажу, а когда - по вражеским. Определяет она как раз значением этого самого ID, скажем, если ID = 1 - то это наш персонаж, если же ID = 0 - то вражеский. Задача в том, чтобы в инструкции отнятия здоровья сделать фильтр:


Если (ID = 1) ;Пытаются отнять здоровье у нас
{
Не отнимать здоровье, выход
}
Если (ID = 0) ; Мы стреляем во врага
{
Отнять здоровье - вор должен сидеть в тюрьме! Затем - выход.
}

Собственно, в первой части статьи мы нашли адрес здоровья, затем повесили на него отладчик и поставили брейкпоинт на запись - нашли функцию, которая пишет что-то в наш адрес здоровья. Эта найденная функция - и есть та самая ОтнятьЗдоровье:


FLD DWORD PTR [EBP-1C] ;Загружаем значение наносимого урона
FSUBR DWORD PTR [EBX+104] ;Отнимаем урон от здоровья
FSTP DWORD PTR [EBX+104] ;Сохраняем новое значение здоровья

[EBX+104] - указатель на адрес здоровья.

EBX - базовый адрес структуры персонажа.

104 - смещение от базового адреса.

После этого мы нашли в структуре идентификатор - научились отличать себя от врагов. Теперь осталось переписать старую инструкцию ОтнятьЗдоровье, чем и занимается скрипт. В отладчике подводим курсор к адресу этой функции, меню Tools - Auto Assemble - и пишем там код скрипта:


[ENABLE]
alloc(newmem,2048) ;Выделили память под код скрипта
label(returnhere) ;На эту метку прыгнем после его выполнения
label(godmod) ;Этот кусочек выполнится, если стреляют в нашего персонажа

newmem:
cmp dword ptr [ebx+00000100],0FFFFFE0C // Сравниваем [ebx+00000100] с нашим ID.
je godmod// Прыгаем если равно.
fsubr dword ptr [ebx+00000104] ;Если же не равно - отнимаем здоровье
jmp returnhere ;Прыгаем обратно в код игры

godmod: ;Если стреляли в нашего персонажа
fsubr dword ptr [ebx+00000104] ;Сначала отмаем урон, а затем
fadd dword ptr [ebx+00000104]// Добавляем операцию сложения .. то есть ранее что то вычли .. и это же прибавляем..))
jmp returnhere ;И выходим - никакого урона так и не нанеслось

0EC2B8F4:
jmp newmem
nop
returnhere:

[DISABLE]
0EC2B8F4:
fsubr dword ptr [ebx+00000104]
dealloc(newmem)

Как скрипт написали - в меню выбираем File - Assign to current cheat table. Строчка со скриптом появится в окне адресов, поставили галочку - скрипт работает, сняли - отключается.

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

Ужасный скрипт. Вот.


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(godmode) //godmode а не godmod

newmem: //Отсутствует :
cmp dowrd ptr [ebx+00000100],0FFFFE0C
je godmode
fsubr dword ptr [ebx+00000104]
jmp returnhere

godmode: //godmode тут правильно, но отсутствует :
fsubr dword ptr [ebx+00000104]
fadd dword ptr [ebx+00000104] //Отсутствует ]
jmp returnhere

0628188E: //Отсутствует :
jmp newmem
nop
returnhere: //Отсутствует :




[DISABLE]
0628188E: //Отсутствует :
fsubr dword ptr [ebx+00000104]
dealloc(newmem)

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

Для игры Магика ... скрипты нужно делать через AobScan ... просто с адресом скрипт будет работать пока не перезагрузишь игру... в первом посту все подробно про это рассказано и показано....))))))

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

  • 3 недели спустя...
  • 1 месяц спустя...

Адреса нужно добавлять в виде (Пример на нашем 1D26F694-104) Почему минус 104.. нам нужно начало структуры.. нашей и вражеской.. Инструкция работающая со всеми это..

fstp dword ptr [ebx+00000104]

Начало структуры это ebx что бы его получить нам нужно из нашего адреса вычесть 104..

А если, например, у меня инструкция такая

mov [ebx],eax

Тогда как написать?

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

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

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

  • 4 месяца спустя...

<p>Добрый вечер! Если не сложно, то объясните пожалуйста, как правильно оперировать инструкцией типа [ecx+000000A8],eax .</p>

<p> </p>

<p>Я пробовал отминусовать значение как описано в статье, но потом в таблице так и не нашёл значение A0. Игра Max Payne 2 v1.0.97.0.</p>

<div> </div>

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

<p>Добрый вечер! Если не сложно, то объясните пожалуйста, как правильно оперировать инструкцией типа [ecx+000000A8],eax .</p>

<p> </p>

<p>Я пробовал отминусовать значение как описано в статье, но потом в таблице так и не нашёл значение A0. Игра Max Payne 2 v1.0.97.0.</p>

<div> </div>

Привет! Не нужно ничего вычитать - достаточно узнать значение регистра есх на момент выполнения инструкции. Для этого нужно поставить брейкпоинт в отладчике, или же в СЕ открыть вкладку "Подробности" в окне с инструкциями.

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

В этой игре можно делать фильтр на героя через указатель.

Пишем скрипт.

newmem:
cmp esi,xxxxx+1A8B20]
jne one_hit_kill // тут можно указать в орг. инструкции
mov eax,(float)250
jmp originalcode

Думаю понятен :)

Полностью скрипт не привел так как я делал с активир. скрипт.

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

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

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

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