动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   安全 → 阅读文章

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

作者来源: 
阅读 2093 人次 , 2006-5-18 15:47:00 

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

下面是我的代码:

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;
}
  
 本文Tags日志  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:技术沙龙:用开源软件改进开发过程
· 下一篇:常用手持设备的use-agent头信息
· 中国信息安全专家:同美打黑客战等于自杀
· DFCG破解入门第十课
· 用ISA+瑞星构筑防范黑客和病毒攻击的铜墙铁壁
· 单词抓取器 V1.71
· 浅谈 IP和 MAC捆绑的破解之道


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077