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

Craft The World - как различать Свой-Чужой?


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

В игре Craft The World одна инструкция проверяет жизнь у всех тварей(враги, свои, животные). Как из неё исключить своих? Это стратегия и своих может быть очень много.

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

Тему переименовал, и прошу в будущем создавать темы только с информативным названием.

Ответ на твой вопрос - напишу фильтр, это уже у нас на форуме неоднократно обсуждалось.

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

Тему переименовал, и прошу в будущем создавать темы только с информативным названием.

Ответ на твой вопрос - напишу фильтр, это уже у нас на форуме неоднократно обсуждалось.

Да что за форум у вас? Ответы всегда: сдедай, напиши. Согласись, если бы я знал как сделать то я бы сюда не писал а сделал бы. А раз я создал тему, то уже логично предположить что я без понятия что и как.
Ссылка на комментарий
Поделиться на другие сайты

 

Тему переименовал, и прошу в будущем создавать темы только с информативным названием.

Ответ на твой вопрос - напишу фильтр, это уже у нас на форуме неоднократно обсуждалось.

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

 

 

Так ты можешь узнать, как это сделать, почитав темы на нашем форуме. Вот буквально на днях Coder выложил видео по взлому Borderlands 2, так как раз он тоже делает фильтр свой/чужой. Посмотришь это видео, и сам и сделаешь. А форум у нас таков, что мы учим и помогаем научиться взламывать игры, а не даем готовых вариантов.

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

Полностью поддерживаю Xipho и Coder-a. Много раз обсуждалось. Хотя бы напиши что делал, что не получилось. Хоть лисстинги инструкций, данных регистров. 

 

Я вижу два способа: точный и не точные.

 

Точный

Игра всегда знает кто чужой, а кто свой. Одни игроки по этому условию (бинарному или иному) могут или не могут что-то делать с другими игроками. Твоя задача найти это условие и использовать его в инъекции кода.

 

Не точные (или экспериментальные)

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

 

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

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

Полностью поддерживаю Xipho и Coder-a. Много раз обсуждалось. Хотя бы напиши что делал, что не получилось. Хоть лисстинги инструкций, данных регистров. 

 

Я вижу два способа: точный и не точные.

 

Точный

Игра всегда знает кто чужой, а кто свой. Одни игроки по этому условию (бинарному или иному) могут или не могут что-то делать с другими игроками. Твоя задача найти это условие и использовать его в инъекции кода.

 

Не точные (или экспериментальные)

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

 

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

я ничего не делал, потому что не знаю как быть в такой ситуации. всё что я могу сделать - заноптать все инструкции. я так всегда и делаю. занопил и всё, больше не отнимает. а тут блин занопил, а оно на всех действует =(

comiss xmm0,[esi+000000B8] << это получает доступ. проверяет хп у всех.

jb 014F9E27

mov eax,[esi]

mov ecx,esi

call dword ptr [eax+00000090] << а тут наверное все они и сидят. я заходил туда шагом в CE когда бряк сработал. там много кода в котором я ничего не понял.

movss xmm0,[esi+000000B8]

ucomiss xmm0,xmm0

lahf

test ah,44

jnp 014F9E42

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

В игре Craft The World одна инструкция проверяет жизнь у всех тварей(враги, свои, животные). Как из неё исключить своих? Это стратегия и своих может быть очень много.

Ну что можно сказать!!!  :closeyes:
1: Находишь адрес жизней своего юнита допустим, делаешь бряк на запись в этот адрес.
2: Создаешь авто-скрипт на ту инструкция которая появиться. Типо такой mov [esi+24C],eax
Вот пример, метку exit я убрал, она просто не нужна:
 
[ENABLE]
Alloc(newmem,128)
Label(returnhere)
Label(originalcode)
 
newmem:
 
originalcode:
mov [esi+24C],eax
jmp returnhere
 
GAME.EXE+12345678:
jmp newmem
nop
returnhere:
 
[DISABLE]
Dealloc(newmem)
GAME.EXE+12345678:
mov [esi+24C],eax
 
3: Находишь адреса 2-3 юнитов врага.
Как найти адреса жизней врагов?
В отладчике жмёшь правой кнопкой мыши на брякнутую инструкцию и выбираешь:
"Найти адреса, получающие доступ к этой инструкции". Появится окошко для адресов.
После этого ударь по одному разу 2 врагов. И в этом окошке появиться адреса врагов.
Добавьте их в список, двойным нажатием левой кнопки мышки.
4: В отладчике жмёшь на "Инструменты > Анализ данных/Структур" появится окно, в этом окне
далее жмёшь "Файл > Добавить новую группу" штуки 2 для врагов, поскольку одна будет уже для тебя. 
5: В первую группу вбиваешь свой адрес жизней юнита, типо так 12345678-24C
24С - Это смещение в брякнутой инструкции к динамическому адресу.
Ну и врагов адреса также делаешь в 2 и 3 группу заносишь.
Во второй группе где адрес врага, жмёшь правой кнопки мышки и выбираешь "Изменить группу"
далее в новом окошке выбираешь группу номер 3 и подтвердить, то есть адреса 2 врагов будут в одной группе.
Потом в окне "Анализ структуры" жмёшь на "Структуры > Определить новую структуру" и жмёшь: "Подтвердить > Да > Подтвердить" после этого появиться смещения, адреса и значения. Находишь одно уникальное смещение, то есть твоё значение например 1, а у врагов должно быть по 0-ям. Рекомендую перезапустить игру и проделать заново анализ данных/структур, чтобы точно найти правильное смещение и значение.
 
Типо так:  :-P
Анализ структур:
 
Смещение-описание          Адрес: Значение         Адрес: Значение         Адрес: Значение
безымянная структура
0260 - 4 Bytes                        12345678 : 1                   12345678 : 0                  12345678 : 0
 
6: Запоминаем смещение 0260 и значение 1 и дорабатываем наш скрипт.
 
Примечание:
Я добавил ещё одну инструкцию в скрипт и изменил на её смещение,
которая находится чуть выше над этой mov [esi+24C],eax
 
Типо так, этот образец основан на стратегии Red Alert 2:-P
 
[ENABLE]                              // Включение скрипта.
Alloc(newmem,128)              // Выделенная память пустоты на 128 байт.
Label(returnhere)                 // Обратный прыжок.
Label(originalcode)              // Метка для оригинального кода.
Label(originalcode2)            // Добавил новую метку.
 
newmem:                              // Выделенная память
cmp byte ptr [esi+260],01     // Сравниваю общий регистр с нашим смещением и значение.
je originalcode2                    // Если равно, то прыгаю на полу изменённый код.
jmp originalcode                   // Делаю прыжок на оригинальный код.
 
originalcode2:                      // Метка для нашего кода бессмертия.
nop                                      // Здесь затёрли ненужную инструкцию test eax,eax
nop
mov [esi+24C],eax               // Оригинальная инструкция где сработал наш бряк.
jmp returnhere                    // Делаем прыжок обратно.

 
originalcode:                       // Метка для нашего оригинального кода.
test eax,eax                        // Оригинальная инструкция которая находится над брякнутой.
mov [esi+24C],eax             // Оригинальная инструкция где сработал наш бряк.
jmp returnhere                   // Делаем прыжок обратно.
 
GAME.EXE+87654321:      // Это модуль файла игры + смещение.
jmp newmem                      // Делаем прыжок на выделенную память.
nop                                    // Здесь затёрли остаток части оригинального кода.
nop                                    // Чтобы не нарушать логику кода, а то будет вылет из игры.
nop
returnhere:
 
[DISABLE]                        // Выключение скрипта.
Dealloc(newmem)            // Высвобождение выделенной памяти (Дабы не засорять память).
GAME.EXE+87654321:    // Это модуль файла игры + смещение.
test eax,eax                      // Оригинальная инструкция которая находится над брякнутой.
mov [esi+24C],eax            // Оригинальная инструкция где сработал наш бряк.

 

В игре Red Alert 2 скрипт работал, все твои созданные войска и построенные здания были бессмертными.

Хотя можно написать скрипт и по другому, вариантов много, кому как удобно.  :closeyes:

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

comiss xmm0,[esi+000000B8] << это получает доступ. проверяет хп у всех. Как я понял обращается постоянно. Нужно чуть подругому чтобы легче определить... Надо искать что пишет(writes) причем когда наносится урон смотреть сколько раз инструкция выполняется. Смотришь и выбираешь инструкцию(если она не одна) которая обратилась только когда был нанесен урон. Жмешь show in disacembler.

 

Затем в дизасемблере жмешь правой кнопкой на инструкцию и выбираешь what addres accsec появится окошечко которое будет следить с какими адресами будет работать инструкция(сразу поставь тип float в появившемся окне)

 

 

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

me. А потом уж сделай тоже самое с врагом так же добавь и переименуй в enemy.

 

 

После всей свистопляски должны получится хотя бы 4 адреса(2 твоих 2 врагов). Теперь идешь в dissect data structures и

создаешь 2 группы. 1 группа соответственно будет твоя а второя вражин. Добавляешь адреся в ячейки и так как инструкция [esi+000000B8] отнимаешь B8. к примеру выглядеть будет так 0BAC3DE-B0 можно так и писать cheatengine сам вычтет. и таким же образом заполняешь все 4 адреса. Жмешь define structure окей.

 

Появится куча смещений вот сидишь и сравниваешь какие смещения одинаковые у тебя и отличные у врагов

 

 

P.S. вангую что инструкция будет  movss [esi+000000B8],xmm0 :-D

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

krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался...

lamalamaz, да, высветились все адреса с которыми инструкция работает. вы правы, при появлении на экране любых живых существ инструкция comiss xmm0,[esi+000000B8] сразу получает ко всем доступ.

а те инструкции что пишут при нанесении урона не реагируют. тоесть если их занопить то урона больше нет, но когда к ним обращается эта инструкция comiss xmm0,[esi+000000B8] то всё равно меняется значение жизни.

и не правильно вангуешь, запись значения жизни выглядит не так movss [esi+000000B8],xmm0 а так movss xmm0, [esi+000000B8]

мне просто нужно чтобы именно эта инструкция не могла ничего делать. а она со ВСЕМИ живыми существами работает.

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

movss xmm0, [esi+000000B8] это чтение ,если судить по правилам ассемблера, считывается значение и отправляется в xmm0. Обычно запись происходит так [xxx],ххх. А чтение xxx,[xxx] если я ничего не путаю.

 

 Вот посмотри видео наглядно показывается как отделить своих от чужих средствами cheat engine. Не важно что там mass effect техника написания фильтра работает для всех игр, главное понять суть

 

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

krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался...

Да я вроде сверху понятно объяснил как да-чё.

Это типо как найти правильный адрес, а там тебе надо найти место адреса, правильное смещение + значение, вот и всё, ничего сложного.

Ну а насчёт образца от lamalamaz, как я понял это не стратежка же, походу дела там одна персона,

поэтому придётся скрипт + фильтр писать по другому, хотя может и сработает, в жизни всякое бывает.

Так же можешь использовать фильтр, как кусок адрес - регистра какого ни будь, если часть куска статична и работает только с тобой и на всех твоих юнитов.

 

Образец:

-------------------------------------------

Дополнительная информация

 

12345678 - test eax,eax

12345678 - mov [ebx,edx]

12345678 - mov [esi+16A8],eax

12345678 - mov [esi+16AC],eax

12345678 - push ebx

 

copy memory

Вероятное значение указателя: 00351028

 

 

EAX=000000FF      EDX=00000012     EBP=FFFFFFFA

EBX=45856F10      ESI=00351028       ESP=0088914A

ECX=FF88AA21     EDI=006DD720      EIP=12345678

 

Выше приведены знач. регистров после выполнения инструкции

--------------------------------------------------------------------------------------

Берём только SI, и часть адреса 1028, ну с остальными так же можно.

Только не используй IP (EBP), это смещение к нашему (общему) коду.

 

И прописываем в скрипте.

 

 

Типо так:

 

[ENABLE]

Alloc(newmem,128)
Label(returnhere)
Label(originalcode)
Label(сode)
 
newmem:

cmp si,1028                              // 1028 - Кусок адреса.

je code

jmp originalcode:

 

code:

mov word ptr [esi+B8],270F     // Добавляем всём своим 9999-жизней.

jmp returnhere                        // Можно попробовать и без неё, если не сработает скрипт. В большинстве случаев она ненужна.

 

originalcode:
comiss xmm0,[esi+B8]
jmp returnhere
 
GAME.EXE+12345678:
jmp newmem
nop                        // ХЗ не знаю сколько байт занимает эта инструкция comiss xmm0,[esi+B8], тебе видней.
nop
returnhere:
 
[DISABLE]
Dealloc(newmem)
GAME.EXE+12345678:
comiss xmm0,[esi+B8]
 
А с указателями запаришься делать фильтр сразу тебе скажу, по этому либо регистры, либо анализ данных.
В общем учись и читай здесь на форуме статейки их здесь полно.
 
Кстати гляжу у меня после этого репутация ЛАМЕР появилась...........АААААА!!!!!! ну афигеть блин.
Ненавижу ламеров, хоть убейся. Хотя бы юзер.
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

krocki, ты то понятно объяснил, я дошёл до структур, а дальше фиг знает что там искать надо. смещения какие-то, куда? чего? тьфу блин. ерунда какая-то.
lamalamaz, ты ничего не путаешь. но в моём случае так movss xmm0, [esi+000000B8] изменяются жизни. 

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

/*----------------------------------------------------------------------------*/

 

Привет! Можно ещё посмотреть вот [этот] мой пост. Возможно, чем-то поможет.

Особого значения при этом не имеет, через какой именно регистр и каким именно

образом проходят данные. Обычно в таких ситуациях нужно смотреть выше по коду,

как формируются операнды нужной команды (в твоём случае - что попадает в ESI и

XMM0 перед выполнением самой команды MOVSS).

 

/*----------------------------------------------------------------------------*/

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

keng, а если адрес врага не 123456+12 а 123456-12 ? то писать результат вычислений от смещений? просто тут 123456+12, 123456 начало структуры. А тут 123456-12 где начало структуры? она что смещается за саму себя?

Структура же создаёт после себя какие-то данные. А откуда она знает что там до неё находиться? 

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

/*----------------------------------------------------------------------------*/

 

Интересный вопрос, кстати говоря. Я только один раз сталкивался с такой

ситуацией, но придумал в итоге какой-то другой выход.

 

/*----------------------------------------------------------------------------*/

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

Xipho, Но у меня такое смещение есть. movss [ecx-00000364],xmm0 оно записывает жизнь каждому существу. В ecx-364 находится всегда один адрес, и он каждый раз меняется в зависимости от того кого ты бьёшь.

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

Xipho, Но у меня такое смещение есть. movss [ecx-00000364],xmm0 оно записывает жизнь каждому существу. В ecx-364 находится всегда один адрес, и он каждый раз меняется в зависимости от того кого ты бьёшь.

Значит ты нашёл не то, что нужно.

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

Coder, там только три инструкции. Всмысле которотые как-то влияют на хп. Всех примерно 10, из них: две с минусовым смещением и одна что-то проверяет - comiss. А остальные даже если нопишь ничего не меняется. 

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

Значит такой тут расклад

e577552f15e4.png

 

Как видим инструкции наносящие урон разные. Тут фильтр не используем(т.к. инструкции разные) конечно можно но инструкции пишут постоянно поэтому фигня получится)

 

И так пишем скрипт на 1 удар

 

....

mov [esi-000002FC],0 

addss xmm0,[esi-000002FC]

....

 

//можно вставить 0.1 как (float) 0.1  Ноль не рекомендую использовать нигде страшное это число все крашит и заставляет скрипты глючить или останавливаться на пол пути.

 

Чтобы мы были бессмертными смотрим какие адреса не обращаются к врагам а то есть

....

mov [edi-000002FC],(float)10

movss xmm0,[edi-000002FC]

....

 

После применения данных скриптов мы бессмертные а вся живность(враги кабаны курицы и т.д.) ломаются с 1 удара.

 

А теперь по поводу фильтров. Как видишь в таблице 3 адреса. 2 адреся жизней гномов(наши хп) и 1 адрес врага.

Заходим в dissect data structures смотрим

 

adac4847a6b7.png

 

Сверху адреса жизней + смещение я брал относительно инструкции commis

 

Видим смещение 78(все смещения находятся методом перебора) у нас значение worker(у всех гномов) у врага (slug).

 

Переводим string worker в HEX 4байта 6B726F77

 

Вот это число всегда для нас постоянно и только у нас.

 

То есть можно отталкиваться а то есть сравнивать если по смещению 78 значение 6B726F77(worker) то мы а если нет то не мы. Как писать скрипт...

 

newmem:

cmp [esi+00000078],6B726F77

je god

jne orig

 

 

god:

mov [esi+000000B8],(float)10

jmp returnhere

 

 

orig:

commis [esi+000000B8],xmm0

jmp returnhere

 

При таком фильтре будем бессмертны только мы.

 

P.S. при постоянном обращении инструкции 1hit написать затруднительно.

 


P.S.S инструкция наносящяя урон врагам действительно

movss [ecx-00000364],xmm0

в ecx лежит некий адрес а по смещению -364 адреса жизней врагов... И если эту инструкцию взять в оборот то так же можно сделать 1hit(то есть она полностью рабочая) .Не сталкивался с таким типом инструкций.

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

Значит такой тут расклад

e577552f15e4.png

 

Как видим инструкции наносящие урон разные. Тут фильтр не используем(т.к. инструкции разные) конечно можно но инструкции пишут постоянно поэтому фигня получится)

 

У меня вопрос, что за фигня может быть?

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

lamalamaz, о, спасибо тебе друг. теперь многое прояснилось :).

Те примеры что ты привёл, действительно работают когда просто нападаешь на них или они на тебя. Но мне надо немного другое. А именно "убить всех врагов одной кнопкой". Как это реализовать?

Так как у тебя сейчас есть игра, попробуй занопить comiss и умрут все. Абсолютно. Надо как-то выделить из этих всех - своих персонажей. Я пробовал, ничего не выходит :(

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

Попробуй так просто в commis засунуть 0(причем 0 засунется во всех врагов а в тебя нет т.к. фильтр)

 

Если 0 не прокатит суй (float)-1. :-D

 

newmem:

cmp [esi+00000078],6B726F77

je god

jne orig

 

 

god:

mov [esi+000000B8],(float)10

jmp returnhere

 

 

orig:

commis [esi+000000B8],0

jmp returnhere


А да и поставь хоткей на скрип - жмешь умирают все

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

lamalamaz, не этот comiss а другой. comiss xmm0, [esi+B8]. он у тебя на скрине один из верхних. попробуй у себя занопить их. это cmp [esi+00000078],6B726F77 уже не прокатит.

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

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

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

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