Можно ли перехватывать DNS-запросы, используя LSP/SPI?
Я написал свой собственный LSP, который работает нормально. Тем не менее, я не могу поймать DNS-запросы. Например, нет такой функции, как WSPGetHostByName или WSPGetAddrInfo.
Мой lsp также поддерживает протокол UDP, но он не работает. Если я запускаю nslookup из консоли (cmd.exe), он кажется работающим, но я не могу поймать gethostbyname. Кто-нибудь знает как это сделать? Я не думаю, что написание NSP (Name Service Provider) является решением. Но я могу ошибаться.
Спасибо
2 ответа
Мы разработали LSP, который может "перехватывать" DNS-запросы. Единственный способ сделать это - подключиться ко всем функциям DNS, помните, что вам нужно решить несколько проблем:
- Вам нужно использовать хорошую библиотеку перехвата, которая будет поддерживать как 32-битный, так и 64-битный код.
- Лицензия на библиотеку должна быть подходящей для вашего приложения, есть несколько бесплатных библиотек, но они могут свободно использоваться только с бесплатными проектами.
- Когда вы перехватываете функции, вы должны убедиться, что не изменили некоторые значения, которые не основаны на IP, и отложите запрос до реальной функции.
Перехват UDP не будет работать, так как запросы поступают от MS DNS-клиента, поэтому, если вы не напишите драйвер низкого уровня, такой как: TDI, NDIS или WFP, вы должны перехватить функции (или написать NSP). NSLookup работает для вас, потому что он сам создает DNS-запросы.
Мое решение будет следующим:
Возьмите известный веб-браузер: firefox.exe
скопируйте его в новое имя: icefoxy.exe
измените EXE, чтобы он загружал пользовательскую DLL.
Я уже делал это несколько месяцев назад, но поскольку Firefox постоянно получает обновления, это означает:
ЛИБО: сохраняйте одну версию и не обновляйте ее (на свой страх и риск могут возникнуть проблемы с безопасностью, поскольку это означает, что уязвимости не будут исправлены)
ИЛИ: Обновляйте свою модификацию каждый раз, когда изменяется firefox.exe.
DLL может быть легко написана с использованием Delphi.
Модификация Firefox нуждается в языке ассемблера, если вы не знаете, как загрузить все необходимые файлы для самостоятельной компиляции Firefox, не имеете доступа к компилятору C/C++ (вероятно, mingw-gcc) и готовы к тому, что существует 2 взаимоисключающих стандарта C++, и если ваш g++ (часть пакета gcc) несовместим с вашим исходным кодом Firefox, то ваша попытка потерпит неудачу.
Я сам не эксперт по C++, поэтому я выбрал (по крайней мере для меня) более простой маршрут с использованием машинного языка, поэтому мне не нужно быть экспертом по C/C++, чтобы выполнить свою работу.
Некоторые относительные точки:
Какие функции должны быть перехвачены, чтобы перехватить весь доступ Firefox к DNS-серверам?
Я заметил, что если вы загружаете Delphi DLL в Icefoxy.exe (переименованную копию Firefox.exe), то цвета формы Delphi отсутствуют, например. если вы установите (либо в объекте ispector, либо в коде):
Label1.Color: = clLime;
Вы по-прежнему видите метку с цветом лайма. Я не знаю точной причины, но похоже, что Delphi VCL полагается на использование в EXE, и когда вы используете компоненты Delphi VCL внутри DLL вместо EXE, некоторые вещи (например, цвет) не работают должным образом,
Я был бы рад опубликовать мой код (как модификации на ассемблере для Firefox, так и исходный код Delphi DLL), но как / где я могу опубликовать его, чтобы он был общедоступным?
Я использовал Delphi 7 для создания DLL.
если вы используете Delphi 2009 или более позднюю версию, вам нужно быть особенно внимательным, чтобы любые строковые данные, передаваемые между кодом Delphi и любым кодом, отличным от Delphi, имели правильную кодировку, поскольку в Delphi 2009 и во всех более новых версиях тип String это псевдоним unicodestring, где в старых версиях Delphi тип String является псевдонимом AnsiString.
В то время, когда я делал это, это был всего лишь небольшой эксперимент, чтобы выяснить, могу ли я заставить Firefox загрузить свою собственную DLL, так как это адресное пространство процесса.
Другой интересной идеей было бы получить доступ к DOM (объектной модели документов) Firefox из DLL-библиотеки Delphi, что дало бы рабочую альтернативу использованию TWebBrowser (на основе ActiveX-версии Microsoft Internet Explorer).
Я знаю, что были такие компоненты, как TWebBrowser, основанные на Firefox, но их проблема в том, что никто не заботился об их обновлении в течение очень долгого времени, поэтому они совместимы только с какой-то очень устаревшей версией Firefox.