Velheart У многопроцессорных немного другая проблема -- значения, лежащие не по кратным их размеру адресам, считываются за несколько циклов шины (почему так, я пока не понял. Может, leo объяснит? ). И если второй процессор в этот момент будет, например, записывать эту же область памяти, то можно получить искаженные данные. Проблема решается префиксом lock, который блокирует шину на все время выполнения команды.
Ну я в принципе и думал, что зачем делать, например InterlockedExchange с lock'ом, если и так все работает.
CrystalIC Когда ты записываешь JMP какой нибудь поток может быть остановлен на месте этих 5 байт. Я говорю про универсальный сплайсинг, когда неизвестно какие инструкции будут меняться.
K10 Не может. Вначале записывается мост на хэндлер, затем атомарно короткий переход на него. Универсальный сплайсинг не применим.
Для тупого меня можно поподробнее? Я вроде выше показал, как во время записи EIP другого потока может указывать на это место...
K10 Если ты перезаписываешь несколько инструкций, то EIP другого потока может указывать между этими инструкциями, что чревато. Вероятность этого, правда, мала, но она есть. CrystalIC если я правильно его понял, предлагает заменить первые два байта ф-ии ('mov edi, edi') коротким переходом на 7 байт назад, воспользовавашись тем фактом, что перед ф-ией всегда идет 5 nop'ов. Вот в эти пять nop'ов можно вписать уже настоящий переход любой дальности, без боязни что чей-то EIP туда указывает (ну если до тебя никто не постарался уже ). А дизассемблер длин может помочь найти приятное для патча место, чтобы не убить выполняющуюся программу. Это в случае, если не знаешь точно, куда писать будешь.
Mika0x65 Сенкс, теперь понятно, но эти 5 NOPов для хотпатчинга вроде появились начиная с какой-то версии?
K10 Да, но точно не знаю с какой. http://msmvps.com/blogs/kernelmustard/archive/2005/04/25/44413.aspx -- в первом комменте написано, как можно выявить наличие возможности патча, но сам я еще не проверял .
Запись однобайтовой инструкции по адресу перехвата для инициации исключения с предварительным редиректом диспетчера, как в юзермоде так и ядре рулит.)
А сдесь тема про модификацию секций кода, о беспаливности речь не идёт. Они все нубы и этим кодерам достаточно знать это. Сплайсинг мёртв, точки останова альтернатива. Если нужна беспаливность - а это следует знать лишь узкому кругу людей, то ни о какой модификации кода речь идти не может.
секретность мля... илито... Я например для перехвата чиста но нубски меняю адрес функции, сохраненный в глобальной переменной...
К примеру, как перехватить сервис ? Рэма дал способ, хороший, который только и можно использовать лет 10 назад. Как перехватить sysenter ? > Подмена MSR_SYSENTER_EIP ? Не палитсо ? Да, можно селектор кодового сегмента подменить - есчо лучше. Можно указатель на стек подменить - это есчо лучше, но всёравно - нубские способы. А как к примеру прерывания перехватывоть ? хз.. хз.. Рэма об этом не говорил - значит мы не можем. Но нет, это вы не можите. Скажу по секрету - мы юзаем подмену указателя(либо делаем его не валидным) на DPC стек в ETHREAD, после чего при свиче на этот поток планировщик загрузит в TSS этот указатель и любое прерывание есчо до начала исполнения первой инструкции ISR вызовет исключение, которое мы обработаем в KiDebugRoutine... Сплайсинг.. Копипаст форева!
CrystalIC Для практической ценности перехватов предлагаю исходить из того, что код исполняется с правами юзера и повышение привилегий не канает...
Повышение привилегий канает всюду. Для не практической юзай сплайсинг в юзермоде, пока не подрастёшь... Бери рку, хукай и медитируй на списке обнаруженных перехватов..
CrystalIC Вобщем думается мне ринг0 своет отживает. Все больше юзеров сидят под юзером, микрософт закрывает баги ведущие к повышению привелегий, аверы перекрывают все больше путей вызода в ринг0. Так что имхо рано или поздно илитные кернелмодовые техники станут малополезны для малвары. Не практичен код admin only и сомнительные сплоетные техники повышения привилегий (сегодня работает, завтра хз). То что я юзаю я уже сказал, и имхо это получше будет илитных кернел-сплоетных техник, хотя конечно не так дзенно, зато практично. Кстате у меня рку почему то не видит сплайс на GetOpenFileName... Может он ее не проверяет?
дрова уже под ринг3 крутятся? откуда такая инфа? как по мне, так компы все большее распространение получают, а пользоваться ими умеют далеко не многие и открывают новые.. это типа по существу? смелое заявление, но попахивает...