Всем доброго времени суток! Появилась необходимость в защите системной DLL от хуков.... А именно дллки WS2_32.dll Можно не всю, но хотя бы защитить функции Connect и Send\Recv Как можно сделать? Для чего это: Моё приложежение использует именно эти функции, но некоторые умные люди сделали "Бота" который позволяет изменять содержимое пакетов и т д(( Бот хукает Ws2_32.Connect и тем самым всё сниффает. Еще он использует LSP Можно ли как то обнаружить эти хуки, и сторонний LSP модуль ? Очень надеюсь на вашу помощь.
много способов, зависит от того как он "хукает"? сплайсинг на первые пять байт например обходится очень легко и удаляется так же...
В старой версии бота - хукали первые 5 байт. В новой заменяют адрес какого то перехода внутри функции + используют LSP модуль
r2max В принципе затея бессмысленная. Закрыв одну дверь, можно юзать другую. В простейшем самом случае, это когда код испорчен вредоносным и не годным приложением, всякие сплайсы и хотпатчи - восстановите проекцию с диска с заменой на проекцию не файловой секции. Это в юзере, в кмоде MmSecureVirtualMemory(). В аттаче семпл. В общем восстанавливать тоже не нужно ничего, подобные задачи решаются релоцированием модуля. Тоесть модуль загружается оригинальный, причём таким образом, чтобы фиксапы перенаправлялись в порченую проекцию только для секций данных. Если приложение многопоточное, то смысл имеет поправка в стеке SFC на дельту баз, чтобы сразу все потоки вернулись в восстановленный модуль и также с контекстами, короче это завётся S' & W' маршрутизацией. Но повторюсь, защита может работать если только известен механизм её. Против лома нет приёма, если нет другого лома (c) Great. Я вообще када последний раз хачил сокеты использовал довольно хитроумный алгоритм, так что никакой код не портятся и структуры провайдера тоже. Очевидно такой способ контроля нельзя обойти восстановлением проекции - она и так целая.
уходить на более низкие уровни, хотя тоже зависит от бото-писателей... писать драйвер протектор например... или передавать данные через свой драйвер...
зачем "уходить на более низкие уровни" нужно просто трафик шифровать, и защитить свои функции шифрование от реверса.
r2max Если вы и найдёте способы защиты в ring3 , то умельцы перейдут на ring0 уровень. Так что у вас только 1 вариант - шифрование.
Предлагаю бросить безнадёжные попытки написать "невзламываемую" защиту, а бота обнаруживать сигнатурно)) Т.е. скачали новую версию бота - смотрите какие ключи реестра появляются, какой процесс запущен и т.д. - добавляете детект. Ну и далее либо бан, либо ещё какие-то действия, от которых ботоводам худо станет. Да, я предлагаю "антивирус", но тут я считаю свою задачу он решит, т.к. на детект новой версии уйдёт минимум времени, а то и вобще автоматически можно будет.
r2max Если важно, чтобы пакет не меняли - цифровой подписи самопальным алгоритмом более чем достаточно Если нужно, чтобы и не читали - тогда только шифрование.
kejcerfcrv, это же код Indy. Неплохой способ, только в x64 не работает, из за флага AT_ROUND_TO_PAGE. Относительно шифрования, это довольно геморно, так как надо будет еще и на стороне сервера написать дешифровщик и перенаправление трафика уже в нужный порт. Как вариант, с заданным интервалом проверять crc кода процедур connect\send\recv. Кстати, в ring3 для ловли трафика не обьязательно хукать функции из ws2_32.dll, достаточно хукнуть ZwDeviceIoControlFile из ntdll.dll, так даже проще.
kejcerfcrv, о, Indy Как это флаг можно убрать? Тобишь можно сделать так, чтобы на x64 код тоже выполнял свои обьязанности? Как?
kejcerfcrv, ну речь ведь про флаг AT_ROUND_TO_PAGE Какой предлагайте вместо AT_ROUND_TO_PAGE указать? Все остальные Возвращают ошибку.
Flasher Нулём заполнить. Этот флаг в общем и не нужен. Вы всёравно указываете адрес проекции. Разберитесь вначале, не следует копипастить код, это не годно.