exorcise Опубликовано 3 сентября, 2014 Поделиться Опубликовано 3 сентября, 2014 В игре Craft The World одна инструкция проверяет жизнь у всех тварей(враги, свои, животные). Как из неё исключить своих? Это стратегия и своих может быть очень много. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 3 сентября, 2014 Поделиться Опубликовано 3 сентября, 2014 Тему переименовал, и прошу в будущем создавать темы только с информативным названием.Ответ на твой вопрос - напишу фильтр, это уже у нас на форуме неоднократно обсуждалось. Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 3 сентября, 2014 Автор Поделиться Опубликовано 3 сентября, 2014 Тему переименовал, и прошу в будущем создавать темы только с информативным названием.Ответ на твой вопрос - напишу фильтр, это уже у нас на форуме неоднократно обсуждалось.Да что за форум у вас? Ответы всегда: сдедай, напиши. Согласись, если бы я знал как сделать то я бы сюда не писал а сделал бы. А раз я создал тему, то уже логично предположить что я без понятия что и как. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 3 сентября, 2014 Поделиться Опубликовано 3 сентября, 2014 Тему переименовал, и прошу в будущем создавать темы только с информативным названием.Ответ на твой вопрос - напишу фильтр, это уже у нас на форуме неоднократно обсуждалось.Да что за форум у вас? Ответы всегда: сдедай, напиши. Согласись, если бы я знал как сделать то я бы сюда не писал а сделал бы. А раз я создал тему, то уже логично предположить что я без понятия что и как. Так ты можешь узнать, как это сделать, почитав темы на нашем форуме. Вот буквально на днях Coder выложил видео по взлому Borderlands 2, так как раз он тоже делает фильтр свой/чужой. Посмотришь это видео, и сам и сделаешь. А форум у нас таков, что мы учим и помогаем научиться взламывать игры, а не даем готовых вариантов. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 3 сентября, 2014 Поделиться Опубликовано 3 сентября, 2014 Полностью поддерживаю Xipho и Coder-a. Много раз обсуждалось. Хотя бы напиши что делал, что не получилось. Хоть лисстинги инструкций, данных регистров. Я вижу два способа: точный и не точные. ТочныйИгра всегда знает кто чужой, а кто свой. Одни игроки по этому условию (бинарному или иному) могут или не могут что-то делать с другими игроками. Твоя задача найти это условие и использовать его в инъекции кода. Не точные (или экспериментальные) Сравнивая структуры между игроками. Или же поиск инструкций, которые бы работали с одной группой юнитов и не работали бы с другой группой. Тут теоретизировать особо смысла нет, надо ковыряться с игрой. Так что ковыряйсо пока не получится. Пиши сюда в тему, что и как делал Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 3 сентября, 2014 Автор Поделиться Опубликовано 3 сентября, 2014 Полностью поддерживаю Xipho и Coder-a. Много раз обсуждалось. Хотя бы напиши что делал, что не получилось. Хоть лисстинги инструкций, данных регистров. Я вижу два способа: точный и не точные. ТочныйИгра всегда знает кто чужой, а кто свой. Одни игроки по этому условию (бинарному или иному) могут или не могут что-то делать с другими игроками. Твоя задача найти это условие и использовать его в инъекции кода. Не точные (или экспериментальные) Сравнивая структуры между игроками. Или же поиск инструкций, которые бы работали с одной группой юнитов и не работали бы с другой группой. Тут теоретизировать особо смысла нет, надо ковыряться с игрой. Так что ковыряйсо пока не получится. Пиши сюда в тему, что и как делаля ничего не делал, потому что не знаю как быть в такой ситуации. всё что я могу сделать - заноптать все инструкции. я так всегда и делаю. занопил и всё, больше не отнимает. а тут блин занопил, а оно на всех действует =(comiss xmm0,[esi+000000B8] << это получает доступ. проверяет хп у всех.jb 014F9E27mov eax,[esi]mov ecx,esicall dword ptr [eax+00000090] << а тут наверное все они и сидят. я заходил туда шагом в CE когда бряк сработал. там много кода в котором я ничего не понял.movss xmm0,[esi+000000B8]ucomiss xmm0,xmm0lahftest ah,44jnp 014F9E42 Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 3 сентября, 2014 Поделиться Опубликовано 3 сентября, 2014 В игре Craft The World одна инструкция проверяет жизнь у всех тварей(враги, свои, животные). Как из неё исключить своих? Это стратегия и своих может быть очень много.Ну что можно сказать!!! 1: Находишь адрес жизней своего юнита допустим, делаешь бряк на запись в этот адрес.2: Создаешь авто-скрипт на ту инструкция которая появиться. Типо такой mov [esi+24C],eaxВот пример, метку exit я убрал, она просто не нужна: [ENABLE]Alloc(newmem,128)Label(returnhere)Label(originalcode) newmem: originalcode:mov [esi+24C],eaxjmp returnhere GAME.EXE+12345678:jmp newmemnopreturnhere: [DISABLE]Dealloc(newmem)GAME.EXE+12345678:mov [esi+24C],eax 3: Находишь адреса 2-3 юнитов врага.Как найти адреса жизней врагов?В отладчике жмёшь правой кнопкой мыши на брякнутую инструкцию и выбираешь:"Найти адреса, получающие доступ к этой инструкции". Появится окошко для адресов.После этого ударь по одному разу 2 врагов. И в этом окошке появиться адреса врагов.Добавьте их в список, двойным нажатием левой кнопки мышки.4: В отладчике жмёшь на "Инструменты > Анализ данных/Структур" появится окно, в этом окнедалее жмёшь "Файл > Добавить новую группу" штуки 2 для врагов, поскольку одна будет уже для тебя. 5: В первую группу вбиваешь свой адрес жизней юнита, типо так 12345678-24C24С - Это смещение в брякнутой инструкции к динамическому адресу.Ну и врагов адреса также делаешь в 2 и 3 группу заносишь.Во второй группе где адрес врага, жмёшь правой кнопки мышки и выбираешь "Изменить группу"далее в новом окошке выбираешь группу номер 3 и подтвердить, то есть адреса 2 врагов будут в одной группе.Потом в окне "Анализ структуры" жмёшь на "Структуры > Определить новую структуру" и жмёшь: "Подтвердить > Да > Подтвердить" после этого появиться смещения, адреса и значения. Находишь одно уникальное смещение, то есть твоё значение например 1, а у врагов должно быть по 0-ям. Рекомендую перезапустить игру и проделать заново анализ данных/структур, чтобы точно найти правильное смещение и значение. Типо так: Анализ структур: Смещение-описание Адрес: Значение Адрес: Значение Адрес: Значениебезымянная структура0260 - 4 Bytes 12345678 : 1 12345678 : 0 12345678 : 0 6: Запоминаем смещение 0260 и значение 1 и дорабатываем наш скрипт. Примечание:Я добавил ещё одну инструкцию в скрипт и изменил на её смещение,которая находится чуть выше над этой mov [esi+24C],eax Типо так, этот образец основан на стратегии Red Alert 2: [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,eaxnopmov [esi+24C],eax // Оригинальная инструкция где сработал наш бряк.jmp returnhere // Делаем прыжок обратно. originalcode: // Метка для нашего оригинального кода.test eax,eax // Оригинальная инструкция которая находится над брякнутой.mov [esi+24C],eax // Оригинальная инструкция где сработал наш бряк.jmp returnhere // Делаем прыжок обратно. GAME.EXE+87654321: // Это модуль файла игры + смещение.jmp newmem // Делаем прыжок на выделенную память.nop // Здесь затёрли остаток части оригинального кода.nop // Чтобы не нарушать логику кода, а то будет вылет из игры.nopreturnhere: [DISABLE] // Выключение скрипта.Dealloc(newmem) // Высвобождение выделенной памяти (Дабы не засорять память).GAME.EXE+87654321: // Это модуль файла игры + смещение.test eax,eax // Оригинальная инструкция которая находится над брякнутой.mov [esi+24C],eax // Оригинальная инструкция где сработал наш бряк. В игре Red Alert 2 скрипт работал, все твои созданные войска и построенные здания были бессмертными.Хотя можно написать скрипт и по другому, вариантов много, кому как удобно. 4 Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 3 сентября, 2014 Поделиться Опубликовано 3 сентября, 2014 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 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 4 сентября, 2014 Автор Поделиться Опубликовано 4 сентября, 2014 krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался...lamalamaz, да, высветились все адреса с которыми инструкция работает. вы правы, при появлении на экране любых живых существ инструкция comiss xmm0,[esi+000000B8] сразу получает ко всем доступ.а те инструкции что пишут при нанесении урона не реагируют. тоесть если их занопить то урона больше нет, но когда к ним обращается эта инструкция comiss xmm0,[esi+000000B8] то всё равно меняется значение жизни.и не правильно вангуешь, запись значения жизни выглядит не так movss [esi+000000B8],xmm0 а так movss xmm0, [esi+000000B8]мне просто нужно чтобы именно эта инструкция не могла ничего делать. а она со ВСЕМИ живыми существами работает. Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 4 сентября, 2014 Поделиться Опубликовано 4 сентября, 2014 movss xmm0, [esi+000000B8] это чтение ,если судить по правилам ассемблера, считывается значение и отправляется в xmm0. Обычно запись происходит так [xxx],ххх. А чтение xxx,[xxx] если я ничего не путаю. Вот посмотри видео наглядно показывается как отделить своих от чужих средствами cheat engine. Не важно что там mass effect техника написания фильтра работает для всех игр, главное понять суть 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 5 сентября, 2014 Поделиться Опубликовано 5 сентября, 2014 krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался...Да я вроде сверху понятно объяснил как да-чё.Это типо как найти правильный адрес, а там тебе надо найти место адреса, правильное смещение + значение, вот и всё, ничего сложного.Ну а насчёт образца от lamalamaz, как я понял это не стратежка же, походу дела там одна персона,поэтому придётся скрипт + фильтр писать по другому, хотя может и сработает, в жизни всякое бывает.Так же можешь использовать фильтр, как кусок адрес - регистра какого ни будь, если часть куска статична и работает только с тобой и на всех твоих юнитов. Образец:-------------------------------------------Дополнительная информация 12345678 - test eax,eax12345678 - mov [ebx,edx]12345678 - mov [esi+16A8],eax12345678 - mov [esi+16AC],eax12345678 - push ebx copy memoryВероятное значение указателя: 00351028 EAX=000000FF EDX=00000012 EBP=FFFFFFFAEBX=45856F10 ESI=00351028 ESP=0088914AECX=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 codejmp originalcode: code:mov word ptr [esi+B8],270F // Добавляем всём своим 9999-жизней.jmp returnhere // Можно попробовать и без неё, если не сработает скрипт. В большинстве случаев она ненужна. originalcode:comiss xmm0,[esi+B8]jmp returnhere GAME.EXE+12345678:jmp newmemnop // ХЗ не знаю сколько байт занимает эта инструкция comiss xmm0,[esi+B8], тебе видней.nopreturnhere: [DISABLE]Dealloc(newmem)GAME.EXE+12345678:comiss xmm0,[esi+B8] А с указателями запаришься делать фильтр сразу тебе скажу, по этому либо регистры, либо анализ данных.В общем учись и читай здесь на форуме статейки их здесь полно. Кстати гляжу у меня после этого репутация ЛАМЕР появилась...........АААААА!!!!!! ну афигеть блин.Ненавижу ламеров, хоть убейся. Хотя бы юзер. 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 6 сентября, 2014 Автор Поделиться Опубликовано 6 сентября, 2014 krocki, ты то понятно объяснил, я дошёл до структур, а дальше фиг знает что там искать надо. смещения какие-то, куда? чего? тьфу блин. ерунда какая-то.lamalamaz, ты ничего не путаешь. но в моём случае так movss xmm0, [esi+000000B8] изменяются жизни. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 6 сентября, 2014 Поделиться Опубликовано 6 сентября, 2014 /*----------------------------------------------------------------------------*/ Привет! Можно ещё посмотреть вот [этот] мой пост. Возможно, чем-то поможет. Особого значения при этом не имеет, через какой именно регистр и каким именно образом проходят данные. Обычно в таких ситуациях нужно смотреть выше по коду, как формируются операнды нужной команды (в твоём случае - что попадает в ESI и XMM0 перед выполнением самой команды MOVSS). /*----------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 6 сентября, 2014 Автор Поделиться Опубликовано 6 сентября, 2014 keng, а если адрес врага не 123456+12 а 123456-12 ? то писать результат вычислений от смещений? просто тут 123456+12, 123456 начало структуры. А тут 123456-12 где начало структуры? она что смещается за саму себя?Структура же создаёт после себя какие-то данные. А откуда она знает что там до неё находиться? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 7 сентября, 2014 Поделиться Опубликовано 7 сентября, 2014 /*----------------------------------------------------------------------------*/ Интересный вопрос, кстати говоря. Я только один раз сталкивался с такой ситуацией, но придумал в итоге какой-то другой выход. /*----------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 7 сентября, 2014 Поделиться Опубликовано 7 сентября, 2014 Ни разу не сталкивался с тем, чтобы смещение было отрицательным. Это противоречит принципам ООП. Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 7 сентября, 2014 Автор Поделиться Опубликовано 7 сентября, 2014 Xipho, Но у меня такое смещение есть. movss [ecx-00000364],xmm0 оно записывает жизнь каждому существу. В ecx-364 находится всегда один адрес, и он каждый раз меняется в зависимости от того кого ты бьёшь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 7 сентября, 2014 Поделиться Опубликовано 7 сентября, 2014 Xipho, Но у меня такое смещение есть. movss [ecx-00000364],xmm0 оно записывает жизнь каждому существу. В ecx-364 находится всегда один адрес, и он каждый раз меняется в зависимости от того кого ты бьёшь.Значит ты нашёл не то, что нужно. Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 7 сентября, 2014 Автор Поделиться Опубликовано 7 сентября, 2014 Coder, там только три инструкции. Всмысле которотые как-то влияют на хп. Всех примерно 10, из них: две с минусовым смещением и одна что-то проверяет - comiss. А остальные даже если нопишь ничего не меняется. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 7 сентября, 2014 Поделиться Опубликовано 7 сентября, 2014 Тебе нужно найти инструкцию работающую с адресами здоровья всех юнитов. Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 7 сентября, 2014 Поделиться Опубликовано 7 сентября, 2014 Значит такой тут расклад Как видим инструкции наносящие урон разные. Тут фильтр не используем(т.к. инструкции разные) конечно можно но инструкции пишут постоянно поэтому фигня получится) И так пишем скрипт на 1 удар ....mov [esi-000002FC],0 addss xmm0,[esi-000002FC].... //можно вставить 0.1 как (float) 0.1 Ноль не рекомендую использовать нигде страшное это число все крашит и заставляет скрипты глючить или останавливаться на пол пути. Чтобы мы были бессмертными смотрим какие адреса не обращаются к врагам а то есть....mov [edi-000002FC],(float)10movss xmm0,[edi-000002FC].... После применения данных скриптов мы бессмертные а вся живность(враги кабаны курицы и т.д.) ломаются с 1 удара. А теперь по поводу фильтров. Как видишь в таблице 3 адреса. 2 адреся жизней гномов(наши хп) и 1 адрес врага.Заходим в dissect data structures смотрим Сверху адреса жизней + смещение я брал относительно инструкции commis Видим смещение 78(все смещения находятся методом перебора) у нас значение worker(у всех гномов) у врага (slug). Переводим string worker в HEX 4байта 6B726F77 Вот это число всегда для нас постоянно и только у нас. То есть можно отталкиваться а то есть сравнивать если по смещению 78 значение 6B726F77(worker) то мы а если нет то не мы. Как писать скрипт... newmem:cmp [esi+00000078],6B726F77je godjne orig god:mov [esi+000000B8],(float)10jmp returnhere orig:commis [esi+000000B8],xmm0jmp returnhere При таком фильтре будем бессмертны только мы. P.S. при постоянном обращении инструкции 1hit написать затруднительно. P.S.S инструкция наносящяя урон врагам действительноmovss [ecx-00000364],xmm0в ecx лежит некий адрес а по смещению -364 адреса жизней врагов... И если эту инструкцию взять в оборот то так же можно сделать 1hit(то есть она полностью рабочая) .Не сталкивался с таким типом инструкций. 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 8 сентября, 2014 Поделиться Опубликовано 8 сентября, 2014 Значит такой тут расклад Как видим инструкции наносящие урон разные. Тут фильтр не используем(т.к. инструкции разные) конечно можно но инструкции пишут постоянно поэтому фигня получится) У меня вопрос, что за фигня может быть? Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 8 сентября, 2014 Автор Поделиться Опубликовано 8 сентября, 2014 lamalamaz, о, спасибо тебе друг. теперь многое прояснилось .Те примеры что ты привёл, действительно работают когда просто нападаешь на них или они на тебя. Но мне надо немного другое. А именно "убить всех врагов одной кнопкой". Как это реализовать?Так как у тебя сейчас есть игра, попробуй занопить comiss и умрут все. Абсолютно. Надо как-то выделить из этих всех - своих персонажей. Я пробовал, ничего не выходит Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 8 сентября, 2014 Поделиться Опубликовано 8 сентября, 2014 Попробуй так просто в commis засунуть 0(причем 0 засунется во всех врагов а в тебя нет т.к. фильтр) Если 0 не прокатит суй (float)-1. newmem:cmp [esi+00000078],6B726F77je godjne orig god:mov [esi+000000B8],(float)10jmp returnhere orig:commis [esi+000000B8],0jmp returnhereА да и поставь хоткей на скрип - жмешь умирают все Ссылка на комментарий Поделиться на другие сайты Поделиться
exorcise Опубликовано 8 сентября, 2014 Автор Поделиться Опубликовано 8 сентября, 2014 lamalamaz, не этот comiss а другой. comiss xmm0, [esi+B8]. он у тебя на скрине один из верхних. попробуй у себя занопить их. это cmp [esi+00000078],6B726F77 уже не прокатит. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения