ndis hook开发日志(2)-获取网卡信息

使用Sniffer截获流经本机网卡的IP数据包 Win2K下的Sniffer工具源代码 详细信息   Win2K下的Sniffer源代码。[代码性质] VC完整应用程序代码[代码作者] zw[文件大小] 130K [更新日期] 2002-11-26 19:47:00 [下载次数] 6015  http://www.vckbase.com/code/downcode.asp?id=1692IP包监听程序(For 9x)源代码 详细信息 阅读详情

搞了半天,唉,还是读注册表获取网卡信息比较好,还有一个方式我也贴下面,关键是我还没弄明白

下面是我的代码:

PUNICODE_STRING                uAdapName = Adapter->MyOpenBlock->RootDeviceName;
	PWCHAR                         p = RVATOVA(uAdapName->Buffer, uAdapName->Length << 1);
	UNICODE_STRING                 uName;
	OBJECT_ATTRIBUTES              obj;	
	HANDLE                         KeyHandle;

	if (Adapter->Type != NdisMedium802_3) return;

	while (*(p-1) != '//') p--;

	DbgPrint("Adap %ws %ws", p, Adapter->MyOpenBlock->BindDeviceName->Buffer);

	swprintf(Name, L"//registry//machine//system//CurrentControlSet//Services//Tcpip//Par ameters//Interfaces//%ws", p);

	RtlInitUnicodeString(&uName, Name);

	InitializeObjectAttributes(
		    &obj, 
			&uName, 
			OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 
			NULL, 
			NULL
			);

status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &obj);

	if (NT_SUCCESS(status))
	{
		Adapter->IpAddress = ReadIpAddress(KeyHandle, L"IPAddress");

		if (!Adapter->IpAddress)
		{
			Adapter->IpAddress = ReadIpAddress(KeyHandle, L"DhcpIPAddress");
			DbgPrint("Get dhcp ip");
		}

		Adapter->SubnetMask = ReadIpAddress(KeyHandle, L"SubnetMask");

		if (!Adapter->SubnetMask)
		{
			Adapter->SubnetMask = ReadIpAddress(KeyHandle, L"DhcpSubnetMask");
		}

		Adapter->Gateway = ReadIpAddress(KeyHandle, L"DefaultGateway");

		ZwClose(KeyHandle);
	}

ULONG 
  ReadIpAddress(
        IN HANDLE KeyHandle,
		IN PWCHAR ValName
		)
{
	UNICODE_STRING                 uName;
	WCHAR                          Name[MAX_PATH];
	PKEY_VALUE_PARTIAL_INFORMATION Info = (void*)&Name;
	CHAR                           aName[MAX_PATH];
	ULONG                          ResLen;

	RtlInitUnicodeString(&uName, ValName);

	ZwQueryValueKey(
		  KeyHandle, 
		  &uName, 
		  KeyValuePartialInformation,
		  Info,
		  sizeof(Name),
		  &ResLen
		  );

	wcstombs(aName, (PWCHAR)&Info->Data, -1);

	return inet_addr(aName);
}

u32_t inet_addr(const char *cp)
{
    u32_t address; 
    u32_t shift;
    u32_t sym;

    address = 0;
    shift = 0;

    while (*cp) 
    {
        sym = 0;

        while ((*cp != '.') && (*cp != '/0')) 
        {
           if ((*cp < '0') || (*cp > '9')) return 0;

            sym = sym*10 + (u32_t)(*cp - '0'); 
            ++cp;
        }

        address += sym << shift;    
        shift += 8;

        if (*cp++ == '/0') break;
    }

    return address;
}
来看看packet.sys是如何获取的:
typedef struct _OPEN_INSTANCE {
    PDEVICE_OBJECT      DeviceObject;
    ULONG               IrpCount;
    NDIS_STRING         AdapterName;
    NDIS_STRING         SymbolicLink;
   
    NDIS_HANDLE         AdapterHandle;
    NDIS_HANDLE         PacketPool;
    KSPIN_LOCK          RcvQSpinLock;
    LIST_ENTRY          RcvList;
    NDIS_MEDIUM         Medium;
    KSPIN_LOCK          ResetQueueLock;
    LIST_ENTRY          ResetIrpList;
    NDIS_STATUS         Status;   
    NDIS_EVENT          Event;     
    NDIS_EVENT          CleanupEvent;
    //
    // List entry to link to the other deviceobjects.
    //
    LIST_ENTRY          AdapterListEntry;
    BOOLEAN             Bound; // Set to TRUE when OpenAdapter is complete
                               // Set to FALSE when CloseAdpater is complete
    CHAR                Filler[3];
} OPEN_INSTANCE, *POPEN_INSTANCE;
NTSTATUS
PacketGetAdapterList(
    IN  PVOID              Buffer,
    IN  ULONG              Length,
    IN  OUT PULONG         DataLength
    )
/*++
Routine Description:
    This routine walks the adapter list and gets the symbolic
    link and NIC description and fills it in the Buffer.
    The format of the information is given below.
   
Arguments:

Return Value:
--*/
{
    ULONG               requiredLength = 0, numOfAdapters = 0;
    KIRQL               oldIrql;
    PLIST_ENTRY         thisEntry, listHead;
    POPEN_INSTANCE      open;  
    DebugPrint(("Enter PacketGetAdapterList/n"));
    KeAcquireSpinLock(&Globals.GlobalLock, &oldIrql);
    //
    // Walks the list to find out total space required for AdapterName
    // and Symbolic Link.
    //
    listHead = &Globals.AdapterList;
   
    for(thisEntry = listHead->Flink;
        thisEntry != listHead;
        thisEntry = thisEntry->Flink)
    {
        open = CONTAINING_RECORD(thisEntry, OPEN_INSTANCE, AdapterListEntry);
       
        requiredLength += open->AdapterName.Length + sizeof(UNICODE_NULL);
        requiredLength += open->SymbolicLink.Length + sizeof(UNICODE_NULL);
        numOfAdapters++;
    }
    //
    // We will return the data in the following format:
    // numOfAdapters + One_Or_More("AdapterName/0" + "SymbolicLink/0") + UNICODE_NULL
    // So let's include the numOfAdapters and UNICODE_NULL size
    // to the total length.
    //
   
    requiredLength += sizeof(ULONG) + sizeof(UNICODE_NULL);    
    *DataLength = requiredLength;
   
    if(requiredLength > Length) {
        KeReleaseSpinLock(&Globals.GlobalLock, oldIrql);
        return STATUS_BUFFER_TOO_SMALL;
    }
    *(PULONG)Buffer = numOfAdapters;
    (PCHAR)Buffer += sizeof(ULONG);
   
    //
    // Copy the name and symbolic link of each adapter.
    //
   
    for(thisEntry = listHead->Flink;
        thisEntry != listHead;
        thisEntry = thisEntry->Flink)
    {
        open = CONTAINING_RECORD(thisEntry, OPEN_INSTANCE, AdapterListEntry);
       
        RtlCopyMemory(Buffer, open->AdapterName.Buffer,
                            open->AdapterName.Length+sizeof(WCHAR));
        (PCHAR)Buffer += open->AdapterName.Length+sizeof(WCHAR);
       
        RtlCopyMemory(Buffer, open->SymbolicLink.Buffer,
                            open->SymbolicLink.Length+sizeof(WCHAR));
        (PCHAR)Buffer += open->SymbolicLink.Length+sizeof(WCHAR);
                           
    }
   
    *(PWCHAR)Buffer = UNICODE_NULL;
   
    KeReleaseSpinLock(&Globals.GlobalLock, oldIrql);
   
    return STATUS_SUCCESS;
}
Frida Hook Windows NDIS用户态API伪造MAC地址实战 MAC地址是网络设备的唯一物理标识,其修改行为在操作系统中受严格管控;Windows通过NDIS网络驱动接口规范,在内核与用户态之间构建了多层校验机制。绕过注册表或UI层的简单修改极易被NDIS中间层驱动识别为异常操作,触发安全告警。Frida凭借用户态动态注入与函数级Hook能力,可精准劫持ndis.dll导出函数(如NdisOpenAdapter),在驱动加载前篡改内存中的NDIS_OPEN_PARAMETERS结构体,实现合法、隐蔽、无需重启的MAC伪装。该技术广泛应用于红队渗透、802.1X准入绕过 阅读详情

相关推荐

别再为eNSP报错发愁了!手把手教你搞定VirtualBox 5.2.44、WinPcap和Wireshark 3.6.2的完整安装流程

本文详细解析了eNSP实验环境中VirtualBox 5.2.44、WinPcap和Wireshark 3.6.2的完整安装流程,帮助用户避免常见的错误代码40/41问题。通过精确版本控制、安装顺序和关键配置项解析,确保环境稳定运行,并提供深度验证和排错方法,适合华为认证考生和网络工程师参考。

weixin_30938149的博客 438

Wince中修改IP地址而无需重启

namespace Utitlity.Windows {     using System;     using System.Runtime.InteropServices;     using Microsoft.Win32;     /**////     /// 用于读取和配置以太网卡的IP地址信息     ///     public static class

u012553673的专栏 841

微信消息防撤回技术原理与实战:从Hook到数据备份的完整指南

在即时通讯软件中,消息撤回功能为用户提供了纠错便利,但其背后的客户端-服务器交互机制与本地数据处理逻辑,构成了现代软件工程中典型的数据同步与状态管理案例。理解这一机制,需要从网络协议分析、本地数据存储和进程间通信等基础技术切入。通过Hook技术拦截关键函数调用,或监控网络流量过滤特定指令,可以在不破坏原有通信流程的前提下,实现消息的本地留存。这种技术实践不仅有助于深入理解客户端安全与逆向工程原理,更在数据备份、通信审计等场景中具有实用价值。本文聚焦于微信平台,详细剖析了防撤回的三大实现路径——本地数据Hoo

weixin_34302561的博客 307

如何读取被禁用的网卡信息

http://topic.youkuaiyun.com/u/20080310/19/5fa9b49d-c7f5-42be-986f-4cb46fb4e0b0.html?2079547956 比如,有两张网卡,一张启用,一张禁用,如何获取被禁用的网卡的信息,如网卡MAC,网卡名称等。GetAdaptersInfo不能读取被禁用的网卡的信息向大家赐教 有结果了,被禁用的网卡,可以通过API函数De

anhkgg的专栏 3390

别再只会重启了!Win10 nwifi.sys蓝屏的终极排查手册(从驱动到硬件,保姆级指南)

本文提供了Win10系统中nwifi.sys蓝屏错误的终极排查手册,从驱动更新、系统文件检查到硬件诊断,涵盖全面解决方案。通过专业级的驱动冲突分析和硬件测试,帮助用户彻底解决蓝屏问题,提升系统稳定性。

weixin_30292843的博客 140

Wireshark本地回环抓包实战:从原理到解决方案

网络协议分析是网络调试与安全分析的基础,其核心在于捕获并解析数据包以理解通信过程。本地回环(Loopback)接口用于同一主机内的进程间通信,其流量不经过物理网卡,导致传统抓包工具如Wireshark默认无法捕获。通过理解操作系统网络栈与虚拟网络设备原理,可以运用流量重定向或内核驱动钩子技术,使回环流量对抓包工具可见。这项技术对于后端开发、微服务调试和安全分析具有重要价值,能精准分析本地HTTP/HTTPS API交互。本文聚焦Wireshark抓包实践,详细解析RawCap工具进行流量重定向和Npcap驱

weixin_33226548的博客 247

WINCE 网卡控制

最近在搞wifi上网,看了些这方面的资料,稍微总结点东西:)DeviceIoControl和底层通信:方法1 :把第二个参数设为IOCTL_NDIS_REBIND_ADAPTER。方法2 :把第二个参数设为IOCTL_NDIS_UNBIND_ADAPTER,然后再IOCTL_NDIS_BIND_ADAPTER。获取设备的句柄 : hNdis = CreateFile(DD_NDIS_DEV

dwAll_Blue的专栏 1585

易语言实现WPE封包编辑与解析实战项目

WPE(Winsock Packet Editor)是一款专用于Windows平台的轻量级网络封包编辑工具,通过拦截应用程序调用Winsock API发送和接收的数据包,实现对TCP/IP通信过程的实时监控与修改。其核心技术在于DLL注入与API钩子(Hook),无需依赖底层驱动即可捕获特定进程的Socket通信流量,适用于游戏调试、协议逆向及安全测试等场景。不同协议具有不同的“指纹”特征,可通过静态模式匹配或动态行为分析加以区分。

weixin_42593130的博客 680

网络数据包拦截通用技术

网络数据包拦截通用技术 作者:甘嘉平 (gjp)看到很多仁兄提供的数据包的拦截技术,其中最多的是编写IM DRIVER在NDIS中间层 对MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截。这是微软提供的一种技术 但编写该过滤程序拦截程序非常的复杂,安装也很麻烦。 本人简单的介绍一种更有效的基于NDIS包拦截技术。 大家都知道,NDIS协议驱动程序是通过填写一张NDIS_PROTO

2781

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

ndis hook开发日志(2)-获取网卡信息 - Kevins的天空 http://rootsec.tk - 优快云Blog

导读: 搞了半天,唉,还是读注册表获取网卡信息比较好,还有一个方式我也贴下面,关键是我还没弄明白下面是我的代码:PUNICODE_STRING uAdapName = Adapter->MyOpenBlock->RootDeviceName; PWCHAR p = RVATOVA(uAdapName->Buf

xu的blog 1170

YOLO11 Backbone改进:二值化、三值化权重实战(一)

本文介绍了二值化/三值化神经网络的基本概念、优势挑战及应用场景。二值化网络将权重限制为±1,三值化则增加0值,显著减少模型存储需求和计算复杂度。虽然存在精度下降等挑战,但通过技术改进已能在移动设备、自动驾驶等领域应用。文章分析了YOLO11中适合量化的层,并详细阐述了二值化权重原理及Straight-Through Estimator等关键技术。二值化/三值化神经网络为资源受限设备提供了高效的深度学习解决方案。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 299

Windows内核级硬件信息伪装技术深度解析:原理、实现与系统级应用

EASY-HWID-SPOOFER是一款基于Windows内核模式的硬件信息欺骗工具,能够实现硬盘序列号、BIOS信息、网卡MAC地址和显卡序列号等关键硬件标识的系统级修改。该工具采用内核驱动与用户空间GUI结合的双层架构,为硬件指纹防护和系统伪装提供了技术参考框架。 ## 技术背景与硬件指纹追踪机制 硬件指纹技术通过收集设备的唯一标识信息实现用户追踪,这些标识包括硬盘序列号、BIOS固件数据

gitblog_01065的博客 229

Win11 系统下 VisualStudio2022 配置点云库 PCL1.11.1

安装完成之后打开文件夹E:\PCL 1.11.1\3rdParty\OpenNI2双击 并选择路径 (E:\PCL 1.11.1\3rdParty\OpenNI2) 安装即可全部安装完成之后,将pcl-1.11.1-pdb-msvc2019-win64.zip解压后的 .pdb文件拷贝到(E:\PCL 1.11.1\bin)中设置环境变量:到此,环境变量配置完成。

qq_53545309的博客 1128

QPrintPreviewDialog 打印预览使用实例

qt打印机预览实用demo

啊渊的专栏 3677

深度解析:EASY-HWID-SPOOFER的硬件信息伪装架构与实现原理

在当今数字追踪技术日益复杂的背景下,硬件指纹识别已成为用户隐私保护的重要挑战。EASY-HWID-SPOOFER作为一款基于内核模式的**硬件信息欺骗工具**,通过创新的**双模块架构设计**和**驱动程序派遣函数修改**技术,为技术爱好者和安全研究人员提供了一个深入了解Windows系统底层硬件信息管理的实践平台。该项目不仅实现了对硬盘序列号、BIOS信息、网卡MAC地址和显卡序列号等关键硬件标

gitblog_00559的博客 382

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5288

VMware桥接模式突然断网?揭秘物理网卡驱动、IP冲突与防火墙策略的3重隐性陷阱

快速解决VMware桥接模式无法上网问题,深入剖析物理网卡驱动异常、IP地址冲突及防火墙策略三大隐性原因。适用于Windows宿主机常见断网场景,提供逐项排查步骤与一键修复建议,稳定高效。值得收藏

InitFlow的博客 179

OWASP-ZAP扫描器的使用

目录 OWASP-ZAP 更新 代理 目录扫描 主动扫描(Active Scan) 扫描结果 生成报告 OWASP-ZAP OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者积极维护。它可以帮助你在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。 也可以说ZAP是一个中间人代理。它能够获取你对Web应用程序发出的所有请求以...

谢公子的博客 2万+

使用R语言获取data.frame中指定列的数据

这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。

DevRevolt的博客 2321

EASY-HWID-SPOOFER 技术解析:基于内核模式的硬件信息修改实现原理

EASY-HWID-SPOOFER 是一个基于 Windows 内核驱动技术实现的硬件信息修改工具,支持对硬盘序列号、BIOS 信息、网卡 MAC 地址和显卡序列号等关键硬件标识进行修改。该项目采用用户层 GUI 界面与内核层驱动协同工作的架构,为技术研究者和安全研究人员提供了深入了解硬件信息修改技术的实践平台。 ## 项目架构与模块设计 EASY-HWID-SPOOFER 采用典型的 Win

gitblog_00974的博客 293

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Windows内核级硬件指纹逆向工程:EASY-HWID-SPOOFER技术深度解析

在数字身份追踪日益严密的现代计算环境中,硬件指纹(HWID)已成为系统识别用户设备的终极标识。EASY-HWID-SPOOFER作为一款基于Windows内核模式的硬件信息欺骗工具,通过Ring0权限直接干预硬件抽象层,实现了对硬盘序列号、BIOS信息、网卡MAC地址和显卡序列号等关键硬件标识的动态修改。本文将从系统内核编程角度深入剖析其技术实现原理、安全机制绕过策略以及硬件抽象层操作技术。 #

gitblog_01179的博客 337

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

如何为HaruNeko开发新前端:add-frontend 开发者指南完整拆解

HaruNeko(HakuNeko 原型项目)是一款基于 TypeScript + Electron / NW.js 的漫画、动画与小说下载工具,它采用"引擎 + 可插拔前端"的架构:**同一个下载引擎可以搭配多个风格完全不同的前端**——可能是手机漫画阅读器风格,也可能是完整的漫画库管理器。本指南基于官方教程 [add-frontend.md](https://link.gitcode.com/

gitblog_00480的博客 347

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

yuzu 模拟器 7 个 Mainline 版本完整选型指南:如何选版本、配参数、验帧率

yuzu-downloads 归档了 2024-02-27 至 2024-03-04 发布的 7 个 yuzu Switch 模拟器 Mainline Build,每个版本都含 Linux AppImage 与 Windows zip。照做版结论:主流玩家用 `d839edbda`(2024-03-02)配 1080p + FXAA + 2x 渲染;低配机器用 `120358cf6`(2024-0

gitblog_00929的博客 907

深度技术解析:EASY-HWID-SPOOFER内核级硬件伪装技术实现

EASY-HWID-SPOOFER是一款基于Windows内核模式的硬件信息欺骗工具,能够深度修改硬盘序列号、BIOS信息、网卡MAC地址和显卡参数等关键硬件标识。作为一款开源的内核驱动项目,它为技术研究者提供了深入了解系统底层操作和硬件信息修改的绝佳学习平台,让开发者能够掌握内核编程和硬件抽象层操作的核心技术。 ## 技术背景与项目定位 在系统开发、软件测试和隐私保护领域,硬件标识修改技术具

gitblog_00663的博客 217
上一篇: Working with Snort Rules
下一篇: Usermode api hook removal
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值