exorcise
-
Постов
66 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные exorcise
-
-
Названия функций в pdb файлах. Если они есть (указаны были в настройках компиляции), то функции можно прочитать.
Я уже опытным методом это понял =)))
Спасибо. Я думал сначала просто что в коде это, можно заюзать. Но получается что не в коде. Тогда получается что если к трейнеру добавить возможность читать этот файл, то и поставлять его нужно вместе с трейнером, так? а иначе откуда он читать то будет. Верно?
-
Ссылок у меня нет. Пиши в гугль и в соответствующие специализированные форумы по программированию и отладке.
А что в гугле то писать?
Отладочная информация в виде наличия названий функций это рудимент от дебажной версии.
А почему тогда у меня в релизной версии трейнера тоже есть названия функций, если смотреть через дизасм? Вроде же не должно быть. Как их спрятать? Пишу в VC++ clr
-
Тут 4 варианта:
1. Адрес через поиск байт по сигнатуре
2. Получение адреса из getAddress(string, local OPTIONAL). Это если на CE трейнер ваяешь
3. Отключить символы/метки как я писал, включить модульную адресацию. Тогда будет game.exe+offset
4. Отключить символы/метки как я писал, отключить модульную адресацию. Тогда будет тупо адрес
Я уже нашёл адрес. Мне в трейнере теперь надо запилить этот адрес. Хотелось бы в виде той метки.
Если пишешь на С++ смотри хелп по получению имени функции и адресов. Там вроде по отладочной информации из файла рядом.
А можно ссылку где можно посмотреть?
Пишу на C++.
-
В трейнере нужно использовать простую модульную адресацию. А это - это смещение от найденной ближайшей функции, имя найдено в ходе анализа файла дизассемблером се. То есть, в своём трейнере ты это применить не сможешь.
тоесть такой вид "SimSalabim.Game::SuperMagic+15" в трейнере совсем никак заюзать нельзя? так вроде красивше =)
А это - это смещение от найденной ближайшей функции, имя найдено в ходе анализа файла дизассемблером се
Тогда почему раньше, в предыдущей версии игры дизассемблер СЕ ничего не нашёл, в смысле названия функций, а сейчас в новой он вдруг уже нашёл?
-
Поковыряй настройки в окне дизассемблера. Меню View -> Show Symbols. Если нужная модульная адресация, то там же рядом.
Да, если отключить "метки" то показывает как обычно.
Но дело в том что всегда в играх встречал только такой вид адресов: "SimSalabim.exe+offset" и тут мне всё понятно. SimSalabim - точка входа в игру, offset - смещение до нашего адреса.
Но вот впервые я вижу это: "SimSalabim.Game::SuperMagic+15" и мне не понятно что тут и как? поэтому прошу чтобы мне объяснили что это и как использовать при написании трейнера? чтобы сразу в трейнере переходить к SimSalabim.Game::SuperMagic а от него уже смещаться.
-
CE в отладчике при включенной модульной адресации отображает не как обычно "SimSalabim.exe+offset" а вот так "SimSalabim.Game::SuperMagic+15"
Можете объяснить что это значит? И как этим воспользоваться при написании трейнера?
Обычно:
DWORD base = get_base(address);
DWORD function = base + get_offset(address);
А сейчас как быть то?
-
вообще закрашило игру. да и кстати не commis как ты пишешь а comiss
-
lamalamaz, не этот comiss а другой. comiss xmm0, [esi+B8]. он у тебя на скрине один из верхних. попробуй у себя занопить их. это cmp [esi+00000078],6B726F77 уже не прокатит.
-
lamalamaz, о, спасибо тебе друг. теперь многое прояснилось .
Те примеры что ты привёл, действительно работают когда просто нападаешь на них или они на тебя. Но мне надо немного другое. А именно "убить всех врагов одной кнопкой". Как это реализовать?
Так как у тебя сейчас есть игра, попробуй занопить comiss и умрут все. Абсолютно. Надо как-то выделить из этих всех - своих персонажей. Я пробовал, ничего не выходит
-
Coder, там только три инструкции. Всмысле которотые как-то влияют на хп. Всех примерно 10, из них: две с минусовым смещением и одна что-то проверяет - comiss. А остальные даже если нопишь ничего не меняется.
-
Xipho, Но у меня такое смещение есть. movss [ecx-00000364],xmm0 оно записывает жизнь каждому существу. В ecx-364 находится всегда один адрес, и он каждый раз меняется в зависимости от того кого ты бьёшь.
-
keng, а если адрес врага не 123456+12 а 123456-12 ? то писать результат вычислений от смещений? просто тут 123456+12, 123456 начало структуры. А тут 123456-12 где начало структуры? она что смещается за саму себя?
Структура же создаёт после себя какие-то данные. А откуда она знает что там до неё находиться?
-
krocki, ты то понятно объяснил, я дошёл до структур, а дальше фиг знает что там искать надо. смещения какие-то, куда? чего? тьфу блин. ерунда какая-то.
lamalamaz, ты ничего не путаешь. но в моём случае так movss xmm0, [esi+000000B8] изменяются жизни. -
krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался...
lamalamaz, да, высветились все адреса с которыми инструкция работает. вы правы, при появлении на экране любых живых существ инструкция comiss xmm0,[esi+000000B8] сразу получает ко всем доступ.
а те инструкции что пишут при нанесении урона не реагируют. тоесть если их занопить то урона больше нет, но когда к ним обращается эта инструкция comiss xmm0,[esi+000000B8] то всё равно меняется значение жизни.
и не правильно вангуешь, запись значения жизни выглядит не так movss [esi+000000B8],xmm0 а так movss xmm0, [esi+000000B8]
мне просто нужно чтобы именно эта инструкция не могла ничего делать. а она со ВСЕМИ живыми существами работает.
-
Полностью поддерживаю 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 одна инструкция проверяет жизнь у всех тварей(враги, свои, животные). Как из неё исключить своих? Это стратегия и своих может быть очень много.
-
keng, какой командой сделать так: xmm0, 10.0
-
а почему регистр xmm* не принимает никаких цифр? только цифры из адресов movss xmm0, [*] почему нельзя так movss xmm0, 100500? < это бы сразу всё решило
-
А если куда попало, то при вызове этого кода игрой может быть краш?
руками? Если я создаю трейнер. Мне нужно чтобы он это умел.
-
keng, спасибо за подробнейшее объяснение. А почему бы не писать в адресное пространство самой игры? Вот смотри. В игре есть огромный кусок байт-кода который содержит нули, тоесть 0x00000000. и такого пространства много. Почему бы не записать туда?
Но куда бы я не записал, как перевернуть адрес? Допустим я программно выделил память у меня есть адрес в DWORD памяти которую я выделил, как перевернуть эти байты?
а VirtualAllocEx тоже не простая штука. Ей ещё какие-то привилегии надо. Как их получить?
-
ну тут ты увеличил foo на 1 и переписал его. но &foo что делает? указатель на адрес содержажий это значение в памяти на данный момент? которая существует пока открыта программа.
я не понимаю как в конкретном адресе это сделать. инструкции ведь хранятся по определенным адресам и выполняются в определенный момент.
просто тут в этом примере значение храниться у тебя в программе. а у меня в дпугой. да ещё и в регистре.
просто если я напишу
mov [foo],eax
то регистр будет из моей программы, а надо из чужой.
-
А зачем вообще права менять? права стоят "чтение, выполнение" но всё прекрасно пишется в память. Это я имею ввиду запись байт-кода. А значения не пишутся, я ставлю полный доступ и не возвращаю исходное состояние.
DWORD GetMyData()
{
DWORD result = 0;
__asm mov result,ecx
return result;
}
^ это интересная штука. но как ей показать адрес с которого нужно считать ecx?
да, я сделаю инжект кода. я вот думал сделать так:
записать прямо в игре на пустой байт-код "00000000" своё значение например "500" и заменить инструкцию с "mov eax, [ecx]" на "mov eax, [game+offset]" но возникла проблема. Каждый запуск точка входа игры меняется и соответственно адрес game+offset тоже. Я то могу получить в dword этот адрес и смещение, но как его перевести в byte? или как записать dword в память. но ещё надо как-то "перевернуть" байты.
поэтому я подумал сложно это. может проще просто подменить ecx.
расскажите про getthreadcontext как им осуществить задуманное?
а про выделение памяти тоже думал. тогда я бы просто прыгнул туда. но если моя программа закроется то память тоже, и не будет работать. А если не освобождать память, то это же тоже плохо. Но это ладно, я хотел через malloc сделать, но не понял как.
-
Устанавливаешь брйкпоинт на этот кусок кода.
Когда брейпоинт срабатывает, вызываешь GetThreadContext, подменяешь нужный тебе регистр, вызываешь SetThreadContext.
Введи в поиске "аппаратный перехват", найдёшь мой топик с видеоуроком, там будет всё что тебе нужно, только малость код адаптировать придется.
Так я уже нашёл кусок кода. Есть адрес, как именно в этом месте подменить регистр? Ведь на каждом байте меняются регистры.
Можно пример как с адреса считать регистр, а затем переписать его?
Что За Адрес Такой? Вернее Модульная Адресация В Се
in Вопросы по созданию читов в одиночных играх
Опубликовано
Что за фигня у вас с форумом? то недоступен, то не существует, то вот ответы пропали.
Я писал что уже разобрался и тему можно закрыть.