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

Medieval 2: Total War


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

Игра: Medieval 2: Total War

post-3-0-38953500-1395065071_thumb.jpg

Спрос на трейнер: возможно актуален.

Дата выхода: 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)
 

Для тех, кто не знает разные персонажи выполняют разного рода задачи: ассасины убивают жертву, торговцы могут кого-то разорить, священники могут обвинить в ереси. Успех того или иного действия характеризуется опытом персонажа. Наша задача сделать этот опыт максимальным.

post-3-0-12454900-1395064979_thumb.jpg

Возьмем, к примеру, нашего ассасина. В его структуре существующие значения 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 // копия данных, по которой выделяется область прохождения

 

post-3-0-03217900-1395064987_thumb.png

Итак я заморозил опыт моего ассина на максимуме:

post-3-0-87384200-1395064991_thumb.jpg

Теперь я попробую напасть на кого-то )

post-3-0-14780300-1395064997_thumb.jpg

Хм… странное дело, почему же вероятность успеха увеличилась, но не на 100%.

Чтобы понять, в чём дело ставлю бряк на чтение на адресе опыта. Выделяю асcасина направляю на жертву.

Вот где оказались.

post-3-0-34870200-1395065001_thumb.png

EAX= 0000000A
EBX= 11D803C8
ECX= 11D803F8
EDX= 00000003
ESI= 11D803C8
EDI= 0000001A
ESP= 0012AE5C
EBP= 0000002F
EIP= 005AED2C

В этом месте происходит сравнения опыта с нулём, меньше нуля, больше нуля, но меньше 10, больше 10. Чтобы не загромождать статью проделанными действиями я буду писать коротко. За помощью я обратился к OllyDbg и IDA. Я вышел по коду вверх и смотрел что происходит с опытом и как он преобразуется в проценты вероятности.

Покажу только основные моменты без подробных комментариев, т.к. статья рассчитана на людей с подготовкой.

post-3-0-50954700-1395065005_thumb.png

Здесь было сравнение опыта с разными числами.

Опыт в начале функции был равен 10, затем получилось 11.

Т.е. было 10 опыта, затем стало 11.

Затем мы умножаем 11 на 12 = 132. Откуда эти 12 взялись, будем разбираться дальше или не будем.

Здесь мне бы пришлось делать очень много скриншотов (штук 15-20), мне это делать в лом, поэтому привожу конечный.

post-3-0-51242100-1395065009_thumb.png

Мы находимся всё в той же функции, тут мы видим получение «процентного числа» в игре в регистре сопроцессора. Оно равно 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 отличается от предыдущего)

post-3-0-80374900-1395065017_thumb.jpg

Я решил наугад пойти. У ассасина у которого 3 опыта, я решил сделать вероятность замочить священника 100%, оставляя ассину 3 опыта.

К моему удивлению тот же код (который мы разбирали) стал работать и я вновь подставил 100% в регистр где надо (об этом ниже) и в итоге я замочил священника.

Далее я решил замочить инквизитора, который часто не даёт никому покоя. Самое удивительное, что инквизиторов почти никогда невозможно убить, а теперь можно убить сразу.

А пока запомним, как можно сделать вероятность убийства ассином при любом опыте и как можно сделать, чтобы он далеко ходил.

1) Убийство с одной попытки.

post-3-0-19716800-1395065025_thumb.png

Поскольку опыт не имеет значения, то взламывать на мой взгляд его не стоит, так даже будет интересней играть.

 

[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 и все чит-коды…

Результаты:

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

post-3-0-49069000-1395065032_thumb.jpg

post-3-0-22441800-1395065038_thumb.jpg

Но есть пока не решённая проблема.

Теперь разбираемся, с тем как сделать убийство асcасином за ход игры больше одного раза касательно войска. Т.е. когда асcасин убивает игрока, тот умирает, а на его место встаёт другой (из строя армии), которого убить не представляется возможным в течении одного хода игры...

 
4. Снятие ограничения на ход игры
 

Удобнее сделать поставленную задачу следующим способом. Взять не асcасинов, а шпионов. Т.к. шпион не убивает, а следит за жертвой. Жертва не умирает и новую искать не нужно.

Если не включены читы,то включаем и возьмём 4-рёх шпионов, какие попадутся, но только чтобы один шпион мог шпионить. На рисунке ниже 3-тя структура шпиона, который может шпионить, а остальные не могут.

На рисунке ниже класс-предок я обозначил скорее всего не правильно, но исправлять уже не буду ))

post-3-0-08893800-1395065449_thumb.gif

Адреса, которые обозначены восклицательными знаками, могут быть ключевыми. Итак, первое смещение с восклицательным знаком было мной проверено и действительно, когда адрес по смещению +BC заморожен на FFFFFFFF, то ход не пропадает, в противном случае будет 25 в десятичной системе. Запомним.


+80: [[x]+0x38]=0…10 //опыт героя
+bc: 0xFFFFFFFF // активность хода героя
+c8: 100.00 //данные героя
+1ec: 100.00 // копия данных, по которой выделяется область прохождения
 

Подправим чит-код (вы его увидите позже) и асcасин может убивать множество раз. Однако по ходу игры остались ещё проблемы, не полная вероятность саботажа асcасина, а также асcасин плохо видит карту.

Решим проблему с саботажем, опять идём в ollydbg и снова ставлю бряк на чтении опыта асcасина и пытаюсь произвести саботаж. Эти действия аналогичны тому, как мы делали вероятность убийства. Ничего нового не будет, поэтому я не буду писать об этом, приведу только рисунки.

post-3-0-43232000-1395065045_thumb.png

Результат

post-3-0-70020100-1395065366_thumb.png

Итоговый скрипт на повышение вероятности при саботаже и заказных убийствах для ас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)

 

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

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

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

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