BHO 进行IE9 保护模式下 请求过滤以及追踪,包括AJAX请求,以及其余ActiveX插件的请求

根据微软官方的文档表明IE使用Windows HTTP  FTP等网络服务必然调用UrlMon.dll -〉WinInet.dll-〉ws2_32.dll完成网络数据的发送以及接收。IE自然比例外,并且非常遵循微软的规范,那么WinInet.dll是最合适的注入点,因为WinInet.dll介于3个之中,可以拿到协议上的很多数据对于网络数据分析,完全足够,而且这样不仅能应用于IE只要使用操作系统提供的HTTP FTP网络服务必然要通过这个。

关于如何注入http://www.cnblogs.com/a185771876/archive/2012/02/14/2350844.html

具体这个的功能介绍以及其他说明请参见MSDN

InternetCloseHandle 关闭时使用

InternetSetStatusCallbackW  这个函数设置一个连接的状态回调函数时候需要使用

InternetSetStatusCallbackA 这个函数设置一个连接的状态回调函数时候需要使用

HttpOpenRequestA 只要进行请求必然要调用这个和下边那个函数他们之中任何一个 带W为unicode函数

HttpOpenRequestW

除了以上函数其余我们无需注入

首先注入HttpOpenRequestA  这个时候我们接管以后,可以直接使用InternetSetStatusCallbackW函数修改连接的状态通知,同时保留原来的状态通知函数指针,这样连接状态发生任何改变我们首先得到变化然后才是他以前的函数

很简单旧可以做到完整的监视整个请求过程,所有的处理都放到连接状态发生改变,这里

InternetCloseHandle 主要为了处理不同连接的状态回调可能不同那么,必然需要建立影射关系,关闭时清理自己的影射

或者在状态通知中得到连接完成后清除影射

InternetSetStatusCallbackW  注入为了防止在Open后期重新绑定状态通知导致我们的监视失效

 1 HINTERNET WINAPI MyHttpOpenRequestW(HINTERNET hConnect,LPCWSTR lpszVerb,LPCWSTR lpszObjectName,LPCWSTR lpszVersion,LPCWSTR lpszReferrer,LPCWSTR FAR * lplpszAcceptTypes,DWORD dwFlags,DWORD_PTR dwContext)
2 {
3
4 DWORD errorCode=NULL;
5 SetLastError(0);//非常关键,测试过程发现微软代码判断的不仅是返回值并且会检测GetLastError() 那么如果上边你有处理的话就必须在这里设置为0,否则导致外边无条件执行失败
6 HINTERNET result=WinInetOldFunction.openRequestW(hConnect,lpszVerb,lpszObjectName,lpszVersion,lpszReferrer,lplpszAcceptTypes,dwFlags,dwContext);
7 if(result!=NULL)
8 {
9 AddConnectMapping(&WinInetOldFunction.rootConnect,hConnect);
10
11 LPInternetConnectMappingEntry entry=FindConnectMapping(&WinInetOldFunction.rootConnect,hConnect);
12
13 entry->callBack=WinInetOldFunction.setStatusCallbackW(hConnect,MyProxyINTERNET_STATUS_CALLBACK);
14
15 if(WinInetOldFunction.defaultStatusCallback==NULL&&entry->callBack!=MyProxyINTERNET_STATUS_CALLBACK)
16 WinInetOldFunction.defaultStatusCallback=entry->callBack;
17
18 if(entry->callBack==MyProxyINTERNET_STATUS_CALLBACK)
19 {
20 entry->callBack=WinInetOldFunction.defaultStatusCallback;
21 }
22 }
23 return result;
24 }
  1 VOID CALLBACK MyProxyINTERNET_STATUS_CALLBACK(HINTERNET hInternet,DWORD_PTR dwContext,DWORD dwInternetStatus,LPVOID lpvStatusInformation,DWORD dwStatusInformationLength)
2 {
3 INTERNET_STATUS_CALLBACK lastCallBack=NULL;
4 LPInternetConnectMappingEntry entry=FindConnectMapping(&WinInetOldFunction.rootConnect,hInternet);
5 if(entry==NULL)//发生不可预知的错误,保证IE正常工作
6 {
7 return;//忽略回调
8 }
9 switch(dwInternetStatus)
10 {
11 case INTERNET_STATUS_CONNECTION_CLOSED:
12 DebugOut(INTERNET_STATUS_CONNECTION_CLOSED\r\n,NULL);
13 break;
14 case INTERNET_STATUS_CLOSING_CONNECTION:
15 DebugOut(INTERNET_STATUS_CLOSING_CONNECTION\r\n,NULL);
16 break;
17
18 case INTERNET_STATUS_CONNECTED_TO_SERVER:
19 DebugOut(INTERNET_STATUS_CONNECTED_TO_SERVER\r\n,NULL);
20 break;
21 case INTERNET_STATUS_CONNECTING_TO_SERVER:
22 DebugOut(INTERNET_STATUS_CONNECTING_TO_SERVER\r\n,NULL);
23 break;
24
25 case INTERNET_STATUS_COOKIE_HISTORY:
26 DebugOut(INTERNET_STATUS_COOKIE_HISTORY\r\n,NULL);
27 break;
28 case INTERNET_STATUS_COOKIE_RECEIVED:
29 DebugOut(INTERNET_STATUS_COOKIE_RECEIVED\r\n,NULL);
30 break;
31 case INTERNET_STATUS_COOKIE_SENT:
32 DebugOut(INTERNET_STATUS_COOKIE_SENT\r\n,NULL);
33 break;
34
35
36 case INTERNET_STATUS_CTL_RESPONSE_RECEIVED:
37 DebugOut(INTERNET_STATUS_CTL_RESPONSE_RECEIVED\r\n,NULL);
38 break;
39 case INTERNET_STATUS_DETECTING_PROXY:
40 DebugOut(INTERNET_STATUS_DETECTING_PROXY\r\n,NULL);
41 break;
42 case INTERNET_STATUS_HANDLE_CLOSING:
43 DebugOut(INTERNET_STATUS_HANDLE_CLOSING\r\n,NULL);
44 break;
45 case INTERNET_STATUS_HANDLE_CREATED:
46 DebugOut(INTERNET_STATUS_HANDLE_CREATED\r\n,NULL);
47 break;
48 case INTERNET_STATUS_INTERMEDIATE_RESPONSE:
49 DebugOut(INTERNET_STATUS_INTERMEDIATE_RESPONSE\r\n,NULL);
50 break;
51 case INTERNET_STATUS_NAME_RESOLVED:
52 DebugOut(INTERNET_STATUS_NAME_RESOLVED\r\n,NULL);
53 break;
54 case INTERNET_STATUS_P3P_HEADER:
55 DebugOut(INTERNET_STATUS_P3P_HEADER\r\n,NULL);
56 break;
57 case INTERNET_STATUS_P3P_POLICYREF:
58 DebugOut(INTERNET_STATUS_P3P_POLICYREF\r\n,NULL);
59 break;
60 case INTERNET_STATUS_PREFETCH:
61 DebugOut(INTERNET_STATUS_PREFETCH\r\n,NULL);
62 break;
63 case INTERNET_STATUS_PRIVACY_IMPACTED:
64 DebugOut(INTERNET_STATUS_PRIVACY_IMPACTED\r\n,NULL);
65 break;
66 case INTERNET_STATUS_RECEIVING_RESPONSE:
67 DebugOut(INTERNET_STATUS_RECEIVING_RESPONSE\r\n,NULL);
68 break;
69 case INTERNET_STATUS_REDIRECT:
70 DebugOut(INTERNET_STATUS_REDIRECT\r\n,NULL);
71 break;
72 case INTERNET_STATUS_SENDING_REQUEST:
73 DebugOut(INTERNET_STATUS_SENDING_REQUEST\r\n,NULL);
74 break;
75 case INTERNET_STATUS_USER_INPUT_REQUIRED:
76 DebugOut(INTERNET_STATUS_USER_INPUT_REQUIRED\r\n,NULL);
77 break;
78 case INTERNET_STATUS_STATE_CHANGE:
79 DebugOut(INTERNET_STATUS_STATE_CHANGE\r\n,NULL);
80 break;
81 case INTERNET_STATE_BUSY:
82 DebugOut(INTERNET_STATE_BUSY\r\n,NULL);
83 break;
84 case INTERNET_STATE_CONNECTED:
85 DebugOut(INTERNET_STATE_CONNECTED\r\n,NULL);
86 break;
87 case INTERNET_STATE_DISCONNECTED:
88 DebugOut(INTERNET_STATE_DISCONNECTED\r\n,NULL);
89 break;
90 case INTERNET_STATE_DISCONNECTED_BY_USER:
91 DebugOut(INTERNET_STATE_DISCONNECTED_BY_USER\r\n,NULL);
92 break;
93 case INTERNET_STATE_IDLE:
94 DebugOut(INTERNET_STATE_IDLE\r\n,NULL);
95 break;
96 default:
97 break;
98 }
99 if(entry->callBack!=NULL)
100 entry->callBack(hInternet,dwContext,dwInternetStatus,lpvStatusInformation,dwStatusInformationLength);
101 else
102 {
103 DebugBreak();
104 }
105 }



原文地址:https://www.cnblogs.com/a185771876/p/2350876.html