NetBIOS-NS:網絡基本輸入/輸出系統-名稱服務

一、概述

NetBIOS-NS(NetBIOS Name Service)是計算機網絡領域中一個重要的協議。它主要負責實現名稱的解析和註冊,是 NetBIOS 網絡的核心。NetBIOS-NS 早期廣泛應用於局域網環境中,如今也經常被用於早期的Windows系統中。在現代計算機網絡中,NetBIOS-NS 已經逐漸被DNS(Domain Name Service)所取代,但 NetBIOS 仍然有其特殊的應用場合。

二、NetBIOS-NS 的工作原理

NetBIOS-NS 首先通過 UDP 端口 137 監聽網絡,等待來自其它計算機的 NetBIOS 函數調用。當一個 NetBIOS 函數調用到達時,NetBIOS-NS 首先通過三次廣播(Broadcast)的方式查詢(Query)網絡上所有節點的名稱表,以獲得使用了該名字的計算機的 IP 地址。如果該名字有多個對應的 IP 地址,則返回所有的 IP 地址。

相反的,如果一個計算機希望把自己的名字註冊到網絡上,它就會向 NetBIOS-NS 發送一個「名字註冊」(Name Registration)請求,NetBIOS-NS 會先查詢網絡上是否已經有其他計算機的名字相同,如果沒有,就向網絡上廣播一個「名字註冊」回復,告訴其它計算機該名字已經被佔用並且提供自身的 IP 地址。如果多個計算機請求同一個名字的註冊,則只有一個計算機能夠註冊成功,後來的請求將被忽略。

三、NetBIOS-NS 端口和服務

NetBIOS-NS 端口使用的是 UDP 協議中的 137 端口,每個使用 NetBIOS-NS 服務的計算機都必須註冊一個 NetBIOS 名字,並向網絡中註冊該服務。當其它計算機需要連接到該服務時,就可以通過名稱傳輸(NetBIOS Name Resolution)查詢該名字的實際 IP 地址,從而建立服務與調用之間的連接。NetBIOS-NS 還有一個充當 NetBIOS 進程間通信服務(NetBIOS Session Service)的標準 TCP/IP 端口,即 139 端口。該端口主要用於實現 SMB(Server Message Block)和 CIFS(Common Internet File System) 等服務。

四、NetBIOS-NS 的安全問題

由於 NetBIOS-NS 在設計之初並沒有考慮安全問題,因此在網絡安全方面存在許多問題。例如,NetBIOS-NS 在註冊名字時沒有進行身份驗證,因此能夠輕易地進行 DNS Spoofing 或者 ARP Spoofing 攻擊,從而實現欺騙性的 DNS 查詢結果。為了避免網絡中出現此類問題,可採用 IPsec 或 VPN 等技術,加密數據協議,如 SMB、NetBIOS 等,並限制 NetBIOS-NS 在網絡中的使用頻率。

五、NetBIOS-NS 的代碼示例

//NetBIOS註冊名字
void nbns_reg_name(unsigned char *name)
{
    unsigned char buff[65536];
    
    memset(buff, 0, sizeof(buff));
    struct nbns_header *nbh = (struct nbns_header *) buff;
    struct nbns_question *nbq = (struct nbns_question *) (buff + sizeof(struct nbns_header));
    struct sockaddr_in sin = { 0 };

    nbh->id = htons(getpid());  //進程 id,隨機生成
    nbh->flags = htons(0x0120); //NBNS標誌,註冊名字

    //問題部分
    qname(nbq->name, name); //註冊名字
    nbq->type = htons(NBNS_TYPE_NB); //類型
    nbq->classes = htons(NBNS_CLASS_IN); //類別

    sin.sin_family = AF_INET;
    sin.sin_port = htons(NBNS_PORT);

    int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    bind(s, (struct sockaddr *) &sin, sizeof(struct sockaddr_in));
    sendto(s, buff, sizeof(struct nbns_header) + sizeof(struct nbns_question) + nbq->name_len, 0, &sin, sizeof(sin));
    close(s);
}

//NetBIOS查詢名字
int nbns_query_name(unsigned char *name, char *addr)
{
    unsigned char buff[65536];
    struct sockaddr_in sin;
    struct timeval tv;
    
    memset(buff, 0, sizeof(buff));
    struct nbns_header *nbh = (struct nbns_header *) buff;
    struct nbns_question *nbq = (struct nbns_question *) (buff + sizeof(struct nbns_header));

    nbh->id = htons(getpid()); //進程 id,隨機生成
    nbh->flags = htons(0x0100); //NBNS標誌,查詢名字

    //問題部分
    qname(nbq->name, name); //查詢名字
    nbq->type = htons(NBNS_TYPE_NB); //類型
    nbq->classes = htons(NBNS_CLASS_IN); //類別

    sin.sin_family = AF_INET;
    sin.sin_port = htons(NBNS_PORT);
    sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);

    int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    setsockopt(s, SOL_SOCKET, SO_BROADCAST, &sin, sizeof(sin));
    sendto(s, buff, sizeof(struct nbns_header) + sizeof(struct nbns_question) + nbq->name_len, 0, &sin, sizeof(sin));

    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(s, &fds);

    tv.tv_sec = 1;
    tv.tv_usec = 0;
    select(s + 1, &fds, NULL, NULL, &tv);
    if (FD_ISSET(s, &fds))
    {
        struct sockaddr_in client;
        socklen_t len = sizeof(client);
        unsigned int buflen = recvfrom(s, buff, sizeof(buff), 0, (struct sockaddr *) &client, &len);

        struct nbns_answer *nba = (struct nbns_answer *) (buff + sizeof(struct nbns_header) + sizeof(struct nbns_question));

        struct sockaddr_in *sinaddr = (struct sockaddr_in *) &nba->resource[nba->ans][6];

        memcpy(addr, inet_ntoa(sinaddr->sin_addr), strlen(inet_ntoa(sinaddr->sin_addr)) + 1);

        close(s);
        return 1;
    }
    close(s);
    return 0;
}

原創文章,作者:VMXTM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/330278.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VMXTM的頭像VMXTM
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬盤。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • 如何在樹莓派上安裝Windows 7系統?

    隨着樹莓派的普及,許多用戶想在樹莓派上安裝Windows 7操作系統。 一、準備工作 在開始之前,需要準備以下材料: 1.樹莓派4B一台; 2.一張8GB以上的SD卡; 3.下載並…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字符串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 使用Netzob進行網絡協議分析

    Netzob是一款開源的網絡協議分析工具。它提供了一套完整的協議分析框架,可以支持多種數據格式的解析和可視化,方便用戶對協議數據進行分析和定製。本文將從多個方面對Netzob進行詳…

    編程 2025-04-29
  • Python基本統計量計算

    本文將從多個方面詳細介紹Python中基本統計量計算的方法。 一、均值 均值是一組數據的平均值,也就是將所有數據相加後再除以數據個數。 在Python中,可以使用numpy庫中的m…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • 分銷系統開發搭建

    本文主要介紹如何搭建一套完整的分銷系統,從需求分析、技術選型、開發、部署等方面進行說明。 一、需求分析 在進行分銷系統的開發之前,我們首先需要對系統進行需求分析。一般來說,分銷系統…

    編程 2025-04-29

發表回復

登錄後才能評論