• 独辟蹊径”之动态切换进程代理IP


    前言

    项目中遇到这样一个需求,需要动态切换指定进程Sockets5代理IP,目前了解到可通过编写驱动拦截或者劫持LSP实现,LSP劫持不太稳定,驱动无疑是相对较好的解决方案,奈何水平不足便有了这"蹊径"。

    初步尝试

    首先想到的是通过代码设置系统全局代理,让目标进程乖乖的"看过来":

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    public static void SetProxy(string ip_port)

    {

        //打开注册表

        RegistryKey regKey = Registry.CurrentUser;

        string SubKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";

        RegistryKey? optionKey = regKey.OpenSubKey(SubKeyPath, true);

        //更改健值,设置代理,

        optionKey?.SetValue("ProxyEnable"1);

        if (ip_port.Length == 0)

        {

            optionKey?.SetValue("ProxyEnable"0);

        }

        optionKey?.SetValue("ProxyServer""socks5://"+ip_port);

        optionKey?.SetValue("ProxyOverride""localhost;127.0.0.*;");

        // Configure the WebRequest to use the SOCKS5 proxy

        WebRequest.DefaultWebProxy = new WebProxy("socks5://"+ ip_port, true, null);

        //激活代理设置

        InternetSetOption(039, IntPtr.Zero, 0);

        InternetSetOption(037, IntPtr.Zero, 0);

    }

    设置后发现系统代理确实设置成功并生效了,浏览器查询一番,发现走的是自己设置的代理IP了,高高兴兴的打开目标应用,发现网络请求仍然走本地了,反复尝试了多次仍未成功,不确定是不是应用层设置系统代理的姿势不对,知道的小伙伴欢迎指点一二。

    有捷径

    自写代码行不通,便寻思有没有更简单的方案,一阵胡思乱想后,突然想起曾经玩游戏用过的代理软件Proxifier,当初不就通过这玩意实现进程IP访问吗,一阵操作后,发现该软件确实能够拦截目标进程的所有网络请求: 

    暗自窃喜下,毕竟前进了一步嘛,回望初心,咋是想通过自己的代码动态切换目标进程网络请求IP,怀着敬畏之心寻找这"大名鼎鼎"的代理软件的API接口,如果说有接口能够供我们的程序调用,那不就"借尸还魂"了嘛。

    再出发

    真不能报太大希望,一阵骚操作后,并这调皮的软件没有发现任何可以调用的接口,失望过后不能前功尽弃,既然他不给接口,那就给他增加个"接口",胡乱研究一番后,发现有两种方式可以实现:
    1、通过界面修改代理IP
     


    2、通过导入配置文件
     


    由于配置文件里面记录了代理IP及代理规则等信息,咋只用在自己的代码中修改配置文件,并主动让Proxifier加载一次该配置,不就OK了嘛。

    上菜

    附加Proxifier,并在ReadFile上下断,文件=》导入配置文件:
     


    多次堆栈回溯后,来到打开文件选择框,并导入配置的关键代码处:
     


    提取出导入配置文件部分ASM:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    00337224 | E8 09A6F6FF              | call                              | [0x4A7360]

    00337229 | FF75 F0                  | push dword ptr ss:[ebp-10]                              | 配置文件路径

    0033722C 8B78 04                  | mov edi,dword ptr ds:[eax+4]                            |

    0033722F 8B07                     | mov eax,dword ptr ds:[edi]                              |

    00337231 8BB0 A4000000            | mov esi,dword ptr ds:[eax+A4]                           |

    00337237 8BCE                     | mov ecx,esi                                             |

    00337239 | FF15 204D4600            | call dword ptr ds:[464D20]                              |

    0033723F 8BCF                     | mov ecx,edi                                             | esi==[[[0x4A7360]+4]]+a4

    00337241 | FFD6                     | call esi                                                | 载入配置文件

    测试调用过程中,发现需要在主线程中调用才能生效,轮番折腾后,将ASM代码封装在Dll中,并将Dll注入到Proxifier进程中调用成功。

    收工

    等等,不忘初心,我们要通过自己的代码动态切换目标进程网络请求IP,好像还差了点啥,捋一捋整个流程吧:
    1、利用代理软件Proxifier设置指定进程走sockets5代理,ok
    2、在自己的工程中通过编写代码动态将代理IP写入Proxifier配置文件,ok
    3、由于Proxifier没有提供接口加载配置文件,所以通过编写dll代码并注入到Proxifier中主动调用加载配置文件的call,ok
    4、自己的工程和Proxifier通过共享内存传递需要动态设置的代理IP,哦就是你了。
    哦,还差点什么吗,没有,如图:

  • 相关阅读:
    使用mybatis拦截器模糊查询统一处理%_字符
    QML的Popup遇到的坑
    科技对金融业的告白信,有百融云创的落款
    【积累】机器学习知识
    3款录屏录制软件,打造专业级视频内容
    WebDAV之π-Disk派盘 + 天悦日记
    vue 获取上一周和获取下一周的日期时间
    Twins: Revisiting the Design of Spatial Attention in Vision Transformers
    Linux - 进一步理解 文件系统 - inode - 机械硬盘
    【java刷算法】牛客—剑指offer3栈、数组、递归、二分法的初步练习
  • 原文地址:https://blog.csdn.net/jmm18363027827/article/details/133185601