Skip to content

Latest commit

 

History

History
113 lines (72 loc) · 2.49 KB

README.md

File metadata and controls

113 lines (72 loc) · 2.49 KB

已知问题

  • 对winhttp劫持有问题。

说明

  • 实现gethostbyname、getaddrinfo返回虚拟IP

    (系统ping用的getaddrinfo)

  • 支持32、64位程序

  • 支持包括XP以上系统

编译

vs2015_xp

使用

TestNSP(64).exe里对aaaa.kaho.tv用GetHostByName解析了IPv4,用GetAddrInfo解析了IPv4和IPv6。

此域名正常结果应该是

C:\Users\admin>nslookup aaaa.kaho.tv
服务器:  public1.114dns.com
Address:  114.114.114.114

非权威应答:
名称:    aaaa.kaho.tv
Addresses:  2a00:8642:1000:1::3
          47.56.236.129

用以下步骤测试NSP劫持效果

1、管理员权限启动install(64).exe,并输入1进行安装FakeNSP。

2、安装成功后,打开TestNSP(64).exe,输入任意键,会展示Fake IP。

gethostbyname

不需要特殊处理,只要自己的NSP排在第一并正常返回,就不会再调用系统NSP。

getaddrinfo

对于getaddrinfo函数,会按顺序调用所有NSP,最后会把系统NSP的结果排到第一位。

假设有顺序的A、B、S三个NSP,其中S为系统NSPNSP调用顺序如下:

doc_1

Proxifier处理NSP顺序

从上图可以看出,同一套参数按顺序调用了所有的NSPNSPLookupServiceBegin

Proxifier的处理办法是先把自己排在第一个NSP,再在NSPLookupServiceBegin里修改dwNameSpace字段:

int WSPAPI NSPLookupServiceBegin(
	LPGUID					inProviderID,
	LPWSAQUERYSETW			inQuerySet,
	LPWSASERVICECLASSINFOW	inServiceClassInfo,
	DWORD					inFlags,
	LPHANDLE				outLookup)
{
  ...
  inQuerySet->dwNameSpace = NS_TCPIP_HOSTS;		//修改dwNameSpace,防止后续NSP调用
  ...
}

这样当轮到系统NSP时,它会发现不是NS_DNS或者NS_ALL,就选择不解析,以此跳过了系统DNS解析。

fakensp处理NSP顺序

由于最开始并不知道Proxifier的方法,我在查看reactOS相关代码后发现此方法可以强制切断对下一个NSPNSPLookupServiceNext调用

int WSPAPI NSPLookupServiceNext(
	HANDLE			inLookup,
	DWORD			inFlags,
	LPDWORD			ioSize,
	LPWSAQUERYSETW	outResults)
{
	...
	NSQUERY* pNsQuery = Util::SpiScanNsQuery(5);	//扫描出上层函数传入的NSQUERY*参数
	if (pNsQuery != NULL)
	{
		pNsQuery->ActiveProvider = NULL;
	}
	...
}

参考