2010-04-24 31 views
6

Tôi nên đi theo hướng nào (thư viện, tài liệu)?Làm cách nào để chiếm đoạt tất cả yêu cầu http địa phương và trích xuất url bằng c?

CẬP NHẬT

Ai đó có thể minh họa cách sử dụng winpcap để thực hiện công việc?

CẬP NHẬT 2

Làm thế nào để xác minh xem một gói tin là một HTTP một?

+2

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/). –

+0

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. –

+0

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

Trả lời

15

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:

  1. Tìm thiết bị mà bạn muốn sử dụng - See WinPcap tutorial.

  2. 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 
    
  3. 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.

  4. 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 *); 
    
  5. 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.

+1

Có thể tự động hóa bước 1 không? Có vẻ như hướng dẫn yêu cầu chỉ định một thiết bị theo cách thủ công. – Gtker

+0

Tất nhiên, bạn vẫn phải chọn một hoặc đơn giản là làm điều đó cho tất cả các thiết bị. Nhiều lần bạn sẽ chỉ có một thiết bị, vì vậy bạn chỉ cần chọn một thiết bị đầu tiên. Bạn cũng có thể tự động lựa chọn bằng cách sử dụng các thuộc tính của chúng (như IP của chúng). Xem một phần khác của hướng dẫn WinPcap: http://www.winpcap.org/docs/docs_411/html/group__wpcap__tut2.html – brickner

+0

@ brickner, bạn cũng có thể xây dựng cách xác minh xem gói có phải là gói HTTP trong 'pcap_handler' hay không ? – Gtker

0

Bạn có thể muốn nhìn vào mã nguồn của tcpdump để xem cách nó hoạt động. tcpdump là một tiện ích dòng lệnh Linux theo dõi và in hoạt động mạng. Tuy nhiên, bạn cần quyền truy cập root vào máy để sử dụng nó.

+0

Tính năng này có hoạt động với các cửa sổ không? – Gtker

+0

@Runner: Nếu bạn quan tâm đến các giải pháp chỉ dành cho Windows, bạn có thể thêm thẻ [windows]. –

+0

Không chỉ cửa sổ, mà cả hai cửa sổ và linux. – Gtker

1

Có vẻ như quá mức cần thiết nhưng máy chủ proxy/máy chủ lưu trữ web Squid thực hiện chính xác điều đó. Một vài năm trước, công ty của tôi đã sử dụng nó và tôi phải chỉnh sửa mã cục bộ để cung cấp một số cảnh báo đặc biệt khi một số URL nhất định được truy cập để tôi biết nó có thể làm những gì bạn muốn. Bạn chỉ cần tìm mã bạn muốn và kéo nó ra cho dự án của bạn. Tôi đã sử dụng phiên bản 2.X và tôi thấy chúng lên tới 3.X nhưng tôi nghi ngờ rằng khía cạnh của mã không thay đổi nhiều trong nội bộ.

Bạn không nói nếu cửa sổ là 'yêu cầu' hay 'tùy chọn' nhưng theo trang web: http://www.squid-cache.org/, họ có thể thực hiện cả hai.

+0

Không, tôi muốn tự mình thực hiện. – Gtker

+2

Không muốn bắt đầu một cuộc chiến tranh lửa nhưng thực tế là bạn chỉ hỏi một người nào khác làm thế nào để làm điều đó cho bạn trong bình luận winpcap làm cho tôi tự hỏi ... – Hotei

Các vấn đề liên quan