

exorcise
Пользователи-
Постов
66 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент exorcise
-
Да, если отключить "метки" то показывает как обычно. Но дело в том что всегда в играх встречал только такой вид адресов: "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); А сейчас как быть то?
-
lamalamaz, о, спасибо тебе друг. теперь многое прояснилось . Те примеры что ты привёл, действительно работают когда просто нападаешь на них или они на тебя. Но мне надо немного другое. А именно "убить всех врагов одной кнопкой". Как это реализовать? Так как у тебя сейчас есть игра, попробуй занопить comiss и умрут все. Абсолютно. Надо как-то выделить из этих всех - своих персонажей. Я пробовал, ничего не выходит
-
keng, а если адрес врага не 123456+12 а 123456-12 ? то писать результат вычислений от смещений? просто тут 123456+12, 123456 начало структуры. А тут 123456-12 где начало структуры? она что смещается за саму себя? Структура же создаёт после себя какие-то данные. А откуда она знает что там до неё находиться?
-
krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался... lamalamaz, да, высветились все адреса с которыми инструкция работает. вы правы, при появлении на экране любых живых существ инструкция comiss xmm0,[esi+000000B8] сразу получает ко всем доступ. а те инструкции что пишут при нанесении урона не реагируют. тоесть если их занопить то урона больше нет, но когда к ним обращается эта инструкция comiss xmm0,[esi+000000B8] то всё равно меняется значение жизни. и не правильно вангуешь, запись значения жизни выглядит не так movss [esi+000000B8],xmm0 а так movss xmm0, [esi+000000B8] мне просто нужно чтобы именно эта инструкция не могла ничего делать. а она со ВСЕМИ живыми существами работает.
-
я ничего не делал, потому что не знаю как быть в такой ситуации. всё что я могу сделать - заноптать все инструкции. я так всегда и делаю. занопил и всё, больше не отнимает. а тут блин занопил, а оно на всех действует =( 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
-
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 сделать, но не понял как.