Приветствую форум, хотел бы выслушать ваше мнение и по возможности оценку стоимости работы. С недавних пор занимаюсь небольшим ботоводствам в играх, запрос соответствующий. Необходимо читать/записывать небольшие фрагменты памяти в озу, многие игры сопротивляются и выдают блокировки. Как стоило бы поступить ? Давно раздумывал над модификацией биоса, получается, что программа, читающая память находится вне зоны видимости программы защиты игры, существуют ли варианты такой модификации уже или на сколько сложно/дорого реализовать такой механизм, например, на платах под Xeon2011 x79/x99? Чтение физической памяти вполне приемлемо. Надеюсь, никого не оскорбил таким вопросом.
А как предполагается передавать управление этому коду? Процессор умеет исполнять лишь код, который находится в оперативной памяти. Твой код уже должен быть где-то в памяти и должен быть доступен на исполнение (а значит, автоматически доступен и на чтение - и, следовательно, его можно найти). Компьютер запускается, загрузчик передаёт управление операционке, а дальше она получает процессор в эксклюзивное пользование и больше в биос система не лазит. Ты можешь вытащить микросхему биоса из платы во время работы системы - и всё продолжит работать. Единственное, что подходит под требования - System Management Mode. Это некий анклав, в котором крутится код, обычно отвечающий за управление питанием. Сразу после старта системы область SMM доступна на чтение и запись, но операционная система после загрузки туда своего кода "закрывает" его на доступ извне - и до следующей перезагрузки открыть доступ к SMM нельзя. Всё, что может процессор - перейти по заданному адресу на точку входа в этот анклав, исполнить его и вернуться обратно. Переход осуществляется через специальное прерывание SMI (System Management Interrupt). По итогу, чтобы туда попасть, надо вклиниться в загрузку системы и, например, не дать системе "закрыть" SMM или подделать код, который система туда записывает, чтобы выполнялся твой обработчик, который затем передаст управление оригинальному коду. И второй вариант - системы виртуализации. Написать гипервизор, который переведёт работающую систему под виртуализацию и скроет часть памяти, создав похожий на SMM анклав. Этот вариант проще, много примеров на гитхабе (Hyper-Platform, SimpleVisor, hvpp, HyperBone или мой Hyper-Bridge). --- Сообщение объединено, 30 мар 2022 --- На самом деле, ты неправильно ставишь задачу: тебе не нужны настолько хардкорные способы. Античит надо обходить, исходя из проверок, которые он делает. Ты можешь что-то перехватить в коде самого античита или в коде системы. Можешь даже написать эмулятор античита, чтобы сервер игры думал, что античит запущен, когда на его месте на самом деле будет пустышка (см. эмулятор BattleEye)
Можно же софтварный анклав сделать, как спец завещал, или как я делал в крекмише. Без шуток. Но кодец, который будет сам код в анклаве гонять, должен быть в памяти, да. Хотя, может быть, его можно разложить на ROP-цепочку. Но в целом это уже может быть не так очевидно для античитов.
Ну в целом да. Но, имхо, это намного сложнее, чем аппаратная виртуализация. Её один раз настроил (там хоть и большая, но линейная и документированная простыня, когда надо лишь аккуратно заполнить все поля в огромной структурке) - и всё работает. А с софтверными анклавами чёрт ногу сломит. Недаром Инди столько лет его писал, решал задачи из описателя в указатели - и всё подобное.
Ну он их решал, чтобы тысячи семплов гонять, если тебе нужно один единственный семпл закрыть, то это куда проще должно быть. У тебя ограниченное количество инструкций твоего семпла, которое меньше, чем все возможные инструкции, которые можно встретить в тысяче семплов. Но да, опять же, кому и что проще.
Были же еще какие-то EFI колбеки? Или это так не работает? Это что, напомните? Трассировщик, DBI? В таком случае == Это оно и есть, принципиального отличия не вижу.
Читал про Intel Processor Trace: https://habr.com/ru/company/dsec/blog/481692/ Даже раздобыл пару материнских плат из этой статьи. Только получается, что программа, вызывающая код из SMM находится в ос и ее видно.
В этом нет никакой необходимости, по крайней мере в рамках моего проекта. Достаточно только чтения памяти, управление происходит через железную имитацию мышки и клавиатуры, в дальнейшем планирую добавить нейрсеть, которая сгенерирует более "живое" управление мышью, на всякий случай.