Maison développement back-end tutoriel 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);





Copier après la connexion


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

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

------解决方案--------------------
不知道你在干什么?利用 sock 包的肯定是在用户层了
封装 ip 应该在下一层
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre l'erreur du serveur DNS Win11 Comment résoudre l'erreur du serveur DNS Win11 Jan 10, 2024 pm 09:02 PM

Nous devons utiliser le DNS correct lors de la connexion à Internet pour accéder à Internet. De la même manière, si nous utilisons des paramètres DNS incorrects, cela entraînera une erreur du serveur DNS. À ce stade, nous pouvons essayer de résoudre le problème en sélectionnant d'obtenir automatiquement le DNS dans les paramètres réseau. solutions. Comment résoudre l'erreur du serveur DNS du réseau Win11. Méthode 1 : Réinitialiser le DNS 1. Tout d'abord, cliquez sur Démarrer dans la barre des tâches pour entrer, recherchez et cliquez sur le bouton icône « Paramètres ». 2. Cliquez ensuite sur la commande d'option "Réseau et Internet" dans la colonne de gauche. 3. Recherchez ensuite l'option « Ethernet » sur la droite et cliquez pour entrer. 4. Après cela, cliquez sur "Modifier" dans l'attribution du serveur DNS et définissez enfin DNS sur "Automatique (D

Comment attribuer plusieurs adresses IP sur une seule carte LAN sous Windows 10/11 Comment attribuer plusieurs adresses IP sur une seule carte LAN sous Windows 10/11 May 30, 2023 am 11:25 AM

Il est parfois nécessaire d'attribuer plusieurs adresses à une seule carte LAN. Par exemple, si vous devez exécuter plusieurs sites Web avec des adresses IP uniques ou lier des applications à différentes adresses IP, etc. Si vous réfléchissez à la manière d'attribuer plusieurs adresses à une seule carte d'interface réseau ou carte LAN, cet article vous aidera à y parvenir. Suivez les étapes ci-dessous jusqu’à la fin et ce sera fait. Alors commençons ! Attribuez plusieurs adresses IP à une carte LAN Étape 1 : utilisez les touches Windows+R ensemble pour ouvrir l'invite d'exécution et tapez ncpa.cpl, puis appuyez sur la touche Entrée pour ouvrir la fenêtre Connexion réseau. Étape 2 : Faites un clic droit sur l’option Ethernet ou WiFi de votre carte réseau et cliquez sur Propriétés. Étape 3 : à partir de la fenêtre Propriétés

Comment les sites Web définissent-ils les restrictions IP sur liste noire/blanche et les restrictions d'accès IP par pays et ville via nginx ? Comment les sites Web définissent-ils les restrictions IP sur liste noire/blanche et les restrictions d'accès IP par pays et ville via nginx ? Jun 01, 2023 pm 05:27 PM

1. Configuration de l'accès restreint à la liste noire/blanche nginx propose plusieurs façons de configurer les listes noire et blanche. Voici seulement deux méthodes couramment utilisées. 1. La première méthode : les instructions Allow, Denydeny et Allow appartiennent à ngx_http_access_module. Nginx charge ce module par défaut, il peut donc être utilisé directement. Cette méthode est la plus simple et la plus directe. Le paramètre est similaire au pare-feu iptable. Comment utiliser : Ajoutez directement au fichier de configuration : #Paramètres de la liste blanche, suivi de autoriser l'adresse IP accessible/{allow123.13.123.12;allow23.53.32.1/100;denyall;}#. Paramètres de la liste noire,

Correctif : problème de serveur DNS qui ne répond pas dans Windows 11 Correctif : problème de serveur DNS qui ne répond pas dans Windows 11 Jun 01, 2023 pm 04:52 PM

Lorsque les utilisateurs de Windows ne parviennent pas à parcourir ou à charger des pages Web sur le navigateur de leur système, ils pensent à tous les facteurs qui peuvent provoquer ce problème. Bien que de nombreux utilisateurs de Windows résolvent ce problème sur leurs systèmes, un message d'erreur indiquant « Le serveur DNS ne répond pas » s'affiche et les utilisateurs ne savent pas comment résoudre ce problème pour utiliser une connexion Internet stable. Nous avons trouvé une solution dans cet article qui résoudra sûrement ce problème. Cependant, essayez ces solutions au préalable – essayez de redémarrer votre routeur et vérifiez si cela est à l’origine du problème. Changez les applications du navigateur. Cela dit, si vous utilisez le navigateur Microsoft Edge, fermez-le et ouvrez Google

Pourquoi NameResolutionError(self.host, self, e) de e et comment le résoudre Pourquoi NameResolutionError(self.host, self, e) de e et comment le résoudre Mar 01, 2024 pm 01:20 PM

La raison de l'erreur est NameResolutionError(self.host,self,e)frome, qui est un type d'exception dans la bibliothèque urllib3. La raison de cette erreur est que la résolution DNS a échoué, c'est-à-dire le nom d'hôte ou l'adresse IP qui était. La tentative de résolution n'a pas pu être trouvée. Cela peut être dû au fait que l'adresse URL saisie est incorrecte ou que le serveur DNS est temporairement indisponible. Comment résoudre cette erreur Il peut y avoir plusieurs façons de résoudre cette erreur : Vérifiez si l'adresse URL saisie est correcte et assurez-vous qu'elle est accessible Assurez-vous que le serveur DNS est disponible, vous pouvez essayer d'utiliser la commande "ping" dans la ligne de commande pour tester si le serveur DNS est disponible Essayez d'accéder au site Web en utilisant l'adresse IP au lieu du nom d'hôte si vous êtes derrière un proxy

Comment implémenter une communication asynchrone à l'aide des protocoles PHP et UDP Comment implémenter une communication asynchrone à l'aide des protocoles PHP et UDP Jul 30, 2023 pm 07:31 PM

Comment utiliser les protocoles PHP et UDP pour implémenter la communication asynchrone Dans les applications Internet modernes, la communication asynchrone est devenue une méthode très importante. En utilisant la communication asynchrone, les demandes des utilisateurs peuvent être traitées simultanément sans bloquer le thread principal, améliorant ainsi les performances du système et la vitesse de réponse. En tant que langage de programmation back-end populaire, PHP, comment utiliser le protocole UDP pour réaliser une communication asynchrone ? Cet article expliquera comment utiliser le protocole UDP en PHP pour implémenter une communication asynchrone simple et joindra des exemples de code spécifiques. 1. Introduction au protocole UDPU

Comment vérifier l'adresse IP sur WeChat Comment vérifier l'adresse IP sur WeChat May 31, 2023 am 09:16 AM

Comment vérifier l'adresse IP sur WeChat : 1. Connectez-vous à la version informatique de WeChat, cliquez avec le bouton droit sur la barre des tâches en bas de l'écran et cliquez sur « Gestionnaire des tâches » ; Détails » dans le coin inférieur gauche ; 3. Gestion des tâches Entrez l'option « Performances » du navigateur et cliquez sur « Ouvrir le moniteur de ressources » ; 4. Sélectionnez « Réseau » et vérifiez le processus WeChat « Wechat.exe » ; 5. Cliquez sur « Connexion TCP" ci-dessous pour surveiller la situation liée à l'IP du réseau WeChat. L'envoi d'un message et l'obtention d'une réponse révéleront l'adresse IP de l'autre personne.

Comment afficher et actualiser le cache DNS sous Linux Comment afficher et actualiser le cache DNS sous Linux Mar 07, 2024 am 08:43 AM

DNS (DomainNameSystem) est un système utilisé sur Internet pour convertir les noms de domaine en adresses IP correspondantes. Dans les systèmes Linux, la mise en cache DNS est un mécanisme qui stocke localement la relation de mappage entre les noms de domaine et les adresses IP, ce qui peut augmenter la vitesse de résolution des noms de domaine et réduire la charge sur le serveur DNS. La mise en cache DNS permet au système de récupérer rapidement l'adresse IP lors d'un accès ultérieur au même nom de domaine sans avoir à émettre une requête de requête au serveur DNS à chaque fois, améliorant ainsi les performances et l'efficacité du réseau. Cet article expliquera avec vous comment afficher et actualiser le cache DNS sous Linux, ainsi que les détails associés et des exemples de code. Importance de la mise en cache DNS Dans les systèmes Linux, la mise en cache DNS joue un rôle clé. son existence

See all articles