独辟蹊径”之动态切换进程代理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_第1张图片

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

再出发

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

独辟蹊径”之动态切换进程代理IP_第2张图片


2、通过导入配置文件
 

独辟蹊径”之动态切换进程代理IP_第3张图片


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

上菜

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

独辟蹊径”之动态切换进程代理IP_第4张图片


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

独辟蹊径”之动态切换进程代理IP_第5张图片


提取出导入配置文件部分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,哦就是你了。
哦,还差点什么吗,没有,如图:

独辟蹊径”之动态切换进程代理IP_第6张图片

你可能感兴趣的:(大神分析,tcp/ip,网络协议,网络)