пожелание: пытайтесь кодить без махинаций и без "хек-приемов" Учитывайте, что до вас может стоять перехватчик и после вас. Неприятно когда кул-руткиты валят систему, а после восстановления кул-антивирусы валят ее повторно
Для этого пролога - да. Но и то: нужно считать значение в памяти по адресу [esp] (т.е. найти то, что было в ebp), а затем сменить контекст потоку, увеличив esp на 4 и изменив ebp с eip. И все это ради одной простейшей инструкции... Реализовать общий вариант отката инструкций - очень много делов, оно не стоит того. Действительно, лучший вариант, это
каждая(почти) апя вызывает низкоуровненвую функу или чтонить из нтдлл или то,что выполнит SYSENTER через определенную такую оболочку типа: Код (Text): mov eax,syscode mov edi,const call edi сплайсить такую оболочку довольно просто
Альтернатива - найти инструкцию, которая занимает размер больше либо равный инструкции перехода, типо 5 или 2 байта, в случае 2 это короткий переход и тогда предётся искать свободное место в пределах +-128 байт, но обычно перед функцией есть свободное место, скопировать код в буфер. Это исключит проверку Eip потока. Либо использовать DR.
a1ss не всегда применим такой сплайс, т.к. до SYSCALL'a выполнится еще куча r3-кода, насколько я понимаю...
ну и что? ну пусть даже не всегда, но в большинстве случаев.. зато дизасмить не надо и сплайс обходится в редактирование 4х байт адреса и собсно размещением шеллкода.
a1ss не буду разводить флейм) с синхронизацией проблема отпадает, это плюс.. за идею спс в любом случае
Если например использовать lock cmpxchg8b для атомарно записи 8 байт, то возникает вопрос, вот все говорят "А что если поток остановился на перазаписываемой инструкции, и при пробуждении он окажется на половине записной инструкции(например jmp 5байт)", поскольку операция атомарна то можно и не усыплять все потоки, так? потом если поток сам остановился( например какаято функция ожидания sleep,WaitForSingleObject. А не планировщик его усыпил когда у того кончился квант времени ) то eip этого потока полюбому не будет на нашей инструкции, а как быть с теми потоками которые остановил планировщик? это ведь происходит настолько быстро что пока будешь сканировать ситуация уже поменяется... Блин может я чего то не так понимаю, объясните пожалуйста... Реализовал перехват на основе lock cmpxchg8b, на однопроцессорной системе покачто работает стабильно
NDIS Приведи список функций которые хочешь контролировать и в каких библиотеках. Есть идея, смысл в том что какая-то функция передает управление на код посредством ссылки в секции данных, а функции которые хотим контролировать её вызывают, например memmove её мы можем перехватить модификацией определенного указателя в секции данных, в обработчике делаем раскрутку стека, т.е. получаем каждый адрес возврата в цепочке (естественно делаем это до определенного момента), берем этот адрес возврата и идем до пролога функции и уже этот адрес сравниваем с адресом функции, которую хотим контролировать, если равны, изменяем адрес возврата в стеке на нашу процедуру обработчик, либо делаем какие-то другие действия вообще смотреть надо для определенной функции. Из недостатков то, что контролировать так можно только некоторые функции и только на определенном этапе, но все же можно и довольно эффективно. Из плюсов определить начальное значение переменной довольно сложно, и такой перехват сложно обнаружить, покрайнимере я не видел программ которые каким либо образом проверяют секцию данных на модификации.
2FED Пока процессор не закончит исполнять инструкцию его прервать невозможно. Если она выполняется атомарно то процессор который первый захватил шину исполнит инструкцию, остальные его будут ждать.
не ну допустим функция начинается так push ebp ;---------;Поток остановился сдесь, eip указывает на следующию инструкцию. mov ebp,esp .... тут в это время мы вместо этого пролога записываем jmp mem32 и получается когда поток проснётся он вместо инструкции попадёт на адрес mem32. тоесть если поток сам себя усыпил врядли он на этом месте остановится, но как быть с планировщиком?
Запишется этот jmp mem32, нарушится последовательность, так нельзя делать. Следует модифицировать инструкцию размером равным либо большим новой.