• XSS.stack #1 – первый литературный журнал от юзеров форума

[C#] Подмена ссылки

Ags1of

RAM
Пользователь
Регистрация
26.11.2021
Сообщения
122
Реакции
1
Приветствую всех. Столкнулся с такой делемой: хочу написать софт, который будет подменять ссылки, которые будет открывать юзер, на нужные мне. Но вот сейчас думаю, как можно это реализовать. Изначально думал о том, что буду искать окна браузера, далее внедряться в браузер и как-то менять ссылку, но что-то мне подсказывает, что это не совсем правильный вариант исполнения. Сейчас думаю над несколькими вариантами, например, написать прокси-сервер, который как раз будет запускаться у клиента, далее, как-то сделать так, чтобы браузеры выходили в сеть через него, следовательно, прокси-сервер будет получать запросы, далее просматривать их на наличие ссылок, и если попалась ссылка, которая внесена в определённый список, то он меняет на нужную мне ссылку(следовательно получится так, что откроется нужная мне ссылка, а не та, которую открывал пользователь). Далее появилась мысль написать сниффер, который будет просматривать http трафик, и делать те же манипуляции с пакетами, исправляя данные в них, и далее отправлять. Пожалуйста, если я что-то написал не так, подправьте меня, разъясните, где, что не так, и помогите, если можете.
Само ТЗ звучит так: написать софт, который будет отслеживать открытие определённых ссылок, которые находятся в чёрном списке, в любом браузере на компе, далее, если эта определённая ссылка открывается, то софт должен редиректнуть на нужную мне ссылку(они будут прописаны(ссылки на аналогичные сервисы, только не запрещённые в проге)), либо же не редиректать, а ловить попытку открытия этих определённых ссылок на стадии запроса, а далее из менять.
Короче, просто нужно сделать так, чтобы при попытки открытия, допустим, ютуба, открывался не ютуб, а твич.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
попробуй редактирование hosts и ipconfig /flushdns
правда с сертификатами проблемы будут, но если тебе http нужно только, то пойдет вполне.
далее внедряться в браузер и как-то менять ссылку
ну это явно не с C#.
Если не пойдет способ выше, то можешь попробовать WinDivery https://github.com/basil00/Divert (с их сайта качни бинари).
Грузишь их драйвер, подгружаешь функции из длл через pinvoke и используешь.
Наверное это самый действенный способ.
 
Последнее редактирование:
попробуй редактирование hosts и ipconfug /flushdns
правда с сертификатами проблемы будут, но если тебе http нужно только, то пойдет вполне.

ну это явно не с C#.
Если не пойдет способ выше, то можешь попробовать WinDivery https://github.com/basil00/Divert (с их сайта качни бинари).
Грузишь их драйвер, подгружаешь функции из длл через pinvoke и используешь.
Наверное это самый действенный способ.
Я попробовал сделать так, чтобы изменить глобальные настройки прокси, и, когда какой-либо браузер запускался, то сразу использовал установленные мной прокси, далее написал простейший клиент, который принимает ответы, приходящие на установленный прокси сервер(т.е. локалхост с определённым портом), но, когда запустил код, перезапустил браузер, поперезагружал страницы, ничего не получил, софт всё так же ждёт подключения и ответа? подскажите, пожалуйста, что не так?
C#:
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("Ошибка, сервер не поднимается!");
            }
        }

    }

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


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх