我应该去哪个方向(图书馆,文件)?
更新
有人可以说明如何使用winpcap来完成这项工作吗?
更新2
如何验证数据包是否为HTTP?
答案 0 :(得分:15)
如果通过“劫持”你的意思是嗅探数据包,那么你应该用WinPcap做些什么来做:
找到您要使用的设备 - See WinPcap tutorial。
使用pcap_open
// Open the device
char errorBuffer[PCAP_ERRBUF_SIZE];
pcap_t *pcapDescriptor = pcap_open(source, // name of the device
snapshotLength, // portion of the packet to capture
// 65536 guarantees that the whole packet will be captured on all the link layers
attributes, // 0 for no flags, 1 for promiscuous
readTimeout, // read timeout
NULL, // authentication on the remote machine
errorBuffer); // error buffer
使用从pcap_loop
int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);
这将循环,直到发生错误或使用特殊方法调用中断循环。它将为每个数据包调用functionPointer。
在函数指向实现解析数据包的东西时,它应该看起来像pcap_handler
:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
现在剩下的就是解析其缓冲区在const u_char*
中的数据包,其长度位于pcap_pkthdr
结构caplen
字段中。
假设您通过TCP over IPv4 over Ethernet数据包进行HTTP GET,您可以:
数据包的其余部分应该是HTTP文本。第一个和第二个空格之间的文本应该是URI。如果它太长,您可能需要进行一些TCP重建,但大多数URI都足够小,可以放在一个数据包中。
UPDATE :在代码中,这看起来就像那样(我在没有测试的情况下编写它):
int tcp_len, url_length;
uchar *url, *end_url, *final_url, *tcp_payload;
... /* code in http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html */
/* retireve the position of the tcp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
/* retireve the position of the tcp payload */
tcp_len = (((uchar*)ih)[ip_len + 12] >> 4) * 4;
tcpPayload = (uchar*)ih + ip_len + tcp_len;
/* start of url - skip "GET " */
url = tcpPayload + 4;
/* length of url - lookfor space */
end_url = strchr((char*)url, ' ');
url_length = end_url - url;
/* copy the url to a null terminated c string */
final_url = (uchar*)malloc(url_length + 1);
strncpy((char*)final_url, (char*)url, url_length);
final_url[url_length] = '\0';
您还可以使用创建和设置BPF来仅过滤HTTP流量。 See WinPcap tutorial。您应该使用过滤器"tcp and dst port 80"
,它只会向您提供计算机发送给服务器的请求。
如果您不介意使用C#,可以尝试使用Pcap.Net,这将更容易为您完成所有这些工作,包括解析数据包的以太网,IPv4和TCP部分。
答案 1 :(得分:1)
答案 2 :(得分:1)
这可能听起来有点矫枉过正,但Web代理/缓存服务器Squid确实如此。几年前我的公司使用它,我必须在本地调整代码,以便在访问某些URL时提供一些特殊警告,因此我知道它可以做你想要的。您只需找到所需的代码并将其拉出来用于您的项目。我使用的是版本2.X,我现在看到它们达到了3.X但是我怀疑代码方面在内部没有太大变化。
你没有说windows是'要求'还是'偏好',但根据网站: http://www.squid-cache.org/他们可以做到这两点。
答案 3 :(得分:0)
您可能需要查看tcpdump
的源代码,了解其工作原理。 tcpdump
是一个Linux命令行实用程序,用于监视和打印网络活动。但是,您需要root权限才能使用它。