首页
社区
课程
招聘
[原创]独辟蹊径”之动态切换进程代理IP
发表于: 2023-9-13 12:24 11595

[原创]独辟蹊径”之动态切换进程代理IP

2023-9-13 12:24
11595

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

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

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

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

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

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

2、通过导入配置文件

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

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

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

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

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

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

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.*;<local>");
 
    // Configure the WebRequest to use the SOCKS5 proxy
    WebRequest.DefaultWebProxy = new WebProxy("socks5://"+ ip_port, true, null);
 
 
    //激活代理设置
    InternetSetOption(0, 39, IntPtr.Zero, 0);
    InternetSetOption(0, 37, IntPtr.Zero, 0);
}
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);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2023-9-13 12:27 被kinglyu编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (11)
雪    币: 95
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Proxifier不支持udp,好多应用或者游戏用不了。
全局一个是会影响电脑上其它应用的速度,二个是如果用户量上来后,服务器也吃不消。
用wfp或者tdi吧。直接可以拿到pid后就是局部代理了。
2023-9-13 16:55
0
雪    币: 30050
活跃值: (2422)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谁说LSP不稳定的?原来的Proxifier就是基于LSP的。
2023-9-13 17:14
0
雪    币: 2266
活跃值: (6613)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
4

得知道代理的原理啊,这个SetProxy相当于就是在环境变量里面声明了一个公共变量,但是具体走不走代理还是得取决于程序用不用个变量,浏览器会读取这个变量并设置代理,但是绝大多软件是不会管的,Proxifier好像是是进程级别(还是驱动级别)的劫持,让程序强制走代理

最后于 2023-9-13 17:27 被fjqisba编辑 ,原因:
2023-9-13 17:26
0
雪    币: 57
活跃值: (796)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
laosanls Proxifier不支持udp,好多应用或者游戏用不了。 全局一个是会影响电脑上其它应用的速度,二个是如果用户量上来后,服务器也吃不消。 用wfp或者tdi吧。直接可以拿到pid后就是局部代理了。
多谢指点,wfp或tdi都是驱动级的,目前暂时是考虑在应用层解决,目前实现的是利用Proxifier的代理规则实现拦截指定进程发包,并让其走动态获取的代理。
2023-9-13 19:49
0
雪    币: 2948
活跃值: (30846)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2023-9-15 09:51
1
雪    币: 6124
活跃值: (4646)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
kinglyu 多谢指点,wfp或tdi都是驱动级的,目前暂时是考虑在应用层解决,目前实现的是利用Proxifier的代理规则实现拦截指定进程发包,并让其走动态获取的代理。
用openvxn不用自己写 
2023-9-15 12:15
1
雪    币: 261
活跃值: (547)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
刷新代理

BOOL result = InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0);

sk5没试过
2023-9-26 18:04
0
雪    币: 1795
活跃值: (3995)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
必须支持
2023-10-11 15:35
0
雪    币: 3188
活跃值: (5404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你绝对是人才,这脑袋是二哈的加强版本,很厉害,佩服!
2023-10-12 02:57
0
雪    币: 71
活跃值: (920)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
必须支持
2023-10-12 04:56
0
雪    币: 6054
活跃值: (12594)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
12
优选LSP,主流加速器也都是优选LSP技术方案的,Github找找有可用版的代码。
2023-10-12 08:37
0
游客
登录 | 注册 方可回帖
返回
//