Nếu bằng cách "cướp" bạn có nghĩa là sniff các gói sau đó những gì bạn nên làm gì để làm điều đó với WinPcap được như sau:
Tìm thiết bị mà bạn muốn sử dụng - See WinPcap tutorial.
mở một thiết bị sử dụng 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
Sử dụng một chức năng mà đọc các gói tin từ mô tả như pcap_loop
int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);
Điều này sẽ lặp cho đến khi một cái gì đó sai đã xảy ra hoặc vòng bị hỏng sử dụng một cuộc gọi phương thức đặc biệt. Nó sẽ gọi hàm con trỏ cho mỗi gói.
Trong chức năng chỉ thực hiện một cái gì đó phân tích các gói dữ liệu, nó sẽ giống như một pcap_handler
:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
Bây giờ tất cả các bạn đã để lại là để phân tích các gói tin rằng bộ đệm của họ là trong const u_char*
và họ chiều dài nằm trong trường pcap_pkthdr
cấu trúc caplen
.
Giả sử bạn có HTTP GET trên TCP trên IPv4 qua gói Ethernet, bạn có thể:
- Skip 14 byte header Ethernet.
- Bỏ qua 20 byte của tiêu đề IPv4 (giả sử không có tùy chọn IPv4, nếu bạn nghi ngờ có thể chọn IPv4, bạn có thể đọc 5-8 bit của tiêu đề IPv4, nhân với 4 và đây sẽ là số số byte tiêu đề IPv4 mất).
- Bỏ qua 20 byte của tiêu đề TCP (giả sử không có tùy chọn TCP, nếu bạn nghi ngờ rằng tùy chọn TCP là có thể, bạn có thể đọc 96-99 bit của tiêu đề TCP, nhân với 4 và đây sẽ là số số byte tiêu đề TCP mất).
Phần còn lại của gói phải là văn bản HTTP. Văn bản giữa không gian thứ nhất và thứ hai phải là URI. Nếu nó quá dài, bạn có thể cần phải thực hiện một số tái thiết TCP, nhưng hầu hết các URI đủ nhỏ để vừa với một gói.
CẬP NHẬT: Trong đoạn mã này sẽ trông như thế (tôi đã viết nó mà không thử nghiệm nó):
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';
Bạn cũng có thể lọc chỉ giao thông HTTP bằng cách sử dụng tạo và thiết lập một BPF. See WinPcap tutorial. Có lẽ bạn nên sử dụng bộ lọc "tcp and dst port 80"
chỉ cung cấp cho bạn yêu cầu mà máy tính của bạn gửi tới máy chủ.
Nếu bạn không nhớ sử dụng C#, bạn có thể thử sử dụng Pcap.Net, điều này sẽ giúp bạn dễ dàng hơn nhiều, bao gồm phân tích cú pháp các gói Ethernet, IPv4 và TCP của gói.
Bạn không cần phải viết bất kỳ phần mềm nào để thực hiện việc này. Sử dụng [proxy] (http://www.squid-cache.org/) có [đăng nhập] (http://www.squid-cache.org/Doc/config/access_log/). –
Lưu ý rằng các câu trả lời cho phép bạn đăng nhập hoặc theo dõi các URL nhưng chắc chắn không bị tấn công: "Để thay đổi cài đặt phần mềm mà người dùng không biết để buộc người dùng truy cập vào một trang web nhất định" (wiktionary). Bạn có thể đã lạm dụng thuật ngữ này hoặc có nghĩa là một thuật ngữ khác. –
Xin lỗi để tranh chấp Matt, nhưng mực thực sự "cướp". Bởi vì tôi có nghĩa là nó cho phép bạn thay thế một url khác nhau cho một người dùng đã nhập (nếu đó là những gì bạn muốn làm lập trình viên). Chức năng chính là lưu vào bộ nhớ cache, nhưng nó có thể làm nhiều hơn nếu bạn muốn. – Hotei