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