项目中遇到这样一个需求,需要动态切换指定进程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);
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-9-13 12:27
被kinglyu编辑
,原因: