Grom-Skynet

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

42 сообщения в этой теме

Как найти идентификатор игрока ( 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]

0

Поделиться сообщением


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

О, таки получилось у тебя? Отлично! :lol:

0

Поделиться сообщением


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

О, таки получилось у тебя? Отлично! :lol:

))) Ну да... получилось... )))))) Думаю что пригодится многим...

0

Поделиться сообщением


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

Молодец, красиво все описал.

0

Поделиться сообщением


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

Рад стараться..

0

Поделиться сообщением


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

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

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

0

Поделиться сообщением


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

Самое сложное здесь правильно угадать этот 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

0

Поделиться сообщением


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

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

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

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

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

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

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

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

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

0

Поделиться сообщением


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

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

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

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

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

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

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

и так далее.

1

Поделиться сообщением


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

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

0

Поделиться сообщением


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

Здравствуйте 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. Строчка со скриптом появится в окне адресов, поставили галочку - скрипт работает, сняли - отключается.

0

Поделиться сообщением


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

Ramil под [ ENABLE] где метка label ( returnhere ) и как CE упустил такое.

0

Поделиться сообщением


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

У вас отсутствую двоеточия в newmem, godmod и returnhere.

Сравните ваш скрипт и дефолтный шаблон

0

Поделиться сообщением


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

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


[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)

0

Поделиться сообщением


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

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

0

Поделиться сообщением


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

Ребят, спасибо за отличную статью :)

0

Поделиться сообщением


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

Ребят, спасибо за отличную статью :)

))))) ;)

0

Поделиться сообщением


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

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

fstp dword ptr [ebx+00000104]

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

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

mov [ebx],eax

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

0

Поделиться сообщением


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

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

0

Поделиться сообщением


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

ы_Ы понятно. Спс.

0

Поделиться сообщением


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

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

<p> </p>

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

<div> </div>

0

Поделиться сообщением


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

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

<p> </p>

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

<div> </div>

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

0

Поделиться сообщением


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

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

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

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

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

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

0

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас