Перехват / перенаправление исходящих http-соединений в Windows
Я смотрю, чтобы перенаправить исходящие http-соединения (которые не используют системный прокси) на машине Windows.
Фон:
У меня есть устаревшее программное обеспечение, которое взаимодействует с уже не существующим веб-сервисом. Я эмулировал этот сервис в простом настольном приложении и хотел бы перенаправить исходящие http-запросы в это приложение.
Экспериментально я использовал файл хостов Windows для успешного перенаправления на localhost, но это нецелесообразно, так как у меня есть другие сервисы, которым нужно прослушивать http-порт 80 по умолчанию, и я не хочу настраивать другой физический сервер только для этого
Устаревшее программное обеспечение не использует системный прокси-сервер, поэтому такие решения, как FiddlerCore, не будут работать (к сожалению, потому что это потрясающе!)
Я заметил, что EasyHook упоминался в подобных вопросах в связи с winsock, но мой опыт программирования на более низком уровне чрезвычайно ограничен, и прежде чем я отправлюсь в долгое и запутанное путешествие, я хотел бы проверить, что я на правильном пути!
Итак, возможно ли теоретически перехватывать и перенаправлять исходящий http-трафик, который не использует системный прокси, путем перехвата winsock (предпочтительно с easyHook в C#)?
Простой ответ да / нет будет хорошо, некоторые рассуждения или даже лучшая документация будут фантастическими
1 ответ
Я делал это много раз, так что это абсолютно возможно. Используйте следующие шаги, чтобы начать.
- Пусть ваша программа запустит целевое приложение с
CreateProcess
и передатьCREATE_SUSPENDED
кdwCreationFlags
аргумент. Это запустит целевое приложение, но не запустит выполнение. - Вставьте DLL, которая содержит ваши функции "батут".
- Подцепить функцию Winsock
gethostbyname
, - Вызов
ResumeThread
на целевой процесс обрабатывает основной поток, чтобы начать выполнение. - В вашем хуке вызовите функцию реального
gethostbyname
Функция Winsock, когда она возвращает действительный указатель наhostent
Структура изменяет адрес данных, чтобы он указывал на ваше петлевое устройство (localhost).
В зависимости от того, как работает целевое приложение, вам может понадобиться подключить дополнительные функции Winsock, но не gethostbyname
обычно достаточно для этого сценария.
Возможно, вы захотите написать функции перехвата, которые находятся в вашей DLL на C++ или C. Использование C#, вероятно, здесь не вариант, плюс он будет включать множество зависимостей, которые могут вызвать конфликты с целевым приложением.