Grom-Skynet Опубликовано 27 ноября, 2011 Поделиться Опубликовано 27 ноября, 2011 Как найти идентификатор игрока ( ID players ) Это нужно когда одна инструкция работает с адресом к примкру нашего здоровья и адресами здоровья врагов.. И нужно для написания скрипта с фильтром.. для нашего здоровья.. и не только...На примере игры Magicka + Magicka.Vietnam.v 1.3.6.01.Поиск адресов. Для начала найдем адреса здоровья.. ( Свой и двух или трех врагов.. )Подробнее об этом....Ставим брак на Запись на нашем адресе..Открылось окно... Заходим в игру и пусть вас ударит ( выстрелит ) враг..Сработала одна инструкция.. отлично.. Идем в отладчик и нажимаем правой клавишей мыши на инструкцию и выбираем. Найти адреса, получающие доступ к этой инструкции. Откроется новое окно в котором будут адреса работающие с этой инструкцией.. и сама инструкция выделится зеленым цветом..Идем в игру и наносим урон двум-трем врагам. Появившиеся адреса добавляем в основное окно Cheat Engine. 2.Заглянем в структуру. ( Нашу и всех врагов )Подробнее об этом....Открываем Отладчик и в меню Инструменты выбираем Анализ Данных/СтруктурОткрылось окно Анализ памяти. теперь нужно добавить в него все наши адреса.. Нажимаем меню Файл и там Добавить дополнительный адрес добавляем соответствующие количество. Адреса нужно добавлять в виде (Пример на нашем 1D26F694-104) Почему минус 104.. нам нужно начало структуры.. нашей и вражеской.. Инструкция работающая со всеми это.. fstp dword ptr [ebx+00000104]Начало структуры это ebx что бы его получить нам нужно из нашего адреса вычесть 104.. Как вписали все адреса должным образом... нажимаем меню Структуры и там Определить новую структуру. Можно дать имя нашей структуре но это не обязательно.. и потом жмем да.. И получаем вот такое окно ... ( с красно зелеными цифрами ) на смещении +104 здоровье всех персонажей.Для лучшего анализа структуры нужно сгруппировать данные врагов и не врагов.. для этого на адресах врагов нажимаем правой кнопкой мыши и присваиваем им группу №-1 для всех трех врагов.. у нас остается группа №-0. И смотрим что получилось... Получилось что то новое ( добавился еще один цвет синий ) Ну тк вот Зеленый-Равны все значения у всех. Красный-Они не равны в группе. Синий-Равны только в своей группе.Идентификатор игрока (дальше Id) находится не далеко от значения здоровья.. у всех на одном и том же месте... Анализируем и смотрим... в данный момент я сражаюсь с тремя врагами одного и того же типа.. Значит Id у врагов должен быть одинаковый.. а мой отличатся.. от ихнего ... смотрим и находим вот это...под смешением +100И сразу нужно перевести значение в 4 Bytes Hexadecimal для того что бы в скриптах работало...и получаем вот такую картину...Был наш ID 12 а стал FFFFFE0C=12... Для того что бы перевести нужно на выделенной строчке.. двойное нажатие левой клавиши мыши.. и там в новом окне выбираем новый тип данных...Предположим что все нашли правильно и попробуем написать скрипт..3.Пишем скрипт. ( С фильтром для нашего героя с использованием Id игрока. )Подробнее об этом....Посмотрим в отладчик на нашу инструкцию.. и посмотрим код выше...на один шаг выше и видим инструкцию вычитания.. отлично она работает с тем же регистром и с тем же смещением.. значит и структуры те же...fsubr dword ptr [ebx+00000104]Для других игр можно было оставить скрипит такого вида... но не для этой...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 returnheregodmod:fsubr dword ptr [ebx+00000104]fadd dword ptr [ebx+00000104]// Добавляем операцию сложения .. то есть ранее что то вычли .. и это же прибавляем..)) jmp returnhere0EC2B8F4:jmp newmemnopreturnhere:[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 newmemnopreturnhere:[DISABLE]god_1:fsubr dword ptr [ebx+00000104]dealloc(newmem)unregistersymbol(god_1)[ENABLE]Проверяем... заходим в игру... нам наносят урон.. линия здоровья стоит на месте... мы не умираем..Теперь мы попробуем убить врагов.. да все ок враг погибаем от нашего урона..С поставленной задачей справились.)))) Всем удачи при взломе игр...P.s. У игры есть еще инструкция которая отнимает здоровье когда сам себе наносишь урон. Спс. 4 Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 28 ноября, 2011 Автор Поделиться Опубликовано 28 ноября, 2011 Игра Rogue Warrior v 1.0СтруктураСкрипт здоровья ( Урон от пуль )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 newmemreturnhere:[DISABLE]acg3x.exe+817DB:movss xmm0,[esi+2C]dealloc(newmem)[ENABLE] Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 28 ноября, 2011 Поделиться Опубликовано 28 ноября, 2011 О, таки получилось у тебя? Отлично! Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 28 ноября, 2011 Автор Поделиться Опубликовано 28 ноября, 2011 О, таки получилось у тебя? Отлично! ))) Ну да... получилось... )))))) Думаю что пригодится многим... Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 28 ноября, 2011 Поделиться Опубликовано 28 ноября, 2011 Молодец, красиво все описал. Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 28 ноября, 2011 Автор Поделиться Опубликовано 28 ноября, 2011 Рад стараться.. Ссылка на комментарий Поделиться на другие сайты Поделиться
aliast Опубликовано 6 декабря, 2011 Поделиться Опубликовано 6 декабря, 2011 Самое сложное здесь правильно угадать этот ID. В той же магике судя по скрину выше кандидатов как миниму 18 (18 синих строк). Ну float маловероятен, остаётся 13. И почему именно смещение +100? Я вот так ломал NWN2, сломал всё работало вплоть до постройки замка (т.е. довольно долго), а потом все враги как и я стали бессмертны(((((PS нет желания глянуть на NWN2 в рамках данной темы? Цель - бессмертие союзников. С игроком всё легко и просто, но союзники неправильно находятся. Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 6 декабря, 2011 Автор Поделиться Опубликовано 6 декабря, 2011 Самое сложное здесь правильно угадать этот 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 +2Acmp [ebx+100],032// Мирны жители.je +21cmp [ebx+100],0FFFFFE0C// Я.je +15fstp dword ptr [ebx+00000104]mov [ebx+00000104],0jmp returnherefstp dword ptr [ebx+00000104]jmp returnhereaob_ubiistvo:ubiistvo:jmp newmemnopreturnhere:[DISABLE]ubiistvo:fstp dword ptr [ebx+00000104]dealloc(newmem)unregistersymbol(ubiistvo)Попробуем ... с NWN2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 6 декабря, 2011 Поделиться Опубликовано 6 декабря, 2011 Статья хорошая. Это я писал в личном сообщении автору.Напоминаю способы сравнения свой-чужой:1) Сравнение данных в структурах как это было в этой статье. Если в этом случае ничего не находится, то ищем новый уровень в цепочке указателей и сравниваем структуры на этом уровне. Если опять не нашли, то опять ищем указатель и сравниваем аналогично. И так делать пока не построим полную цепочку указателей.2) Если тратим много времени на пункт1, запутались или долго искать указатели, то ищем инструкции которые работали бы только с игроком за которого играем. Но и здесь свои трудности в случае, когда у героя есть дружественные единицы. Как бы там не было всегда надо помнить "код игры умеет выбирать кто друг твоему герою, а кто враг". При чем это сравнение может вообще отсутствовать, помним об этом.Код дружественного бота может работать с адресом главного героя своими алгоритмами "дружбы". А код "врага" будет также работать с адресом вашего героя своими алгоритмами "врага". И никаких СРАВНЕНИЙ "кто свой, а кто чужой НЕТ (и нет их в структурах данных)" - только работа с адресами.3) Наконец, третий вариант, если на верхние два тратили много времени. Учим как автоматически вести лог и трейсить места из call-ов из глубины вверх до места срабатывания клика мышкой или ввода с клавиатуры (делается на Cheat Engine или других отладчиках). Именно в местах, где читается ввод с мышки или клавиатуры, будет дизассемблированный код который будет работать только с твоим управляемым персонажем. Затем может идти вход в call или call-ы которые вызывались бы уже и ботами.Когда у нас есть логи какие call-ы работают от ботов, а какие от мест сравнений нажатий мышки или клавиатуры, то мы можем составить схему какие участки кода работают, когда что-то происходит в игре... и это 99-100% поможет найти решение задачи "кто свой, а кто чужой".Все пункты 1,2,3 требуют времени и опыта работы в отладке, а также интуицию. На интуицию благоприятно влияет опыт программирования 3Dигр или хотя бы представление как эти игры работают. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 7 декабря, 2011 Поделиться Опубликовано 7 декабря, 2011 Чуток дополню пост №9 - ещё (часто - в стратегиях) бывает так, что в памяти игры висят структуры вида "свои игроки + игрок-человек" и "чужие игроки", в которых и хранятся айдишники всех юнитов\построек, привязка к ресурсам, открытость карты и прочие штуки. Ищется такое или методом тыка или по количеству игроков в той или иной группе на одной и той же карте. Я такое встретил один раз в одном старом клоне старкрафта, так что не утверждаю, что такое встречается и сейчас.Ещё, кстати, бывает так, что отличается код каких-нибудь алгоритмов объекта. Как пример - стрельба или нанесение урона. Отличие игрока от бота состоит в том, что в случае игрока игре необходимо в буквальном смысле показать происходящее - вывести результат на экран. Обычно в отладчике это выглядит парой call'ов, а вот боту на экран по-барабану - он ориентируется чисто механически - только читает данные, смотреть ему ни на что не надо, так что код в случае бота может выглядеть иначе.Такое, опять же, очень распостранено в стратегиях - бот ползёт по своему:-Посмотреть, сколько у меня ресурсов-Если достаточно для заказа юнита N, то-Заказать юнит N-Проверить, не закончен ли заказ юнита N-Если да - послать юнит N в атакуА вот в случае с человеком будет слегка иначе:-Выводить на экран количество ресурсов и кнопку для заказа-Если игрок нажал на кнопку заказа юнита N-Проверить, достаточно ли ресурсов-Если нет - вывести на экран много неприличных слов-Если да - нарисовать прогресс-бар и вывести сообщение о заказе юнита-Обновить экранное значение ресурсов-Обновлять прогресс-бар в соответствии с прогрессом закази так далее. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Ramil Опубликовано 13 марта, 2012 Поделиться Опубликовано 13 марта, 2012 Здравствуйте Grom-Skynet. Я делаю по вашей статье "Как найти идентификатор игрока ( ID players )" с такой же игрой как у вас. Нашёл адрес, заглянул в структуру. А вот на счёт 3 пишем скрипт я не понял. Как сделать скрипт, или самому писать. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 13 марта, 2012 Поделиться Опубликовано 13 марта, 2012 Здравствуйте 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 newmemnopreturnhere:[DISABLE]0EC2B8F4:fsubr dword ptr [ebx+00000104]dealloc(newmem)Как скрипт написали - в меню выбираем File - Assign to current cheat table. Строчка со скриптом появится в окне адресов, поставили галочку - скрипт работает, сняли - отключается. Ссылка на комментарий Поделиться на другие сайты Поделиться
Ramil Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 Я сделал скрипт но вот вылезло http://s2.ipicture.ru/uploads/20120314/mHgWiQH7.bmp Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 Ramil под [ ENABLE] где метка label ( returnhere ) и как CE упустил такое. Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 У вас отсутствую двоеточия в newmem, godmod и returnhere.Сравните ваш скрипт и дефолтный шаблон Ссылка на комментарий Поделиться на другие сайты Поделиться
ARM4ND0 Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 Ужасный скрипт. Вот.[ENABLE]alloc(newmem,2048)label(returnhere)label(godmode) //godmode а не godmodnewmem: //Отсутствует :cmp dowrd ptr [ebx+00000100],0FFFFE0Cje godmodefsubr dword ptr [ebx+00000104]jmp returnheregodmode: //godmode тут правильно, но отсутствует :fsubr dword ptr [ebx+00000104]fadd dword ptr [ebx+00000104] //Отсутствует ]jmp returnhere0628188E: //Отсутствует :jmp newmemnopreturnhere: //Отсутствует :[DISABLE]0628188E: //Отсутствует :fsubr dword ptr [ebx+00000104]dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 14 марта, 2012 Автор Поделиться Опубликовано 14 марта, 2012 Для игры Магика ... скрипты нужно делать через AobScan ... просто с адресом скрипт будет работать пока не перезагрузишь игру... в первом посту все подробно про это рассказано и показано....)))))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 4 апреля, 2012 Поделиться Опубликовано 4 апреля, 2012 Ребят, спасибо за отличную статью Ссылка на комментарий Поделиться на другие сайты Поделиться
Grom-Skynet Опубликовано 4 апреля, 2012 Автор Поделиться Опубликовано 4 апреля, 2012 Ребят, спасибо за отличную статью ))))) Ссылка на комментарий Поделиться на другие сайты Поделиться
live_4_ever Опубликовано 13 мая, 2012 Поделиться Опубликовано 13 мая, 2012 Адреса нужно добавлять в виде (Пример на нашем 1D26F694-104) Почему минус 104.. нам нужно начало структуры.. нашей и вражеской.. Инструкция работающая со всеми это.. fstp dword ptr [ebx+00000104]Начало структуры это ebx что бы его получить нам нужно из нашего адреса вычесть 104..А если, например, у меня инструкция такая mov [ebx],eax Тогда как написать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 13 мая, 2012 Поделиться Опубликовано 13 мая, 2012 Смотреть выше по коду, что именно попадает в ebx. Именно в ebx, а не в [ebx] (надеюсь, разница понятна?) Не в этой инструкции, а выше, там всяко будет инструкция с каким-то смещением. Ее значение и брать в качестве исследуемой структуры. Ссылка на комментарий Поделиться на другие сайты Поделиться
live_4_ever Опубликовано 13 мая, 2012 Поделиться Опубликовано 13 мая, 2012 ы_Ы понятно. Спс. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость frihet Опубликовано 21 сентября, 2012 Поделиться Опубликовано 21 сентября, 2012 <p>Добрый вечер! Если не сложно, то объясните пожалуйста, как правильно оперировать инструкцией типа [ecx+000000A8],eax .</p><p> </p><p>Я пробовал отминусовать значение как описано в статье, но потом в таблице так и не нашёл значение A0. Игра Max Payne 2 v1.0.97.0.</p><div> </div> Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 сентября, 2012 Поделиться Опубликовано 22 сентября, 2012 <p>Добрый вечер! Если не сложно, то объясните пожалуйста, как правильно оперировать инструкцией типа [ecx+000000A8],eax .</p><p> </p><p>Я пробовал отминусовать значение как описано в статье, но потом в таблице так и не нашёл значение A0. Игра Max Payne 2 v1.0.97.0.</p><div> </div>Привет! Не нужно ничего вычитать - достаточно узнать значение регистра есх на момент выполнения инструкции. Для этого нужно поставить брейкпоинт в отладчике, или же в СЕ открыть вкладку "Подробности" в окне с инструкциями. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 22 сентября, 2012 Поделиться Опубликовано 22 сентября, 2012 В этой игре можно делать фильтр на героя через указатель.Пишем скрипт.newmem:cmp esi,xxxxx+1A8B20] jne one_hit_kill // тут можно указать в орг. инструкцииmov eax,(float)250jmp originalcodeДумаю понятен Полностью скрипт не привел так как я делал с активир. скрипт. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения