Подмена ссылок, находящихся в чёрном списке

Рейтинг: 0Ответов: 0Опубликовано: 28.03.2023

Столкнулся с такой делемой: хочу написать софт, который будет подменять ссылки, которые будет открывать юзер, на нужные мне. Но вот сейчас думаю, как можно это реализовать. Изначально думал о том, что буду искать окна браузера, далее внедряться в браузер и как-то менять ссылку, но что-то мне подсказывает, что это не совсем правильный вариант исполнения. Сейчас думаю над несколькими вариантами, например, написать прокси-сервер, который как раз будет запускаться у клиента, далее, как-то сделать так, чтобы браузеры выходили в сеть через него, следовательно, прокси-сервер будет получать запросы, далее просматривать их на наличие ссылок, и если попалась ссылка, которая внесена в определённый список, то он меняет на нужную мне ссылку(следовательно получится так, что откроется нужная мне ссылка, а не та, которую открывал пользователь). Далее появилась мысль написать сниффер, который будет просматривать 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("Ошибка, сервер не поднимается!");
        }
    }

}

}

Нашёл ещё такую проблему, что значения прокси устанавливаются в настройках, но само использование Прокси-сервера не включается, а если включить вручную, то запущенный прокси сервер всё равно не ловит никакие подключения. Также проблема и в том, что этот флаг всё время выключается сам, буквально сразу, как закрыть настройки.введите сюда описание изображения

Ответы

Ответов пока нет.