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

exorcise

Пользователи
  • Постов

    66
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные exorcise

  1. Названия функций в pdb файлах. Если они есть (указаны были в настройках компиляции), то функции можно прочитать.

    Я уже опытным методом это понял =))) 

    Спасибо. Я думал сначала просто что в коде это, можно заюзать. Но получается что не в коде. Тогда получается что если к трейнеру добавить возможность читать этот файл, то и поставлять его нужно вместе с трейнером, так? а иначе откуда он читать то будет. Верно?

     

  2. Ссылок у меня нет. Пиши в гугль и в соответствующие специализированные форумы по программированию и отладке. 

     

    А что в гугле то писать?  :mellow:

     

     

    Отладочная информация в виде наличия названий функций это рудимент от дебажной версии. 

    А почему тогда у меня в релизной версии трейнера тоже есть названия функций, если смотреть через дизасм? Вроде же не должно быть. Как их спрятать? Пишу в VC++ clr

  3. Тут 4 варианта:

     

    1. Адрес через поиск байт по сигнатуре

    2. Получение адреса из getAddress(string, local OPTIONAL). Это если на CE трейнер ваяешь

    3. Отключить символы/метки как я писал, включить модульную адресацию. Тогда будет  game.exe+offset

    4. Отключить символы/метки как я писал, отключить модульную адресацию. Тогда будет тупо адрес

    Я уже нашёл адрес. Мне в трейнере теперь надо запилить этот адрес. Хотелось бы в виде той метки.

     

     

    Если пишешь на С++ смотри хелп по получению имени функции и адресов. Там вроде по отладочной информации из файла рядом.

    А можно ссылку где можно посмотреть?

     

    Пишу на C++. 

  4. В трейнере нужно использовать простую модульную адресацию. А это - это смещение от найденной ближайшей функции, имя найдено в ходе анализа файла дизассемблером се. То есть, в своём трейнере ты это применить не сможешь.

     

    тоесть такой вид "SimSalabim.Game::SuperMagic+15" в трейнере совсем никак заюзать нельзя? так вроде красивше =)

     

     

    А это - это смещение от найденной ближайшей функции, имя найдено в ходе анализа файла дизассемблером се

    Тогда почему раньше, в предыдущей версии игры дизассемблер СЕ ничего не нашёл, в смысле названия функций, а сейчас в новой он вдруг уже нашёл?

  5. Поковыряй настройки в окне дизассемблера. Меню View -> Show Symbols. Если нужная модульная адресация, то там же рядом. 

    Да, если отключить "метки" то показывает как обычно.

    Но дело в том что всегда в играх встречал только такой вид адресов: "SimSalabim.exe+offset" и тут мне всё понятно. SimSalabim - точка входа в игру, offset - смещение до нашего адреса.

    Но вот впервые я вижу это: "SimSalabim.Game::SuperMagic+15" и мне не понятно что тут и как? поэтому прошу чтобы мне объяснили что это и как использовать при написании трейнера? чтобы сразу в трейнере переходить к SimSalabim.Game::SuperMagic а от него уже смещаться.

  6. CE в отладчике при включенной модульной адресации отображает не как обычно "SimSalabim.exe+offset" а вот так "SimSalabim.Game::SuperMagic+15"

    Можете объяснить что это значит? И как этим воспользоваться при написании трейнера?

    Обычно:

    DWORD base = get_base(address);

    DWORD function = base + get_offset(address);

    А сейчас как быть то?

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

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

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

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

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

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

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

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

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

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

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

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

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

  13. Полностью поддерживаю 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

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

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

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

    Но куда бы я не записал, как перевернуть адрес? Допустим я программно выделил память у меня есть адрес в DWORD памяти которую я выделил, как перевернуть эти байты?


    а VirtualAllocEx тоже не простая штука. Ей ещё какие-то привилегии надо. Как их получить?

  16. ну тут ты увеличил foo на 1 и переписал его. но &foo что делает? указатель на адрес содержажий это значение в памяти на данный момент? которая существует пока открыта программа.

    я не понимаю как в конкретном адресе это сделать. инструкции ведь хранятся по определенным адресам и выполняются в определенный момент.

    просто тут в этом примере значение храниться у тебя в программе. а у меня в дпугой. да ещё и в регистре.

    просто если я напишу

    mov [foo],eax

    то регистр будет из моей программы, а надо из чужой.

  17. А зачем вообще права менять? права стоят "чтение, выполнение" но всё прекрасно пишется в память. Это я имею ввиду запись байт-кода. А значения не пишутся, я ставлю полный доступ и не возвращаю исходное состояние.

    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 сделать, но не понял как.

  18. Устанавливаешь брйкпоинт на этот кусок кода.

    Когда брейпоинт срабатывает, вызываешь GetThreadContext, подменяешь нужный тебе регистр, вызываешь SetThreadContext.

    Введи в поиске "аппаратный перехват", найдёшь мой топик с видеоуроком, там будет всё что тебе нужно, только малость код адаптировать придется.

    Так я уже нашёл кусок кода. Есть адрес, как именно в этом месте подменить регистр? Ведь на каждом байте меняются регистры.

    Можно пример как с адреса считать регистр, а затем переписать его?

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

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

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