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

[C#]как поменять и применить прокси в системе?

Ags1of

RAM
Пользователь
Регистрация
26.11.2021
Сообщения
122
Реакции
1
Всем доброй ночи, пишу я, значит, простенький прокси сервер, который ставлю на localhost, но проблема заключается в том, что, допустим, браузеры не берут системные прокси, даже когда в параметрах Windows => Прокси-сервер => Настройка прокси вручную стоит включённый флаг, в котором в качестве адреса указан 127.0.0.1 и в качестве порта - выбранный мной порт. Значения адреса и порта я выставлял программно через реестр вот так:
C#:
[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;
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);
    }



У меня создаётся такое впечатление, что просто эта функция не работает, так как я поднимал сервер с помощью TcpListener'а, но он ничего не хватает из запросов, но, ради эксперимента, я решил скачать Firefox, в котором я вручную поставил настройки прокси-сервера (т.е.) поставил в адрес 127.0.0.1 и выбранный мною порт, в итоге, написанный мной сервер хватает запросы из фаерфокса, но, когда я снова ставлю в фаерфокс системные настройки прокси, и в настройках ставлю флаг "Вкл" на ручную настройку проксей и туда ставлю локалхост
1680138357453.png

, то опять написанный мною сервер никакие запросы не хватает. Подскажите, пожалуйста, что делать?

Только что потестировал и понял, чтобы настройка прокси применялась в системе, надо нажать эту кнопку:
1680138382437.png
, подскажите, пожалуйста, как её можно нажать программно, т.е. сохранить настройки проксей?
 
no error in debugging?

try:
Код:
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 (! IPAddress.TryParse(proxyhost, out IPAddress ip) && ! Uri.CheckHostName(proxyhost))
    {
        Console.WriteLine("IP ili khost nedeystvitelen");
        return;
    }
if (!int. TryParse(proxyhost. Split(':')[1], out int port) || port < 1 || port > 65500)
    {
        Console.WriteLine("plokhoy port ispolzuyte diapazon 1-65500");
        return;
    }

    try
    {
        Ping ping = new Ping();
PingReply reply = ping. Send(ip, 1000);
if (reply. Status != IPStatus.Success)
        {
            Console.WriteLine("Net mogu svyazatsya s serverom");
            return;
        }

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);
    }
    catch (Exception ex)
    {
Console.WriteLine("oshibka: " + ex. Message);
    }
}
 
Последнее редактирование:
no error in debugging?

try:
Код:
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 (! IPAddress.TryParse(proxyhost, out IPAddress ip) && ! Uri.CheckHostName(proxyhost))
    {
        Console.WriteLine("IP ili khost nedeystvitelen");
        return;
    }
if (!int. TryParse(proxyhost. Split(':')[1], out int port) || port < 1 || port > 65500)
    {
        Console.WriteLine("plokhoy port ispolzuyte diapazon 1-65500");
        return;
    }

    try
    {
        Ping ping = new Ping();
PingReply reply = ping. Send(ip, 1000);
if (reply. Status != IPStatus.Success)
        {
            Console.WriteLine("Net mogu svyazatsya s serverom");
            return;
        }

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);
    }
    catch (Exception ex)
    {
Console.WriteLine("oshibka: " + ex. Message);
    }
}
я тут чуть-чуть переделал код вот этот
C#:
if (!IPAddress.TryParse(proxyhost, out IPAddress ip) && Uri.CheckHostName(proxyhost) == UriHostNameType.Unknown)
            {
                Console.WriteLine("IP ili khost nedeystvitelen");
                return;
            }

так как была ошибка у вас в строке if (! IPAddress.TryParse(proxyhost, out IPAddress ip) && ! Uri.CheckHostName(proxyhost)), а именно в ! Uri.CheckHostName(proxyhost) , так как оно возвращает не bool значение, а UriHostNameType, и я так предполагаю, что вы имели ввиду, что вернётся такой ответ UriHostNameType.Unknown, тогда ip или host недействителен. Так и произошло, тут как раз программа и заканчивается, ведь у меня возвращается этот тип. Подскажите, пожалуйста, что делать? Как поставить значение локалхоста, если я передаю туда 127.0.0.1, то вылазит эта ошибка, пробовал http://localhost, http://127.0.0.1 всё равно та же проблема, что делать?
 
C#:
static void setProxy(string proxyAddress, bool proxyEnabled)
{
    const string userRoot = "HKEY_CURRENT_USER";
    const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
    const string keyName = userRoot + "\\" + subkey;

if (! IPAddress.TryParse(proxyAddress, out IPAddress ip))
    {
        Console.WriteLine("IP ili...");
        return;
    }
if (!int. TryParse(proxyAddress.Split(':')[1], out int port) || port < 1 || port > 65500)
    {
        Console.WriteLine("port net work use 1-65500.");
        return;
    }
 
what .net are you using also
 
C#:
static void setProxy(string proxyAddress, bool proxyEnabled)
{
    const string userRoot = "HKEY_CURRENT_USER";
    const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
    const string keyName = userRoot + "\\" + subkey;

if (! IPAddress.TryParse(proxyAddress, out IPAddress ip))
    {
        Console.WriteLine("IP ili...");
        return;
    }
if (!int. TryParse(proxyAddress.Split(':')[1], out int port) || port < 1 || port > 65500)
    {
        Console.WriteLine("port net work use 1-65500.");
        return;
    }
1680198795817.png

вот эта ошибка
 
C#:
static void setProxy(string proxyAddress, bool proxyEnabled)
{
    const string userRoot = "HKEY_CURRENT_USER";
    const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
    const string keyName = userRoot + "\\" + subkey;

if (! IPAddress.TryParse(proxyAddress, out IPAddress ip))
    {
        Console.WriteLine("IP ili...");
        return;
    }
if (!int. TryParse(proxyAddress.Split(':')[1], out int port) || port < 1 || port > 65500)
    {
        Console.WriteLine("port net work use 1-65500.");
        return;
    }
я разобрался в проблеме, которая была тут. Мы забыли сделать сплит прокси адреса, ведь он передаётся вместе портом, а мы его в IPAddres.TryParse() передавали вместе с портом, а надо только ip было. Теперь ошибка не вылазит, но всё равно прокси в систему не сохраняются
 
ps> netsh interface ipv4 show tcpconnetions ?
 


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