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

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

2023-9-13 12:24
9862

前言

项目中遇到这样一个需求,需要动态切换指定进程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.*;<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);
}

设置后发现系统代理确实设置成功并生效了,浏览器查询一番,发现走的是自己设置的代理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 <proxifier.sub_2A1832>                             | [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,哦就是你了。
哦,还差点什么吗,没有,如图:


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

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

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

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

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

sk5没试过
雪    币: 1517
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小希希 2023-10-11 15:35
9
0
必须支持
雪    币: 2643
活跃值: (4369)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zylrocket 2023-10-12 02:57
10
0
你绝对是人才,这脑袋是二哈的加强版本,很厉害,佩服!
雪    币: 71
活跃值: (810)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rongkao 2023-10-12 04:56
11
0
必须支持
雪    币: 5352
活跃值: (11770)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
一半人生 5 2023-10-12 08:37
12
0
优选LSP,主流加速器也都是优选LSP技术方案的,Github找找有可用版的代码。
游客
登录 | 注册 方可回帖
返回