nbtstat Linux版源码, 通过IP获取主机名

nbtstat Linux版, 通过IP获取主机名/* NETBIOS name lookup tool - by eSDee of Netric (www.netric.org)
 * yeh.. i was really bored :-)
 *
 * [[email protected]] gcc -o nbtstat nbtstat.c && ./nbtstat 10.0.0.4
 * Request sent, waiting for reply... [ctrl-c to abort]
 * Name                Type
 * ----------------------------------
 * HOEPELKO-ESPU0B <00> UNIQUE Workstation Service
 * HOEPELKO-ESPU0B <20> UNIQUE File Server Service
 * WORKGROUP       <00> GROUP  Domain Name
 * WORKGROUP       <1e> GROUP  Browser Service Elections
 * HOEPELKO-ESPU0B <03> UNIQUE Messenger Service
 * ADMINISTRATOR   <03> UNIQUE Messenger Service
 * WORKGROUP       <1d> UNIQUE Master Browser
 * ..__MSBROWSE__. <01> GROUP  Master Browser
 * MAC-addres = 00-02-a5-e1-fd-b7
 * [/home/esdee/nbtstat] */

#include  <stdio.h>
#include  <string.h>
#include  <sys/types.h>
#include  <sys/socket.h>
#include  <netinet/in.h>
#include  <netdb.h>
#include  <unistd.h>

char nbtname[]= /* netbios name packet */
{
    0x80,0xf0,0x00,0x10,0x00,0x01,0x00,0x00,
    0x00,0x00,0x00,0x00,0x20,0x43,0x4b,0x41,
    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
    0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x21,
    0x00,0x01
};

int display();

int main(int argc, char *argv[])
{
    char temp[16];

    unsigned char recv[256];
    unsigned char *ptr;

    struct sockaddr_in server;
    struct hostent *hp;

    int s;
    int total;

    unsigned int nb_num;
    unsigned int nb_type;

    int i = 0;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s <hostname>\n", argv[0]);
        return 1;
    }

    if ((hp = gethostbyname(argv[1])) == NULL)  {
        fprintf(stderr,"Error: Unable to resolve %s\n", argv[1]);
        return 1;
    }

    if ((s = socket(PF_INET, SOCK_DGRAM, 17)) < 0)  { /* 17 = UDP */
        perror("socket");
        return 1;
    }

    memset(recv,0x0, sizeof(recv));

    bzero((char *) &server, sizeof(server));
    bcopy(hp->h_addr, (char *) &server.sin_addr, hp->h_length);

    server.sin_family = hp->h_addrtype;
    server.sin_port = htons(137); /* netbios-ns */

    if (sendto(s, nbtname, sizeof(nbtname), 0, (struct sockaddr *) &server, sizeof(server)) < 0)  {
        perror("sendto");
        return 1;
    } else {
        fprintf(stdout, "Request sent, waiting for reply... [ctrl-c to abort]\n");

        read(s, recv, sizeof(recv) - 1);

        fprintf(stdout,"Name                Type\n"
                       "----------------------------------\n");
        ptr=recv+57;
         total=*(ptr - 1); /* max names */

        while(ptr < recv + sizeof(recv)) {
            memset(temp,0x0, sizeof(temp));
            strncpy(temp, ptr, 15);         /* copies the name into temp */

            ptr+=15;
            nb_num  = *ptr;
            nb_type = *(ptr + 1);
            ptr+=3;

            if (i==total) {          /* max names reached */
                ptr-=19;         /* sets the pointer to the mac_addres field */
                fprintf(stdout,"\nMAC-addres = %02x-%02x-%02x-%02x-%02x-%02x\n\n",
                           *(ptr + 1), *(ptr + 2), *(ptr + 3),
                           *(ptr + 4), *(ptr + 5), *(ptr + 6));
                break;
            }

            display(temp,nb_num,nb_type);
            i++;
        }
    }
    close(s);
    return  0;
}

int display(char *name, unsigned int number, unsigned int type)
{
    char description[256];
    int i;

    memset(description, 0x0, sizeof(description));

    /* list taken from http://support.microsoft.com/default.aspx?scid=KB;EN-US;q163409& */
    /* 0x04 - UNIQUE */
    /* 0x80 - GROUP */

    switch(number) {
        case 0x00:
            if (type <= 0x80) {
                    strncpy(description, "UNIQUE Workstation Service", sizeof(description) - 1);
            } else {
                    strncpy(description, "GROUP  Domain Name", sizeof(description) - 1);
            }
            break;
        case 0x01:
            if (type <= 0x80) {
                    strncpy(description, "UNIQUE Messenger Service", sizeof(description) - 1);
            } else {
                    strncpy(description, "GROUP  Master Browser", sizeof(description) - 1);
            }
            break;
        case 0x03:
            strncpy(description, "UNIQUE Messenger Service", sizeof(description) - 1);
            break;
        case 0x06:
            strncpy(description, "UNIQUE RAS Server Service", sizeof(description) - 1);
            break;
        case 0x1b:
            strncpy(description, "UNIQUE Domain Master Browser", sizeof(description) - 1);
            break;
        case 0x1c:
            strncpy(description, "GROUP  Domain Controllers", sizeof(description) - 1);
            break;
        case 0x1d:
            strncpy(description, "UNIQUE Master Browser", sizeof(description) - 1);
            break;
        case 0x1e:
            if (type >= 0x80) strncpy(description, "GROUP  Browser Service Elections", sizeof(description) - 1);
            break;
        case 0x1F:
            strncpy(description, "UNIQUE NetDDE Service", sizeof(description) - 1);
            break;
        case 0x20:
            strncpy(description, "UNIQUE File Server Service", sizeof(description) - 1);
            break;
        case 0x21:
            strncpy(description, "UNIQUE RAS Client Service", sizeof(description) - 1);
            break;
        case 0x22:
            strncpy(description, "UNIQUE Microsoft Exchange Interchange(MSMail Connector)", sizeof(description) - 1);
            break;
        case 0x23:
            strncpy(description, "UNIQUE Microsoft Exchange Store", sizeof(description) - 1);
            break;
        case 0x24:
            strncpy(description, "UNIQUE Microsoft Exchange Directory", sizeof(description) - 1);
            break;
        case 0x30:
            strncpy(description, "UNIQUE Modem Sharing Server Service", sizeof(description) - 1);
            break;
        case 0x31:
            strncpy(description, "UNIQUE Modem Sharing Client Service", sizeof(description) - 1);
            break;
        case 0x42:
            strncpy(description, "UNIQUE Mcaffee Anti-Virus", sizeof(description) - 1);
            break;
        case 0x43:
            strncpy(description, "UNIQUE SMS Clients Remote Control", sizeof(description) - 1);
            break;
        case 0x44:
            strncpy(description, "UNIQUE SMS Administrators Remote Control Tool", sizeof(description) - 1);
            break;
        case 0x45:
            strncpy(description, "UNIQUE SMS Clients Remote Chat", sizeof(description) - 1);
            break;
        case 0x46:
            strncpy(description, "UNIQUE SMS Clients Remote Transfer", sizeof(description) - 1);
            break;
        case 0x4C:
            strncpy(description, "UNIQUE DEC Pathworks TCPIP service on Windows NT", sizeof(description) - 1);
            break;
        case 0x52:
            strncpy(description, "UNIQUE DEC Pathworks TCPIP service on Windows NT", sizeof(description) - 1);
            break;
        case 0x6a:
            strncpy(description, "UNIQUE Microsoft Exchange IMC", sizeof(description) - 1);
            break;
        case 0x87:
            strncpy(description, "UNIQUE Microsoft Exchange MTA", sizeof(description) - 1);
            break;
        case 0xbe:
            strncpy(description, "UNIQUE Network Monitor Agent", sizeof(description) - 1);
            break;
        case 0xbf:
            strncpy(description, "UNIQUE Network Monitor Application", sizeof(description) - 1);
            break;
        default:
            strncpy(description, "UNIQUE Unknown", sizeof(description) - 1);
            break;
    }

    for (i=0; i < strlen(name); i++) /* replaces weird chars with dots */
        if (name[i] < 31 || name[i] > 126) name[i] = ‘.‘;

    if (name) fprintf(stdout, "%s <%02x> %s\n", name, number, description);
    return 0;

}
时间: 2024-10-10 11:08:36

nbtstat Linux版源码, 通过IP获取主机名的相关文章

linux内核源码注解

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结

atitit.商业版 源码保护 与 java本地原生代码转换 的方案总结 1. 为什么虚拟机语言容易被反编译 1 2. 源码泄露的问题问题 1 3. Excelsior JET 1 4. gcj.的流程 2 5. classloader方案,,还凑后 2 6. 制作伪exe,其实和上一种做法是一样的,只不过做成exe,调用系统的java.exe来运行它,这样的工具有nativeJ,exe4j等 3 7. 其他 3 1. 为什么虚拟机语言容易被反编译 ,但虚拟机的中间语言由于带了大量的"元数据&q

轻松学习linux内核源码的方法

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

linux上源码安装MySQL详解

最近需要使用MySQL Fabric,这货是MySQL5.6.10之后才出现的utility.手头机器装的是MySQL5.1,所以需要先把旧版MySQL升级成5.6版本.之前没有玩过MySQL,所以这次稍微费了点事.在此,把过程记录下来,希望能给有需求的人提供一点帮助.下面我们就正式开始. 1. 删除老版本MySQL 其实删除老版MySQL是一件很简单的事,但是开始时候由于担心各个包的依赖会导致各种问题,亦步亦趋来得很慢.其实只需要做到这么几步就可以了: 1.1 查看已安装的mysql版本并删除

深入分析Linux内核源码oss.org.cn/kernel-book/

本html页面地址:http://oss.org.cn/kernel-book/ 深入分析Linux内核源码 前言         第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核            1.3.1 Linux内核的特征 1.3.2 Linux内核版本的变化 1.4 分析Linux内核的意义         1.4.1 开发适合自己的操作系统 1.4.2 开发高水平软件 1.4.3 有助于计算机科学的教学和

Unix网络编程第三版源码编译

配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版本是否匹配.编译器.库文件.头文件以及结构体定义等等) checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for

linux内存源码分析 - SLUB分配器概述

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统.慢慢的slab分配器或许会被slub取代,所以对slub的了解是十分有必要的. 我们先说说slab分配器的弊端,我们知道slab分配器中每个node结点有三个链表,分别是空闲slab链表,部分空sla

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

Linux 的源码安装工具 CheckInstall

Linux 的源码安装工具 CheckInstall Checkinstall 是一个能从 tar.gz 类的 https://www.ibm.com/developerworks/cn/linux/l-cn-checkinstall/ 用 CheckInstall 安装程序 上节我们采用 GNU Autoconf 来编译程序,现在该是换一种方式的时候了.你可以使用CheckInstall 工具.它采用自己的指令 checkinstall 来代替 make install.其他两个指令保留下来跟