MasterGH Опубликовано 30 декабря, 2009 Поделиться Опубликовано 30 декабря, 2009 Игра: Medieval 2: Total War Спрос на трейнер: возможно актуален. Дата выхода: 14 ноябрь 2006 Мин. системные требования: 2 GHz, 512 MB, 128 MB video Дополнительная информация: стратегия... отличная игрушка, год назад я от неё оторваться не мог играл сутками полторы недели или больше. Играл конечно без читов ) Статья сделана под CheatEngine 5.5 RUS (!) Реализованы чит-коды: 1. Деньги Т.к. они ломаются просто и в них нет ничего нового, то ищем адрес денег и пишем скрипт по нему. [ENABLE] alloc(newmem,2048) label(returnhere) newmem: mov [eax+04],#1000000 mov eax,[eax+04] test eax,eax jmp returnhere medieval2.exe+7F7071:>E8FF8D4C2410E8E4FBE7FF05800A0000YYxxxxxxxxB2FF7C108854240BC644 jmp newmem returnhere: [DISABLE] medieval2.exe+7F7071:>E8FF8D4C2410E8E4FBE7FF05800A0000YYxxxxxxxxB2FF7C108854240BC644 mov eax,[eax+04] test eax,eax dealloc(newmem) 2. Бесконечный ход (автор MasterGH) Для тех, кто не знает разные персонажи выполняют разного рода задачи: ассасины убивают жертву, торговцы могут кого-то разорить, священники могут обвинить в ереси. Успех того или иного действия характеризуется опытом персонажа. Наша задача сделать этот опыт максимальным. Возьмем, к примеру, нашего ассасина. В его структуре существующие значения 34 и 7 могут находиться рядом, но увы отсев группы значений ничем мне не помог. Вполне возможно что я не правильно его настроил... Тем не менее, проще выйти на структуру игрока отсеивая его координаты перемещения, а ещё проще по уменьшающимся шагам. Артмани здесь себя показала с хорошей стороны. В настройках ставим не округлять и ищем неизвестное правилом уменьшилось/увеличилось типов: 4 байта с точкой, 4 байта целое, 1 байт. В итоге нашлось пару адресов, заморозив которых мы получаем бесконечное передвижение ассасина. +c8: 100.00 //данные героя +1ec: 100.00 // копия данных, по которой выделяется область прохождения где [_pID] – указатель на адрес структуры героя. Пока _pID нам не нужно знать. Теперь перед нами два коэффициента, которые позволят ходить сколько угодно. Но нам надо ещё сделать так, чтобы мы могли ходить и выполнять свои цели со 100%-ной эффективностью. 3. 100% успех победы персонажей Для этого надо найти смещения адресов в которых расположен опыт. Я нашёл адрес ещё одного ассасина и сравнил характеристики обоих героев и по интуиции за минут пять нашёл нужные адреса )) +80: [[x]+0x38]=0…10 //опыт героя +c8: 100.00 //данные героя +1ec: 100.00 // копия данных, по которой выделяется область прохождения Итак я заморозил опыт моего ассина на максимуме: Теперь я попробую напасть на кого-то ) Хм… странное дело, почему же вероятность успеха увеличилась, но не на 100%. Чтобы понять, в чём дело ставлю бряк на чтение на адресе опыта. Выделяю асcасина направляю на жертву. Вот где оказались. EAX= 0000000A EBX= 11D803C8 ECX= 11D803F8 EDX= 00000003 ESI= 11D803C8 EDI= 0000001A ESP= 0012AE5C EBP= 0000002F EIP= 005AED2C В этом месте происходит сравнения опыта с нулём, меньше нуля, больше нуля, но меньше 10, больше 10. Чтобы не загромождать статью проделанными действиями я буду писать коротко. За помощью я обратился к OllyDbg и IDA. Я вышел по коду вверх и смотрел что происходит с опытом и как он преобразуется в проценты вероятности. Покажу только основные моменты без подробных комментариев, т.к. статья рассчитана на людей с подготовкой. Здесь было сравнение опыта с разными числами. Опыт в начале функции был равен 10, затем получилось 11. Т.е. было 10 опыта, затем стало 11. Затем мы умножаем 11 на 12 = 132. Откуда эти 12 взялись, будем разбираться дальше или не будем. Здесь мне бы пришлось делать очень много скриншотов (штук 15-20), мне это делать в лом, поэтому привожу конечный. Мы находимся всё в той же функции, тут мы видим получение «процентного числа» в игре в регистре сопроцессора. Оно равно 90,75. Это число на протяжении всего кода раза три видоизменялось. В тех местах, где я замечал изменения, я ставил плюсы в комментариях. Итак как было у ассина у которого было 10 опыта. 10+1=11 11*12=132 132*0,892=117,85 117,85*0,7 = 82.5 82.5 * 1,1 = 90,75 А теперь у ассасина у которого 3 опыта и который выбирает того же врага 3+1=4 (3 отличается от предыдущего) 4*12=48 48*0,892=42,85 42,85*0,7 = 30 30 * 1,0 = 30 (1,0 отличается от предыдущего) Теперь нападём этими аcсасинами на другого врага - священника Итак, как было у асcасина у которого было 10 опыта. 10+1=11 11*12=132 132*0,25=33 (0,25 отличается) 33*2 =66 66*0,7 = 46.2 42.6 * 1,1 = 50,82 Значит вероятность завалить священника 51% А теперь у асcасина у которого 3 опыта и который выбирает священника. 3+1=4 (делаем вывод, что опыт влияет на вероятность) 4*12=48 (делаем вывод, что 12 это константа) 48*0,25=12 (делаем вывод, что 0,25 привязана к священнику) 12*2 =24 (делаем вывод, что иногда может быть умножения на 2 в случаях священников) 24*0,7 = 16,8 (0,7 константа) 16,8* 1,0 = 16,8 (1,0 отличается от предыдущего) Я решил наугад пойти. У ассасина у которого 3 опыта, я решил сделать вероятность замочить священника 100%, оставляя ассину 3 опыта. К моему удивлению тот же код (который мы разбирали) стал работать и я вновь подставил 100% в регистр где надо (об этом ниже) и в итоге я замочил священника. Далее я решил замочить инквизитора, который часто не даёт никому покоя. Самое удивительное, что инквизиторов почти никогда невозможно убить, а теперь можно убить сразу. А пока запомним, как можно сделать вероятность убийства ассином при любом опыте и как можно сделать, чтобы он далеко ходил. 1) Убийство с одной попытки. Поскольку опыт не имеет значения, то взламывать на мой взгляд его не стоит, так даже будет интересней играть. [ENABLE] alloc(newmem,2048) label(_originalcode) label(_returnhere) newmem: cmp ebx,[pId] jne short _originalcode mov esi,#100 _originalcode: mov eax,[esp+1c] test eax,eax jmp _returnhere medieval2.exe+1979F9:>8BC18B0DA80262013BC18BF07C028BF1YYxxxxxxxxC0740983E80175FB8944 jmp newmem nop _returnhere: [DISABLE] medieval2.exe+1979F9:>8BC18B0DA80262013BC18BF07C028BF1YYxxxxxxxx90740983E80175FB8944 mov eax,[esp+1c] test eax,eax dealloc(newmem) 2) Беспрепятственное хождение Надо просто напросто заморозить значения ниже по смещениям (мы это сделаем в след. скрипте) [_pID]: +c8: 100.00 //данные героя, область прохождения +1ec: 100.00 // копия данных, по которой выделяется область прохождения 3) Нахождение _pid Давайте, определим, наконец, чему равен _pID. Для того чтобы трейнер был универсальным, нужно вытащить _pID из инструкции типа А. _pID должен указывать на то, что объекты расы наши. Инструкцию берём такую, которая работает при наведении курсора мыши на только нашего юнита, это как раз та инструкция которая читала адрес дальности хождения юнита. Она читает только юниты нашей расы. [ENABLE] globalalloc(newmem,2048) label(_returnhere) label(pId) registersymbol(pId) newmem: mov [pId],esi mov [esi+c8],447A0000 mov [esi+1ec],447A0000 ucomiss xmm0,[esi+000000c8] jmp _returnhere pId: dd 0 medieval2.exe+184A40:>558BEC83E4F883EC0C0F57C053568BF1YYxxxxxxxx00009FF6C444570F8B98 jmp newmem nop nop _returnhere: [DISABLE] medieval2.exe+184A40:>558BEC83E4F883EC0C0F57C053568BF1YYxxxxxxxx90909FF6C444570F8B98 ucomiss xmm0,[esi+000000c8] unregistersymbol(pId) dealloc(newmem) Итак, активируем скрипт по получению pid и все чит-коды… Результаты: Теперь ассасин (и другие из нашей расы) могут ходить на большие расстояния много раз и убивать каждого на своём пути. Но есть пока не решённая проблема. Теперь разбираемся, с тем как сделать убийство асcасином за ход игры больше одного раза касательно войска. Т.е. когда асcасин убивает игрока, тот умирает, а на его место встаёт другой (из строя армии), которого убить не представляется возможным в течении одного хода игры... 4. Снятие ограничения на ход игры Удобнее сделать поставленную задачу следующим способом. Взять не асcасинов, а шпионов. Т.к. шпион не убивает, а следит за жертвой. Жертва не умирает и новую искать не нужно. Если не включены читы,то включаем и возьмём 4-рёх шпионов, какие попадутся, но только чтобы один шпион мог шпионить. На рисунке ниже 3-тя структура шпиона, который может шпионить, а остальные не могут. На рисунке ниже класс-предок я обозначил скорее всего не правильно, но исправлять уже не буду )) Адреса, которые обозначены восклицательными знаками, могут быть ключевыми. Итак, первое смещение с восклицательным знаком было мной проверено и действительно, когда адрес по смещению +BC заморожен на FFFFFFFF, то ход не пропадает, в противном случае будет 25 в десятичной системе. Запомним. +80: [[x]+0x38]=0…10 //опыт героя +bc: 0xFFFFFFFF // активность хода героя +c8: 100.00 //данные героя +1ec: 100.00 // копия данных, по которой выделяется область прохождения Подправим чит-код (вы его увидите позже) и асcасин может убивать множество раз. Однако по ходу игры остались ещё проблемы, не полная вероятность саботажа асcасина, а также асcасин плохо видит карту. Решим проблему с саботажем, опять идём в ollydbg и снова ставлю бряк на чтении опыта асcасина и пытаюсь произвести саботаж. Эти действия аналогичны тому, как мы делали вероятность убийства. Ничего нового не будет, поэтому я не буду писать об этом, приведу только рисунки. Результат Итоговый скрипт на повышение вероятности при саботаже и заказных убийствах для асcасинов (также для других юнитов нашей рассы) [ENABLE] alloc(newmem,2048) label(_originalcode) newmem: cmp ebx,[pId] jne short _originalcode mov esi,#100 _originalcode: mov eax,[esp+1c] test eax,eax ret medieval2.exe+1979F9:>8BC18B0DA80262013BC18BF07C028BF1YYxxxxxxxxC0740983E80175FB8944 call newmem nop medieval2.exe+197BAC:>EB0E83F85F7D048BF0EB05BE5F000000YYxxxxxxxxC0740983E80175FB8944 call newmem nop [DISABLE] medieval2.exe+1979F9:>8BC18B0DA80262013BC18BF07C028BF1YYxxxxxxxx90740983E80175FB8944 mov eax,[esp+1c] test eax,eax medieval2.exe+197BAC:>EB0E83F85F7D048BF0EB05BE5F000000YYxxxxxxxx90740983E80175FB8944 mov eax,[esp+1c] test eax,eax dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения