Подмена ссылок, находящихся в чёрном списке
Столкнулся с такой делемой: хочу написать софт, который будет подменять ссылки, которые будет открывать юзер, на нужные мне. Но вот сейчас думаю, как можно это реализовать. Изначально думал о том, что буду искать окна браузера, далее внедряться в браузер и как-то менять ссылку, но что-то мне подсказывает, что это не совсем правильный вариант исполнения. Сейчас думаю над несколькими вариантами, например, написать прокси-сервер, который как раз будет запускаться у клиента, далее, как-то сделать так, чтобы браузеры выходили в сеть через него, следовательно, прокси-сервер будет получать запросы, далее просматривать их на наличие ссылок, и если попалась ссылка, которая внесена в определённый список, то он меняет на нужную мне ссылку(следовательно получится так, что откроется нужная мне ссылка, а не та, которую открывал пользователь). Далее появилась мысль написать сниффер, который будет просматривать http трафик, и делать те же манипуляции с пакетами, исправляя данные в них, и далее отправлять. Пожалуйста, если я что-то написал не так, подправьте меня, разъясните, где, что не так, и помогите, если можете. Само ТЗ звучит так: написать софт, который будет отслеживать открытие определённых ссылок, которые находятся в чёрном списке, в любом браузере на компе, далее, если эта определённая ссылка открывается, то софт должен редиректнуть на нужную мне ссылку(они будут прописаны(ссылки на аналогичные сервисы, только не запрещённые в проге)), либо же не редиректать, а ловить попытку открытия этих определённых ссылок на стадии запроса, а далее из менять. Короче, просто нужно сделать так, чтобы при попытки открытия, допустим, ютуба, открывался не ютуб, а твич.
Я попробовал сделать так, чтобы изменить глобальные настройки прокси, и, когда какой-либо браузер запускался, то сразу использовал установленные мной прокси, далее написал простейший клиент, который принимает ответы, приходящие на установленный прокси сервер(т.е. локалхост с определённым портом), но, когда запустил код, перезапустил браузер, поперезагружал страницы, ничего не получил, софт всё так же ждёт подключения и ответа? подскажите, пожалуйста, что не так?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using Microsoft.Win32;
namespace web
{
internal class Program
{
[DllImport("wininet.dll")]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
public const int INTERNET_OPTION_REFRESH = 37;
public const string ip = "127.0.0.1";
public const int port = 4848;
static void Main(string[] args)
{
if (args.Length == 0)
{
setProxy("127.0.0.1:4848", false);
Listener();
//return;
}
setProxy(args[0], true);
}
static void setProxy(string proxyhost, bool proxyEnabled)
{
const string userRoot = "HKEY_CURRENT_USER";
const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
const string keyName = userRoot + "\\" + subkey;
if (proxyhost.Length != 0)
Registry.SetValue(keyName, "ProxyServer", proxyhost);
Registry.SetValue(keyName, "ProxyEnable", proxyEnabled ? 1 : 0, RegistryValueKind.DWord);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
public static void Listener()
{
TcpListener server = new TcpListener(IPAddress.Parse(ip), port);
try
{
server.Start();
while (true)
{
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Входящее подключение " + client.Client.RemoteEndPoint);
while (true)
{
//WaitMessage(client);
var stream = client.GetStream(); //Создаём сетевой поток для работы с клиентом
byte[] data = new byte[1024];
int bytes = stream.Read(data, 0, data.Length);
string message = Encoding.UTF8.GetString(data, 0, bytes);
Console.WriteLine($"Сообщение: {message}");
//Prinyatie_command(message, client);
}
}
}
catch
{
Console.WriteLine("Ошибка, сервер не поднимается!");
}
}
}
}
Нашёл ещё такую проблему, что значения прокси устанавливаются в настройках, но само использование Прокси-сервера не включается, а если включить вручную, то запущенный прокси сервер всё равно не ловит никакие подключения. Также проблема и в том, что этот флаг всё время выключается сам, буквально сразу, как закрыть настройки.