前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C/C++ 实现枚举网上邻居信息

C/C++ 实现枚举网上邻居信息

作者头像
王 瑞
发布于 2023-12-06 06:32:57
发布于 2023-12-06 06:32:57
37910
代码可运行
举报
运行总次数:0
代码可运行

Windows系统中,通过网络邻居可以方便地查看本地网络中的共享资源和计算机。通过使用Windows API中的一些网络相关函数,我们可以实现枚举网络邻居信息的功能,获取连接到本地网络的其他计算机的相关信息。本文将介绍一个简单的C++程序,使用Windows API枚举网络邻居信息,并获取对端名称、本机名称、主机名称以及主机IP等信息。

引言

首先,我们需要了解一下几个与网络邻居信息有关的Windows API函数:

NETRESOURCE 结构体是 Windows 网络 API 中的一个结构体,用于描述网络资源的信息。它在网络资源的枚举和连接等操作中经常被使用。

结构体定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct _NETRESOURCE {
  DWORD         dwScope;
  DWORD         dwType;
  DWORD         dwDisplayType;
  DWORD         dwUsage;
  LPTSTR        lpLocalName;
  LPTSTR        lpRemoteName;
  LPTSTR        lpComment;
  LPTSTR        lpProvider;
} NETRESOURCE, *LPNETRESOURCE;

结构体成员

  • dwScope:指定资源的可见性。可能的取值为:
    • RESOURCE_CONNECTED:表示已连接的资源。
    • RESOURCE_CONTEXT:表示会话特定的资源。
  • dwType:指定资源的类型。可能的取值为:
    • RESOURCETYPE_ANY:表示任何类型的资源。
    • RESOURCETYPE_DISK:表示磁盘资源。
    • RESOURCETYPE_PRINT:表示打印机资源。
  • dwDisplayType:指定资源的显示类型。可能的取值为:
    • RESOURCEDISPLAYTYPE_GENERIC:表示通用资源。
    • RESOURCEDISPLAYTYPE_DOMAIN:表示域。
  • dwUsage:指定资源的使用类型。可能的取值为:
    • RESOURCEUSAGE_CONNECTABLE:表示资源可以连接。
    • RESOURCEUSAGE_CONTAINER:表示资源是一个容器,可以包含其他资源。
  • lpLocalName:指定本地驱动器或打印机的本地名称。
  • lpRemoteName:指定远程共享资源的网络名称。
  • lpComment:指定资源的注释。
  • lpProvider:指定提供资源的网络提供程序的名称。

WNetOpenEnum 是 Windows 网络功能中的一个API函数,WNetOpenEnum 通过指定的参数打开一个用于列举网络资源的枚举句柄。这个句柄可以在后续的操作中用于获取网络资源的枚举信息。

函数原型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DWORD WNetOpenEnum(
  DWORD         dwScope,
  DWORD         dwType,
  DWORD         dwUsage,
  LPNETRESOURCE lpNetResource,
  LPHANDLE      lphEnum
);

参数说明

  • dwScope:指定枚举的范围,可以是 RESOURCE_CONNECTEDRESOURCE_GLOBALNETRESOURCE_REMEMBEREDRESOURCE_CONTEXT 中的一个。
  • dwType:指定枚举资源的类型,可以是 RESOURCETYPE_DISKRESOURCETYPE_PRINTRESOURCETYPE_ANY 中的一个。
  • dwUsage:指定枚举资源的使用类型,可以是 RESOURCEUSAGE_CONNECTABLERESOURCEUSAGE_CONTAINERRESOURCEUSAGE_NOLOCALDEVICERESOURCEUSAGE_SIBLING 中的一个。
  • lpNetResource:指向 NETRESOURCE 结构的指针,用于指定枚举的起始位置。如果为 NULL,则从所有资源的最顶层开始枚举。
  • lphEnum:指向句柄的指针,用于接收枚举句柄。

返回值

如果函数调用成功,返回 NO_ERROR,否则返回一个错误代码,可以通过 GetLastError 函数获取详细信息。

WNetEnumResource 是 Windows 网络功能中的 API 函数之一,用于通过枚举句柄获取网络资源的详细信息,包括资源的类型、用途、本地名、远程名等信息。

函数原型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DWORD WNetEnumResource(
  HANDLE  hEnum,
  LPDWORD lpcCount,
  LPVOID  lpBuffer,
  LPDWORD lpBufferSize
);

参数说明

  • hEnum:枚举句柄,通过 WNetOpenEnum 函数获取的句柄。
  • lpcCount:指向一个变量的指针,该变量用于接收枚举的资源数目。
  • lpBuffer:指向一个缓冲区的指针,用于接收枚举的资源信息。
  • lpBufferSize:指向一个变量的指针,该变量用于指定或接收缓冲区的大小。

返回值

如果函数调用成功,返回 NO_ERROR,否则返回一个错误代码,可以通过 GetLastError 函数获取详细信息。

WNetCloseEnum 函数用于关闭由 WNetOpenEnum 函数打开的网络资源的枚举句柄。在使用 WNetOpenEnum 函数枚举网络资源后,当不再需要使用枚举句柄时,应该通过调用 WNetCloseEnum 函数来释放资源,避免内存泄漏。

函数定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DWORD WNetCloseEnum(
  HANDLE hEnum
);

参数

  • hEnum:网络资源的枚举句柄,该句柄是由 WNetOpenEnum 函数返回的。

返回值

如果函数调用成功,返回 NO_ERROR,否则返回错误代码,可以通过 GetLastError 函数获取详细的错误信息。

代码实现

以下是一个简单的C++程序,使用上述API函数实现了枚举网络邻居信息的功能。该程序通过遍历枚举得到的网络资源信息,获取对端名称、本机名称、主机名称以及主机IP等信息,并输出到控制台。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <Windows.h>
#include <winnetwk.h>

#pragma comment(lib,"Mpr.lib")
#pragma comment(lib,"Ws2_32.lib")

// 枚举网络邻居
BOOL EnumNetResource()
{
  NETRESOURCE  *NetResource = NULL;
  HANDLE  hEnum;
  unsigned  int  i;
  char szHostName[MAX_PATH] = { 0 };
  hostent *host = NULL;
  char *lpszIP = NULL;

  // 通过WSAStartup函数完成对Winsock服务的初始化
  WSADATA wsaData = { 0 };
  WSAStartup(MAKEWORD(2, 2), &wsaData);

  // 指定枚举范围, 获取枚举句柄
  WNetOpenEnum(RESOURCE_CONTEXT, NULL, NULL, NULL, &hEnum);
  if (hEnum)
  {
    DWORD  Count = 0xFFFFFFFF;
    DWORD  BufferSize = 2048;
    BYTE *pBuffer = new  BYTE[2048];

    // 根据设置的枚举返回, 获取枚举信息
    WNetEnumResource(hEnum, &Count, pBuffer, &BufferSize);
    NetResource = (NETRESOURCE*)pBuffer;

    for (i = 0; i < BufferSize / sizeof(NETRESOURCE); i++, NetResource++)
    {
      // 判断资源类型是否是所有资源 以及 判断资源使用类型是否是容器资源
      if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER  && NetResource->dwType == RESOURCETYPE_ANY)
      {
        if (NetResource->lpRemoteName)
        {
          // 获取远程主机名
          RtlZeroMemory(szHostName, MAX_PATH);
          lstrcpy(szHostName, (char *)((DWORD64)NetResource->lpRemoteName + 2));

          // 根据主机名获取IP地址信息
          host = gethostbyname(szHostName);
          if (host == NULL)
          {
            std::cout << "错误代码" << std::endl;
            continue;
          }

          // 将Ipv4网络地址转换为Internet标准点分十进制格式的ASCII字符串
          lpszIP = inet_ntoa(*(in_addr *)host->h_addr_list[0]);
          std::cout << "对端名称: " << NetResource->lpRemoteName
            << " 本机名称: " << NetResource->lpLocalName
            << " 主机名称: " << szHostName
            << " 主机IP: " << lpszIP
            << std::endl;
        }
      }
    }

    // 释放内存并关闭句柄
    delete[]pBuffer;
    pBuffer = NULL;
    WNetCloseEnum(hEnum);
  }
  return TRUE;
}

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

  system("pause");
  return 0;
}

结语

通过这个简单的程序,我们可以了解如何使用Windows API函数来枚举网络邻居信息。这对于需要在程序中获取网络中其他计算机信息的场景是非常有用的。在实际应用中,可以根据需要进一步扩展和优化代码,以满足特定的功能需求。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
NetResource->lpRemoteName 请问为什么得到的 是0
NetResource-&gt;lpRemoteName 请问为什么得到的 是0
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
18.1 Socket 原生套接字抓包
原生套接字抓包的实现原理依赖于Windows系统中提供的ioctlsocket函数,该函数可将指定的网卡设置为混杂模式,网卡混杂模式(Promiscuous Mode)是常用于计算机网络抓包的一种模式,也称为监听模式。在混杂模式下,网卡可以收到经过主机的所有数据包,而非只接收它所对应的MAC地址的数据包。
王 瑞
2023/10/25
5030
18.1 Socket 原生套接字抓包
关于windows完成端口(IOCP)的一些理解(五)
系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows完成端口(IOCP)的一些理解(六) #include "StdAfx.h" #include "IOCPModel.h" #include "MainDlg.h" // 每一个处理器上产生
范蠡
2018/04/18
1.9K0
红队免杀培训第二章-使用系统调用http 协议下载恶意载荷
从杀软的行为分析来看,就拿cs的通信协议来讲,stage 的载荷在行为上是明显比stageless载荷多很多的,其中不免一些通信协议的特征,分析过的都知道,stage只是个前置载荷,后续会下更大的功能更全的载荷,因为之前做免杀卡巴的时候就注意到了,静态全免,但是在下回来更大的载荷的时候爆毒了,后面分析,卡巴对cs的通信协议进行拦截,从云沙箱的检测来看,stage 爆毒数明显是比stageless多的。
Gamma实验室
2022/03/29
1K0
C/C++ CreateFileMapping 共享内存
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信。因为是通过内存操作实现通信,因此是一种最高效的数据交换方法。
王 瑞
2023/02/10
9150
C/C++ CreateFileMapping 共享内存
psexec原理分析
参加某行动时通过psexec横向过几台主机,正好之前在网上看到很多大佬分析过这款工具,今天也自己动手重新分析一次
HACK学习
2021/06/24
1.2K0
psexec原理分析
C/C++ 发送与接收HTTP/S请求
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议。它是一种无状态的、应用层的协议,用于在计算机之间传输超文本文档,通常在 Web 浏览器和 Web 服务器之间进行数据通信。HTTP 是由互联网工程任务组(IETF)定义的,它是基于客户端-服务器模型的协议,其中客户端向服务器发送请求,服务器以相应的数据作为响应。HTTP 协议是建立在 TCP/IP 协议之上的,通常使用默认的端口号80。
王 瑞
2023/11/29
1.8K0
C/C++ 发送与接收HTTP/S请求
C++ 实现的Ping类的封装
Ping 使用 Internet 控制消息协议(ICMP)来测试主机之间的连接。当用户发送一个 ping 请求时,则对应的发送一个 ICMP Echo 请求消息到目标主机,并等待目标主机回复一个 ICMP Echo 回应消息。如果目标主机接收到请求并且网络连接正常,则会返回一个回应消息,表示主机之间的网络连接是正常的。如果目标主机没有收到请求消息或网络连接不正常,则不会有回应消息返回。
王 瑞
2023/12/06
5770
C++ 实现的Ping类的封装
Windows服务编程
一、服务(Service) 服务程序是NT系统支持的一种可执行文件,通常服务程序不与用户进行交互,在系统启动时会自动启动服务程序。所有的服务程序都由SCM进行管理,每个服务程序必须符合SCM所定义的规范。
欧阳大哥2013
2018/10/25
1.9K0
C/C++ 获取系统IP地址/硬件信息等
#include<stdio.h> #include<winsock2.h> //该头文件需在windows.h之前 #include<windows.h> #include<string> #include<iostream> #pragma comment(lib,"ws2_32.lib") using namespace std; void getIP() { WSADATA WSAData; //WSADATA结构被用来
王 瑞
2022/12/28
1K0
C/C++ 实现FTP文件上传下载
FTP(文件传输协议)是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一,为文件的上传、下载和文件管理提供了一种标准化的方法,在Windows系统中操作FTP上传下载可以使用WinINet库,WinINet(Windows Internet)库是 Windows 操作系统中的一个网络 API 库,用于访问 Internet 上的资源。它提供了一组函数,使开发人员能够创建网络应用程序,例如通过 HTTP 协议下载文件,发送 HTTP 请求,处理 cookie 等,本章将通过使用WinInet所提供的接口实现FTP文件上传下载功能,使得用户可以通过代码的方式上传或下载文件与FTP服务器交互。
王 瑞
2023/12/01
6170
C/C++ 实现FTP文件上传下载
C/C++ Inline Hook 钩子编写技巧
Hook 技术通常被称为钩子技术,Hook技术是Windows系统用于替代中断机制的具体实现,钩子的含义就是在程序还没有调用系统函数之前,钩子捕获调用消息并获得控制权,在执行系统调用之前执行自身程序,简单来说就是函数劫持,本笔记将具体介绍应用层Hook的实现机制。
王 瑞
2022/12/28
2.8K0
C/C++ Inline Hook 钩子编写技巧
玩转注册表,这几个windowsAPI函数就够了
注册表是一个数据库,它的结构同逻辑磁盘类似。注册表包含键(Key),它类似磁盘中的目录,注册表还包含键值(Value),它类似磁盘中的文件。一个键可以包含多个子健和键值,其中键值用于存储数据,顶层建称为根键,注册表的根键如下图(Win+R 输入命令 regedit ):
DeROy
2020/08/11
4.2K0
windows服务管理操作
服务程序是windows上重要的一类程序,它们虽然不与用户进行界面交互,但是它们对于系统有着重要的意义。windows上为了管理服务程序提供了一个特别的程序:服务控制管理程序,系统上关于服务控制管理的API基本上都与这个程序打交道。下面通过对服务程序的操作来说明这些API函数
Masimaro
2019/02/25
1.8K0
windows完成端口(五)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) #include "StdAfx.h" #include "IOCPModel.h" #include "MainDlg.h" // 每一个处理器上产生多少个线程(为了最大限度的提升服务器性能,详见配套文档) #define WORKER_THREADS_PER_PROCESSOR 2 // 同时投
范蠡
2018/04/24
2K0
C/C++ 通过HTTP实现文件上传下载
WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持。它包括了一系列的函数,使得 Windows 应用程序能够进行网络通信、处理 HTTP 请求、FTP 操作等。WinInet 提供了一套完整的网络通信工具,使得开发者能够轻松地构建支持网络功能的应用程序,涵盖了从简单的 HTTP 请求到复杂的文件传输等多种网络操作。
王 瑞
2023/12/02
9800
C/C++ 通过HTTP实现文件上传下载
深入了解”网上邻居”原理「建议收藏」
说到“网上邻居”,相信很多人都很熟悉。但是说起“网上邻居”的工作机制,可能大家就不太清楚了。
全栈程序员站长
2022/09/20
1.6K0
使用VC建立网络连接并访问网络资源
在windows下可以通过系统操作,将局域网的资源映射到本地,从而实现像本地数据一样访问网络资源。实际上这些步骤也可通过代码调用win32函数实现,前提是你得知道目标机器的地址以及密钥。
charlee44
2022/05/05
5890
使用VC建立网络连接并访问网络资源
Windows核心编程第一章.错误处理
不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时,也把自己所学的知识进行 总结,以及巩固.
IBinary
2019/05/25
5210
渗透测试 | 内网信息收集
在内网渗透测试中,信息收集的深度与广度,直接关系到整个内网渗透测试的成败,本篇文章主要对内网信息收集做简单介绍~
Power7089
2020/09/28
3.3K0
渗透测试 | 内网信息收集
C/C++ 遍历窗口标题类名
遍历每个进程,一次查找进程下的窗口,找到窗口标题为 “” ,窗口类名为 “RunDll” 的窗口。如果找到返回 true ,没找到返回 false。
王 瑞
2022/12/28
1.3K0
相关推荐
18.1 Socket 原生套接字抓包
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档