请问php怎么使用自己构造的IP包头
请教php如何使用自己构造的IP包头
- PHP code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><?php //数据 $dns_id = "\x80\xc1"; $dns_flags = "\x01\x00"; $dns_count_queries = "\x00\x01"; $dns_count_answers = "\x00\x00"; $dns_count_auth_rr = "\x00\x00"; $dns_count_add_rr = "\x00\x00"; $dns_qry_name = "\x02\x69\x70\x02\x63\x6e\x00"; $dns_qry_type = "\x00\x01"; $dns_qry_class = "\x00\x01"; $dns = $dns_id . $dns_flags . $dns_count_queries . $dns_count_answers . $dns_count_auth_rr . $dns_count_add_rr . $dns_qry_name . $dns_qry_type . $dns_qry_class; //IP头 $ip_version = "\x45"; //4位版本 $ip_hdr_len = ""; // 4位首部长度 $ip_dsfield = "\x00"; //8位服务类型 $ip_len = pack('n*',28 + strlen($dns)); //16位总长度 $ip_id = "\x55\xf0"; //16位标识 $ip_flags = "\x00"; //3位标识 $ip_frag_offset = "\x00"; // 13位偏移 $ip_ttl = "\x80"; //8位生存时间 $ip_proto = "\x11"; //8位协议 $ip_src = ipto16("192.168.1.100"); //32位源IP $ip_dst = ipto16("8.8.4.4"); //32位目的IP $ip_checksum = ipchecksum($ip_version,$ip_hdr_len,$ip_dsfield,$ip_len,$ip_id,$ip_flags,$ip_frag_offset,$ip_ttl,$ip_proto,$ip_src,$ip_dst); //16位首部效验和 $ip_header = $ip_version . $ip_hdr_len . $ip_dsfield . $ip_len . $ip_id . $ip_flags . $ip_frag_offset . $ip_ttl . $ip_proto . $ip_checksum . $ip_src . $ip_dst; //UDP头 $udp_srcport = "\xfc\x39"; //16位源端口 $udp_dstport = "\x00\x35"; //16位目的端口 $udp_length = pack('n*',8 + strlen($dns)); //16位UDP长度 $udp_checksum = udpchecksum($ip_src,$ip_dst,$ip_proto,$udp_length,$udp_srcport,$udp_dstport,$dns); //16位UDP效验和 $udp = $udp_srcport . $udp_dstport . $udp_length . $udp_checksum; //$buf = $ip_header . $udp . $dns; $buf = $udp . $dns; function send($host,$port,$buf,$dns_flags) { // $socket = socket_create(AF_INET, SOCK_PACKET, getprotobyname("ip")); $socket = socket_create(AF_INET, SOCK_RAM,1); $timeout = array('sec'=>1,'usec'=>500000); // socket_set_option($socket,IPPROTO_IP,IP_HDRINCL,SO_RCVTIMEO,$timeout); socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout); // while(1) socket_sendto($socket, $buf, strlen($buf), 0, $host, $port); } function udpchecksum($ip_src,$ip_dst,$ip_proto,$udp_length,$udp_srcport,$udp_dstport,$dns) { $data = $ip_src . $ip_dst . "\x00" . $ip_proto . $udp_length . $udp_srcport . $udp_dstport . $udp_length . "\x00\x00" . $dns; if (strlen($data)%2) $data .= "\x00"; $bit = unpack('n*', $data); $sum = array_sum($bit); while ($sum >> 16) $sum = ($sum >> 16) + ($sum & 0xffff); return pack('n*', ~$sum); } function ipchecksum($ip_version,$ip_hdr_len,$ip_dsfield,$ip_len,$ip_id,$ip_flags,$ip_frag_offset,$ip_ttl,$ip_proto,$ip_src,$ip_dst) { $data = $ip_version . $ip_hdr_len . $ip_dsfield . $ip_len . $ip_id . $ip_flags . $ip_frag_offset . $ip_ttl . $ip_proto . "\x00\x00" . $ip_src . $ip_dst; $bit = unpack('n*', $data); $sum = array_sum($bit); while ($sum >> 16) $sum = ($sum >> 16) + ($sum & 0xffff); return pack('n*', ~$sum); } function ipto16($ip) { $tmp = explode(".",$ip); $ip = ""; foreach($tmp as $a => $b) { $tmp = dechex($b); if (strlen($tmp)==1) $tmp = "0" . $tmp; $ip .= $tmp; } $ip = pack("h*",$ip); return $ip; } send("8.8.4.4",53,$buf,$dns_flags);
这是个查询向指定dns服务器查询指定域名IP信息的程序,用Wireshark抓包测试可用,但是现在没有用自己的网络层,也就是IP头,我要用自己构造的IP头,
把
$buf = $ip_header . $udp . $dns;
//$buf = $udp . $dns;
改成
$buf = $ip_header . $udp . $dns;
//$buf = $udp . $dns;
结果还是不行,应该是send那函数的问题,请问下应该怎么修改
------解决方案--------------------
不知道你在干什么?利用 sock 包的肯定是在用户层了
封装 ip 应该在下一层

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

我們在連接網路時需要使用正確的dns才可以上網。同理,如果我們使用了錯誤的dns設定就會提示dns伺服器錯誤了,這時候我們可以嘗試在網路設定中選擇自動取得dns來解決,以下就一起來看下具體解決方法吧。 win11網路dns伺服器錯誤怎麼辦方法一:重新設定DNS1、首先,點選工作列中的開始進入,在其中找到並點選「設定」圖示按鈕。 2、然後點選左側欄中的「網路&Internet」選項指令。 3、然後在右側找到「乙太網路」選項,點選進入。 4、之後,點選DNS伺服器指派中的“編輯”,最後將DNS設定為“自動(D

一、黑/白名單IP限制存取配置nginx配置黑白名單有好幾種方式,這裡只介紹常用的兩種方法。 1.第一種方法:allow、denydeny和allow指令屬於ngx_http_access_module,nginx預設載入此模組,所以可直接使用。這種方式,最簡單,最直接。設定類似防火牆iptable,使用方法:直接設定檔中新增:#白名單設置,allow後面為可存取IPlocation/{allow123.13.123.12;allow23.53.32.1/100;denyall;}#黑名單設置,

有時需要為單一LAN卡分配多個位址。例如,如果需要運行多個具有唯一IP位址的網站或將應用程式綁定到不同的IP位址等。如果您正在考慮如何為單一網路介面卡或LAN卡指派多個位址,那麼本文將協助您實現它。按照下面的步驟直到最後,它就會完成。那麼就讓我們開始吧!在一張LAN卡中指派多個IP位址第1步:一起使用Windows+R鍵開啟執行提示並鍵入ncpa.cpl,然後按回車鍵開啟網路連線視窗。步驟2:右鍵單擊您的網路介面卡乙太網路或WiFi選項,然後按一下屬性。步驟3:從屬性視窗

當Windows使用者無法在系統上的瀏覽器上瀏覽或載入網頁時,他們碰巧想到了可能導致此問題的所有因素。儘管許多Windows用戶在他們的系統上解決此問題時,它會拋出一條錯誤訊息,指出“DNS伺服器沒有回應”,用戶不知道如何解決此問題以使用穩定的網路連線。我們在這篇文章中提出了一個解決方案,它肯定會解決這個問題。但是,請事先嘗試這些解決方法——嘗試重新啟動路由器並檢查這是否導致問題。更改瀏覽器應用程式。也就是說,如果您使用的是MicrosoftEdge瀏覽器,請將其關閉並開啟Google

報錯的原因NameResolutionError(self.host,self,e)frome是由urllib3函式庫中的例外類型,這個錯誤的原因是DNS解析失敗,也就是說,試圖解析的主機名稱或IP位址無法找到。這可能是由於輸入的URL位址不正確,或DNS伺服器暫時無法使用所導致的。如何解決解決此錯誤的方法可能有以下幾種:檢查輸入的URL地址是否正確,確保它是可訪問的確保DNS伺服器可用,您可以嘗試在命令行中使用"ping"命令來測試DNS伺服器是否可用嘗試使用IP位址而不是主機名稱來存取網站如果是在代理

如何使用PHP和UDP協定實現非同步通訊在現代的網路應用中,非同步通訊已成為了非常重要的方式。透過使用非同步通信,可以在不阻塞主線程的情況下,實現並發處理用戶請求,提高系統的效能和回應速度。而PHP作為一種流行的後端程式語言,如何使用UDP協定實現非同步通訊呢?本文將介紹如何在PHP中使用UDP協定實現簡單的非同步通信,並附上具體的程式碼範例。一、UDP協定簡介U

DNS(DomainNameSystem)是網際網路中用來將網域名稱轉換為對應IP位址的系統。在Linux系統中,DNS快取是一種將網域名稱和IP位址的映射關係儲存在本地的機制,可提高網域解析速度,減輕DNS伺服器的負擔。 DNS快取允許系統在之後存取相同網域名稱時快速檢索IP位址,而不必每次都向DNS伺服器發出查詢請求,從而提高網路效能和效率。本文不念將和大家一起探討如何在Linux上查看和刷新DNS緩存,以及相關的詳細內容和範例程式碼。 DNS快取的重要性在Linux系統中,DNS快取扮演關鍵的角色。它的存在

微信查看ip位址的方法:1、登入電腦版微信,右鍵點選螢幕下方的工作欄,點選「工作管理員」;2、彈出工作管理員時,點選左下角的「詳細資料」;3、工作管理器進入“性能”選項,點擊“打開資源監視器”;4、選擇“網絡”,勾選微信進程“Wechat.exe”;5、點擊下面的“TCP連接”即可監視微信網絡IP相關情況,發送訊息得到回覆就會顯示他人的IP位址。
