Rumah pembangunan bahagian belakang tutorial php 请问php怎么使用自己构造的IP包头

请问php怎么使用自己构造的IP包头

Jun 13, 2016 pm 01:21 PM
dns ip quot socket udp

请教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);





Salin selepas log masuk


这是个查询向指定dns服务器查询指定域名IP信息的程序,用Wireshark抓包测试可用,但是现在没有用自己的网络层,也就是IP头,我要用自己构造的IP头,

$buf = $ip_header . $udp . $dns;
//$buf = $udp . $dns;
改成
$buf = $ip_header . $udp . $dns;
//$buf = $udp . $dns;
结果还是不行,应该是send那函数的问题,请问下应该怎么修改

------解决方案--------------------
不知道你在干什么?利用 sock 包的肯定是在用户层了
封装 ip 应该在下一层
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan ralat pelayan DNS win11 Bagaimana untuk menyelesaikan ralat pelayan DNS win11 Jan 10, 2024 pm 09:02 PM

Kita perlu menggunakan DNS yang betul apabila menyambung ke Internet untuk mengakses Internet. Dengan cara yang sama, jika kita menggunakan tetapan dns yang salah, ia akan menyebabkan ralat pelayan dns Pada masa ini, kita boleh cuba menyelesaikan masalah dengan memilih untuk mendapatkan dns secara automatik dalam tetapan rangkaian penyelesaian. Cara menyelesaikan ralat pelayan dns rangkaian win11 Kaedah 1: Tetapkan semula DNS 1. Pertama, klik Mula dalam bar tugas untuk masuk, cari dan klik butang ikon "Tetapan". 2. Kemudian klik arahan pilihan "Rangkaian & Internet" di lajur kiri. 3. Kemudian cari pilihan "Ethernet" di sebelah kanan dan klik untuk masuk. 4. Selepas itu, klik "Edit" dalam tugasan pelayan DNS, dan akhirnya tetapkan DNS kepada "Automatik (D

Bagaimana untuk menetapkan berbilang alamat IP dalam satu kad LAN pada Windows 10/11 Bagaimana untuk menetapkan berbilang alamat IP dalam satu kad LAN pada Windows 10/11 May 30, 2023 am 11:25 AM

Kadangkala adalah perlu untuk memberikan berbilang alamat kepada satu kad LAN. Contohnya, jika anda perlu menjalankan berbilang tapak web dengan alamat IP unik atau mengikat aplikasi ke alamat IP yang berbeza, dsb. Jika anda berfikir tentang cara untuk menetapkan berbilang alamat kepada satu kad antara muka rangkaian atau kad LAN, artikel ini akan membantu anda mencapainya. Ikuti langkah di bawah sehingga tamat dan ia akan dilakukan. Jadi mari kita mulakan! Berikan Berbilang Alamat IP kepada Satu Kad LAN Langkah 1: Gunakan kekunci Windows+R bersama-sama untuk membuka gesaan jalankan dan taip ncpa.cpl, kemudian tekan Enter untuk membuka tetingkap Sambungan Rangkaian. Langkah 2: Klik kanan pada pilihan Ethernet atau WiFi penyesuai rangkaian anda dan klik sifat. Langkah 3: Dari Tetingkap Properties

Bagaimanakah tapak web menetapkan sekatan IP hitam/senarai putih dan sekatan akses IP negara dan bandar melalui nginx? Bagaimanakah tapak web menetapkan sekatan IP hitam/senarai putih dan sekatan akses IP negara dan bandar melalui nginx? Jun 01, 2023 pm 05:27 PM

1. Senarai hitam/putih IP konfigurasi capaian terhad nginx Terdapat beberapa cara untuk mengkonfigurasi senarai hitam dan putih Di sini hanya dua kaedah yang biasa digunakan. 1. Kaedah pertama: membenarkan, menafikan dan membenarkan arahan milik ngx_http_access_module nginx memuatkan modul ini secara lalai, supaya ia boleh digunakan secara langsung. Kaedah ini adalah yang paling mudah dan paling langsung. Tetapan adalah serupa dengan firewall iptable Cara menggunakan: Tambahkan terus pada fail konfigurasi: #Whitelist settings, diikuti dengan allow is accessible IPlocation/{allow123.13.123.12;allow23.53.32.1/100;denyall;}# Tetapan senarai hitam,

Betulkan: Pelayan DNS tidak bertindak balas isu dalam Windows 11 Betulkan: Pelayan DNS tidak bertindak balas isu dalam Windows 11 Jun 01, 2023 pm 04:52 PM

Apabila pengguna Windows tidak dapat menyemak imbas atau memuatkan halaman web pada penyemak imbas pada sistem mereka, mereka kebetulan memikirkan semua faktor yang boleh menyebabkan isu ini. Walaupun ramai pengguna Windows menyelesaikan isu ini pada sistem mereka, ia melemparkan mesej ralat yang menyatakan "pelayan DNS tidak bertindak balas" dan pengguna tidak tahu cara menyelesaikan isu ini untuk menggunakan sambungan internet yang stabil. Kami telah menghasilkan penyelesaian dalam artikel ini yang pasti akan menyelesaikan masalah ini. Walau bagaimanapun, cuba penyelesaian ini terlebih dahulu - cuba mulakan semula penghala anda dan semak sama ada ini menyebabkan masalah. Tukar aplikasi penyemak imbas. Yang berkata, jika anda menggunakan penyemak imbas Microsoft Edge, tutupnya dan buka Google

Mengapa NameResolutionError(self.host, self, e) daripada e dan cara menyelesaikannya Mengapa NameResolutionError(self.host, self, e) daripada e dan cara menyelesaikannya Mar 01, 2024 pm 01:20 PM

Sebab ralat adalah NameResolutionError(self.host,self,e)daripada, yang merupakan jenis pengecualian dalam pustaka urllib3 Sebab ralat ini adalah bahawa resolusi DNS gagal, iaitu nama hos atau alamat IP yang telah cuba diselesaikan tidak dapat ditemui. Ini mungkin disebabkan oleh alamat URL yang dimasukkan tidak betul atau pelayan DNS tidak tersedia buat sementara waktu. Bagaimana untuk menyelesaikan ralat ini Mungkin terdapat beberapa cara untuk menyelesaikan ralat ini: Semak sama ada alamat URL yang dimasukkan adalah betul dan pastikan ia boleh diakses Pastikan pelayan DNS tersedia, anda boleh cuba menggunakan arahan "ping" dalam baris arahan untuk menguji sama ada pelayan DNS tersedia Cuba akses tapak web menggunakan alamat IP dan bukannya nama hos jika di belakang proksi

Bagaimana untuk melaksanakan komunikasi tak segerak menggunakan protokol PHP dan UDP Bagaimana untuk melaksanakan komunikasi tak segerak menggunakan protokol PHP dan UDP Jul 30, 2023 pm 07:31 PM

Cara menggunakan protokol PHP dan UDP untuk melaksanakan komunikasi tak segerak Dalam aplikasi Internet moden, komunikasi tak segerak telah menjadi kaedah yang sangat penting. Dengan menggunakan komunikasi tak segerak, permintaan pengguna boleh diproses secara serentak tanpa menyekat utas utama, meningkatkan prestasi sistem dan kelajuan tindak balas. Sebagai bahasa pengaturcaraan back-end yang popular, PHP bagaimana menggunakan protokol UDP untuk mencapai komunikasi tak segerak? Artikel ini akan memperkenalkan cara menggunakan protokol UDP untuk melaksanakan komunikasi tak segerak yang mudah dalam PHP dan melampirkan contoh kod tertentu. 1. Pengenalan kepada UDP protocolU

Bagaimana untuk menyemak alamat IP pada WeChat Bagaimana untuk menyemak alamat IP pada WeChat May 31, 2023 am 09:16 AM

Cara menyemak alamat IP pada WeChat: 1. Log masuk ke versi komputer WeChat, klik kanan bar tugas di bahagian bawah skrin, dan klik "Pengurus Tugas" 2. Apabila pengurus tugas muncul, klik "; Butiran" di sudut kiri bawah; 3. Pengurusan tugas Masukkan pilihan "Prestasi" pelayar dan klik "Open Resource Monitor"; 4. Pilih "Rangkaian" dan semak proses WeChat "Wechat.exe"; 5. Klik " Sambungan TCP" di bawah untuk memantau situasi berkaitan IP rangkaian WeChat. Menghantar mesej dan mendapatkan balasan akan mendedahkan alamat IP orang lain.

Bagaimana untuk melihat dan menyegarkan cache dns dalam Linux Bagaimana untuk melihat dan menyegarkan cache dns dalam Linux Mar 07, 2024 am 08:43 AM

DNS (DomainNameSystem) ialah sistem yang digunakan di Internet untuk menukar nama domain kepada alamat IP yang sepadan. Dalam sistem Linux, cache DNS ialah mekanisme yang menyimpan hubungan pemetaan antara nama domain dan alamat IP secara tempatan, yang boleh meningkatkan kelajuan resolusi nama domain dan mengurangkan beban pada pelayan DNS. Caching DNS membolehkan sistem mendapatkan semula alamat IP dengan pantas apabila kemudiannya mengakses nama domain yang sama tanpa perlu mengeluarkan permintaan pertanyaan kepada pelayan DNS setiap kali, dengan itu meningkatkan prestasi dan kecekapan rangkaian. Artikel ini akan membincangkan dengan anda cara melihat dan memuat semula cache DNS pada Linux, serta butiran yang berkaitan dan kod sampel. Kepentingan Caching DNS Dalam sistem Linux, cache DNS memainkan peranan penting. kewujudannya

See all articles