本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 19605|回复: 79

赞美Vista的netio.sys,放出一套过时的代码 [复制链接]

Rank: 5Rank: 5

发表于 2007-11-20 21:41:09 |显示全部楼层
这个就是传说中的miniport block hook的代码框架~
typedef struct hkmplist
{
    struct hkmplist* next;
    NDIS_MINIPORT_BLOCK* oriblock;
    NDIS_HANDLE                 MiniportAdapterContext;
    FILTER_PACKET_INDICATION_HANDLER PacketIndicateHandler;
    ETH_RCV_INDICATE_HANDLER    EthRxIndicateHandler;
    TR_RCV_INDICATE_HANDLER     TrRxIndicateHandler;
    FDDI_RCV_INDICATE_HANDLER   FddiRxIndicateHandler;
    WAN_RCV_HANDLER             WanRcvHandler;
} Hkmplist, *pHkmplist;

///////////////////////////
NDIS_REQUEST stru_transport_header_offset_query;
REQUEST_COMPLETE_HANDLER ori_query_complete;
NDIS_EVENT eve_transport_header_offset_query;
ULONG stat_transport_header_offset_query;
Hkmplist hkmplisthead;//just an empty head
//////////////////////////





/*
NDIS!_NDIS_M_DRIVER_BLOCK
   +0x000 NextDriver       : Ptr32 _NDIS_M_DRIVER_BLOCK
   +0x004 MiniportQueue    : Ptr32 _NDIS_MINIPORT_BLOCK
   +0x008 NdisDriverInfo   : Ptr32 _NDIS_WRAPPER_HANDLE
   +0x00c AssociatedProtocol : Ptr32 _NDIS_PROTOCOL_BLOCK
   +0x010 DeviceList       : _LIST_ENTRY
   +0x018 PendingDeviceList : Ptr32 _NDIS_PENDING_IM_INSTANCE
   +0x01c UnloadHandler    : Ptr32   
   +0x020 MiniportCharacteristics : _NDIS51_MINIPORT_CHARACTERISTICS
   +0x09c MiniportsRemovedEvent : _KEVENT
   +0x0ac Ref              : _REFERENCE
   +0x0b4 Flags            : Uint2B
   +0x0b8 IMStartRemoveMutex : _KMUTANT
   +0x0d8 DriverVersion    : Uint4B*/

//GAIN from windbg. Compatiable in 2000/xp/2003. Only a head but not whole.
typedef struct struct_NDIS_M_DRIVER_BLOCK
{
    struct struct_NDIS_M_DRIVER_BLOCK * nextdrv;
    NDIS_MINIPORT_BLOCK* miniportblock;
    DWORD NdisDriverInfo;   
    DWORD AssociatedProtocol ;
    DWORD DeviceList[2] ;      
    DWORD PendingDeviceList ;
    DWORD UnloadHandler  ;
    NDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics ;
    //............
} *pNdisdrv;

NTSTATUS xxx_get_NDIS_M_DRIVER_BLOCK(pNdisdrv* pndisdrvlist)
{
                         int ret;
        PDRIVER_OBJECT fakedrvobj;
        UNICODE_STRING fakeregpath;
        UNICODE_STRING fakedrvname;
        pNdisdrv tempim;
        NDIS_HANDLE NdisWrapperHandle;
        NDIS40_MINIPORT_CHARACTERISTICS MiniportCharacteristics;
        int ret;
        ///
        memset(&MiniportCharacteristics,0,sizeof(NDIS40_MINIPORT_CHARACTERISTICS));
        MiniportCharacteristics.MajorNdisVersion=4;
        MiniportCharacteristics.MinorNdisVersion=0;
        NdisInitUnicodeString(&fakedrvname,L"FakeDrv");
        ret=MakeFakeDriverObject(&fakedrvname,&fakedrvobj,0,0,0,fakeunload,0,0);//这个以前贴过了~
        if(ret!=STATUS_SUCCESS)
        {return STATUS_UNSUCCESSFUL;}
        NdisInitUnicodeString(&fakeregpath,L"");
        NdisMInitializeWrapper(&NdisWrapperHandle,fakedrvobj,&fakeregpath,0);
        ret=NdisIMRegisterLayeredMiniport(NdisWrapperHandle,(PNDIS_MINIPORT_CHARACTERISTICS)&MiniportCharacteristics,
            sizeof(NDIS40_MINIPORT_CHARACTERISTICS),(PNDIS_HANDLE)&tempim);
        if(ret!=NDIS_STATUS_SUCCESS)
        {
            NdisTerminateWrapper(NdisWrapperHandle,0);
            return STATUS_UNSUCCESSFUL;
        }
        *pndisdrvlist=tempim->nextdrv;
        NdisIMDeregisterLayeredMiniport((NDIS_HANDLE)tempim);

    }
    return STATUS_SUCCESS;
}

int xxx_init()
{
    int ret;
    pNdisdrv ndisdrvlist;
    pNdisdrv t_ndisdrvlist;
    NDIS_MINIPORT_BLOCK* t_ndismplist;
    WCHAR* netcards;
    WCHAR* t_netcards;
    WCHAR* t_mpname;//[1024];
    int netcards_blen;
    int istarget;
    pHkmplist t_hkmplist;

    ///
    //get_NDIS_M_DRIVER_BLOCK
    ret=xxx_get_NDIS_M_DRIVER_BLOCK(&ndisdrvlist);
    if(ret){return STATUS_UNSUCCESSFUL;}
    t_ndisdrvlist=ndisdrvlist;

    ret=EnumNetcardsMiniport(&netcards);//这个函数的代码在本贴的回复内~
    if(ret){return STATUS_UNSUCCESSFUL;}
    netcards_blen=(char*)memmem(netcards,"\x0\x0\x0\x0",0x10000,4)-(char*)netcards+4;
    if(netcards_blen%2){netcards_blen++;}
    t_netcards=netcards;
    while(t_netcards!=netcards+netcards_blen/2)
    {
        _wcsupr(t_netcards);
        t_netcards+=wcslen(t_netcards)+1;
    }

    hkmplisthead.oriblock=0;
    hkmplisthead.next=0;
    t_hkmplist=&hkmplisthead;
    t_mpname=ExAllocatePool(NonPagedPool,1024*sizeof(WCHAR));

    //walk NDIS_M_DRIVER_BLOCK and sub NDIS_MINIPORT_BLOCK
    while(t_ndisdrvlist)
    {


        //walk NDIS_MINIPORT_BLOCK on this NDIS_M_DRIVER_BLOCK
        t_ndismplist=t_ndisdrvlist->miniportblock;

        while(t_ndismplist)
        {
            memset(t_mpname,0,1024*2);
            wcsncpy(t_mpname,t_ndismplist->MiniportName.Buffer,t_ndismplist->MiniportName.Length);
            if(memmem(netcards,t_mpname,netcards_blen,t_ndismplist->MiniportName.Length))
            {

                istarget=0;
            }
            else if(!_wcsnicmp(t_mpname,L"\\DEVICE\\NDISWANIP",16))
            {
                istarget=1;
            }
            else
            {istarget=0;}

            if(istarget)
            {

                t_hkmplist->next=ExAllocatePool(NonPagedPool,sizeof(Hkmplist));
                uplock();//可以理解为冲突域之类的代码
                t_hkmplist=t_hkmplist->next;
                t_hkmplist->next=0;
                t_hkmplist->oriblock=t_ndismplist;
                t_hkmplist->MiniportAdapterContext=t_ndismplist->MiniportAdapterContext;
                t_hkmplist->PacketIndicateHandler=t_ndismplist->PacketIndicateHandler;
                t_hkmplist->EthRxIndicateHandler=t_ndismplist->EthRxIndicateHandler;
                t_hkmplist->TrRxIndicateHandler=t_ndismplist->TrRxIndicateHandler;
                t_hkmplist->FddiRxIndicateHandler=t_ndismplist->FddiRxIndicateHandler;
                t_hkmplist->WanRcvHandler=t_ndismplist->WanRcvHandler;
                t_ndismplist->PacketIndicateHandler=hkPacketIndicateHandler;
                t_ndismplist->EthRxIndicateHandler=hkEthRxIndicateHandler;
                t_ndismplist->TrRxIndicateHandler=hkTrRxIndicateHandler;
                t_ndismplist->FddiRxIndicateHandler=hkFddiRxIndicateHandler;
                t_ndismplist->WanRcvHandler=hkWanRcvHandler;
                upunlock();//冲突域出来了~
            }

            t_ndismplist=t_ndismplist->NextMiniport;
        }

        t_ndisdrvlist=t_ndisdrvlist->nextdrv;
    }

    ExFreePool(t_mpname);
    ExFreePool(netcards);

    return STATUS_SUCCESS;
}

Rank: 5Rank: 5

发表于 2007-11-20 21:43:48 |显示全部楼层
VOID
hkPacketIndicateHandler(
    IN  NDIS_HANDLE             Miniport,
    IN  PPNDIS_PACKET           PacketArray,
    IN  UINT                    NumberOfPackets
    )
{
//本处省略一些xxx工程使用的关键性代码
    pHkmplist t_hkmplisthead=&hkmplisthead;
    UINT i=0;
    //PNDIS_PACKET copyPacketArray[256]={0};
    PPNDIS_PACKET copyPacketArray;
    UINT copyNumberOfPackets=0;
    PNDIS_PACKET packet;
    char* buf;
    int result;
    int packsize;
    copyPacketArray=ExAllocatePool(NonPagedPool,4*NumberOfPackets);
    while(i<NumberOfPackets)
    {
        packet=*(PacketArray+i);
        //standard PacketIndicateHandler donot view data in packet and we do
        buf=packet2content_mp(Miniport,packet,&packsize);

        if(buf!=0)
        {
            result=check_recvpack(buf,packsize);
            ExFreePool(buf);
        }
        else
        {
            result=1;
        }

        if(result==0)
        {
            //dealing has done in check_recvpack
            //free NDIS_PACKET???
        }
        else
        {
            copyPacketArray[copyNumberOfPackets]=*(PacketArray+i);
            copyNumberOfPackets++;
        }
        i++;
    }

    while(t_hkmplisthead->next!=0)
    {
        t_hkmplisthead=t_hkmplisthead->next;
        if(t_hkmplisthead->oriblock==(NDIS_MINIPORT_BLOCK*)Miniport)
        {
            t_hkmplisthead->PacketIndicateHandler(Miniport,copyPacketArray,copyNumberOfPackets);
            ExFreePool(copyPacketArray);
            return;
        }
    }
    ExFreePool(copyPacketArray);
    return;
}





VOID
hkEthRxIndicateHandler(
    IN  PETH_FILTER             Filter,
    IN  NDIS_HANDLE             MacReceiveContext,
    IN  PCHAR                   Address,
    IN  PVOID                   HeaderBuffer,
    IN  UINT                    HeaderBufferSize,
    IN  PVOID                   LookaheadBuffer,
    IN  UINT                    LookaheadBufferSize,
    IN  UINT                    PacketSize
    )
{
    pHkmplist t_hkmplisthead=&hkmplisthead;
    while(t_hkmplisthead->next!=0)
    {
        t_hkmplisthead=t_hkmplisthead->next;
        if(t_hkmplisthead->MiniportAdapterContext==MacReceiveContext)
        {
            t_hkmplisthead->EthRxIndicateHandler(Filter,MacReceiveContext,Address,HeaderBuffer,
                HeaderBufferSize,LookaheadBuffer,LookaheadBufferSize,PacketSize);
            break;
        }
    }
    return;
}



VOID
hkTrRxIndicateHandler(
    IN  PTR_FILTER              Filter,
    IN  NDIS_HANDLE             MacReceiveContext,
    IN  PVOID                   HeaderBuffer,
    IN  UINT                    HeaderBufferSize,
    IN  PVOID                   LookaheadBuffer,
    IN  UINT                    LookaheadBufferSize,
    IN  UINT                    PacketSize
    )
{
    pHkmplist t_hkmplisthead=&hkmplisthead;
    while(t_hkmplisthead->next!=0)
    {
        t_hkmplisthead=t_hkmplisthead->next;
        if(t_hkmplisthead->MiniportAdapterContext==MacReceiveContext)
        {
            t_hkmplisthead->TrRxIndicateHandler(Filter,MacReceiveContext,HeaderBuffer,
                HeaderBufferSize,LookaheadBuffer,LookaheadBufferSize,PacketSize);
            break;
        }
    }
    return;
}


VOID
hkFddiRxIndicateHandler(
    IN  PFDDI_FILTER            Filter,
    IN  NDIS_HANDLE             MacReceiveContext,
    IN  PCHAR                   Address,
    IN  UINT                    AddressLength,
    IN  PVOID                   HeaderBuffer,
    IN  UINT                    HeaderBufferSize,
    IN  PVOID                   LookaheadBuffer,
    IN  UINT                    LookaheadBufferSize,
    IN  UINT                    PacketSize
    )
{
    pHkmplist t_hkmplisthead=&hkmplisthead;
    while(t_hkmplisthead->next!=0)
    {
        t_hkmplisthead=t_hkmplisthead->next;
        if(t_hkmplisthead->MiniportAdapterContext==MacReceiveContext)
        {
            t_hkmplisthead->FddiRxIndicateHandler(Filter,MacReceiveContext,Address,AddressLength,
                HeaderBuffer,HeaderBufferSize,LookaheadBuffer,LookaheadBufferSize,PacketSize);
            break;
        }
    }
    return;
}


VOID
hkWanRcvHandler(
    OUT PNDIS_STATUS            Status,
    IN NDIS_HANDLE              MiniportAdapterHandle,
    IN NDIS_HANDLE              NdisLinkContext,
    IN PUCHAR                   Packet,
    IN ULONG                    PacketSize
    )
{
    pHkmplist t_hkmplisthead=&hkmplisthead;
    while(t_hkmplisthead->next!=0)
    {
        t_hkmplisthead=t_hkmplisthead->next;
        if(t_hkmplisthead->oriblock==(NDIS_MINIPORT_BLOCK*)MiniportAdapterHandle)
        {
            t_hkmplisthead->WanRcvHandler(Status,
                MiniportAdapterHandle,NdisLinkContext,Packet,PacketSize);
            break;
        }
    }

    return;
}

Rank: 5Rank: 5

发表于 2007-11-20 21:45:00 |显示全部楼层
NTSTATUS EnumNetcardsMiniport(IN  PWSTR *MacDriverName)
{   
    //from ntroot  return a callee allocated multi-string ending by 2 zeros
    //HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards
  NTSTATUS               NtStatus;
  OBJECT_ATTRIBUTES      obj;
  UNICODE_STRING         RegistryPath;
  WCHAR                  NetworkCardsPath[] = L"\\\\REGISTRY\\\\MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\NetworkCards"; //\\\\1
  UNICODE_STRING         ValueName;
  WCHAR                  Value[] = L"ServiceName";
  CHAR                   Buf[512];
//  WCHAR                  BufName[512];
  ULONG                  dwRealLen;
  PKEY_FULL_INFORMATION  pKeyFullInfo;
  PKEY_BASIC_INFORMATION pKeyBasicInfo;
  PKEY_VALUE_PARTIAL_INFORMATION pKeyValuePartialInfo;
  ULONG                  SubKeys;
  ULONG                  i, Len;
  HANDLE                 hKey, hKeyCard;
  ULONG                  MacDriverNameLength = 512;
  PWSTR                  pMacName,  pStr;

  if(!MmIsAddressValid(MacDriverName) )
     return STATUS_INSUFFICIENT_RESOURCES;

  RtlInitUnicodeString(&RegistryPath, NetworkCardsPath);
  InitializeObjectAttributes(&obj, &RegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
  NtStatus = ZwOpenKey(&hKey, KEY_ALL_ACCESS, &obj);
  if(!NT_SUCCESS(NtStatus))
    {
     return NtStatus;
    }

  *MacDriverName = ExAllocatePool(NonPagedPool, MacDriverNameLength);
  if(*MacDriverName == NULL)
    {
     ZwClose(hKey);
     return STATUS_INSUFFICIENT_RESOURCES;
    }



  pMacName = *MacDriverName;
  memset(pMacName, 0, MacDriverNameLength);
  memset(Buf, 0, sizeof(Buf));
  NtStatus = ZwQueryKey(hKey, KeyFullInformation, Buf, sizeof(Buf), &dwRealLen);
  if(NT_SUCCESS(NtStatus))
    {
     pKeyFullInfo = (PKEY_FULL_INFORMATION) Buf;
     SubKeys = pKeyFullInfo->SubKeys;

     for(i=0; i<SubKeys; i++)
        {
         memset(Buf, 0, sizeof(Buf));
         NtStatus = ZwEnumerateKey(hKey, i, KeyBasicInformation, Buf, sizeof(Buf), &dwRealLen);
         if(NT_SUCCESS(NtStatus))
           {
            pKeyBasicInfo = (PKEY_BASIC_INFORMATION) Buf;
            RtlInitUnicodeString(&RegistryPath, pKeyBasicInfo->Name);
            InitializeObjectAttributes(&obj, &RegistryPath, OBJ_CASE_INSENSITIVE, hKey, NULL);
            NtStatus = ZwOpenKey(&hKeyCard, KEY_ALL_ACCESS, &obj);
            if(NT_SUCCESS(NtStatus))
              {
               RtlInitUnicodeString(&ValueName, Value);
               memset(Buf, 0, sizeof(Buf));
               NtStatus = ZwQueryValueKey(hKeyCard, &ValueName, KeyValuePartialInformation, Buf, sizeof(Buf), &dwRealLen);
               if(NT_SUCCESS(NtStatus))
                 {
                  pKeyValuePartialInfo = (PKEY_VALUE_PARTIAL_INFORMATION) Buf;

                  pStr = *MacDriverName;
                  Len = pKeyValuePartialInfo->DataLength + sizeof(L"\\\\Device\\\\") + sizeof(WCHAR);
                  while((MacDriverNameLength-((ULONG)pMacName-(ULONG)*MacDriverName)) < Len)
                    {
                     MacDriverNameLength *= 2;
                     pStr = ExAllocatePool(NonPagedPool, MacDriverNameLength);
                     if(!pStr) break;
                     memset(pStr, 0, MacDriverNameLength);
                     memcpy(pStr, *MacDriverName, MacDriverNameLength/2);
                     ExFreePool(*MacDriverName);
                     pMacName = (PWSTR)((ULONG)pStr + ((ULONG)pMacName-(ULONG)*MacDriverName));
                     *MacDriverName = pStr;
                    }
                  if(!pStr)
                    {
                     NtStatus = STATUS_INSUFFICIENT_RESOURCES;
                     ExFreePool(*MacDriverName);
                     ZwClose(hKeyCard);
                     break;
                    }
                  wcscpy(pMacName, L"\\\\Device\\\\");
                  wcsncat(pMacName, (PWSTR)pKeyValuePartialInfo->Data, pKeyValuePartialInfo->DataLength/sizeof(WCHAR));
                  pMacName = (PWSTR)((ULONG)pMacName + (wcslen(pMacName)+1)*sizeof(WCHAR));
                 }
               ZwClose(hKeyCard);
              }
           }
        }
    }
  ZwClose(hKey);
  return NtStatus;
}

Rank: 5Rank: 5

发表于 2007-11-20 21:46:19 |显示全部楼层
不知道这篇够不够进RCT的~~
主要是想看看传说中的YY群

Rank: 2

发表于 2007-11-20 21:50:55 |显示全部楼层
我来顶你~

Rank: 1

发表于 2007-11-20 23:11:30 |显示全部楼层
要买哦

Rank: 2

发表于 2007-11-20 23:54:48 |显示全部楼层
靠~唉,真TMD,幸亏我保留了一份。。发上来
        

xxxx.rar

4 KB, 下载次数: 1114

Rank: 1

发表于 2007-11-21 00:11:44 |显示全部楼层
花了钱 还要顶 I服了YOU

Rank: 1

发表于 2007-11-21 00:15:05 |显示全部楼层
大家可以直接下载yykingking1的 鉴定完毕

Rank: 5Rank: 5

发表于 2007-11-21 01:02:55 |显示全部楼层
我很淫荡~yykingking更淫荡~

Rank: 2

发表于 2007-11-21 01:45:21 |显示全部楼层
RCT群不好玩

5502629,这个群好玩

Rank: 1

发表于 2007-11-21 04:20:45 |显示全部楼层
都什么时代了,老v 好象18岁就开始玩了,rootkit 都快消失了,还是等着在vista 上玩新技术吧

Rank: 9Rank: 9Rank: 9

发表于 2007-11-21 13:12:40 |显示全部楼层
欢迎小V

YY又多了一个师弟,晚上带小V去喝酒按摩桑拿   
悟空,退下,为师一个人就够了

Rank: 1

发表于 2007-11-21 13:25:26 |显示全部楼层
看看!!!!!!!!!!!!!

Rank: 2

发表于 2007-11-21 13:34:28 |显示全部楼层
买不起,纯顶你个肺.

Rank: 5Rank: 5

发表于 2007-11-21 14:32:19 |显示全部楼层
小V V也进RCT啦!
我放了那么多篇都没得进哦

Rank: 9Rank: 9Rank: 9

发表于 2007-11-21 14:44:46 |显示全部楼层
引用第15楼MJ0011于2007-11-21 11:32发表的  :
小V V也进RCT啦!
我放了那么多篇都没得进哦


欢迎,晚上一起去桑拿,YYKK请客
悟空,退下,为师一个人就够了

Rank: 2

发表于 2007-11-21 15:51:15 |显示全部楼层
应该群主请客的~~~~~

我是小弟,,跟着群主混~~~

Rank: 5Rank: 5

发表于 2007-11-21 16:00:45 |显示全部楼层
yykk可以物理请客,xikug只能远程YY一下~

Rank: 5Rank: 5

发表于 2007-11-21 16:06:02 |显示全部楼层
引用第11楼throb于2007-11-21 01:20发表的  :
都什么时代了,老v 好象18岁就开始玩了,rootkit 都快消失了,还是等着在vista 上玩新技术吧

Vista上的netio.sys真他妈的神奇~
ndis.sys先起来,但是netio.sys居然作为ndis.sys的dll起来了,然后ndis注册第一个NM,再然后就是。。。
tcpip.sys向ndis注册,也向netio.sys注册~
tdx.sys用tdi.sys,同样向netio.sys注册~
afd.sys下层是tdx.sys但是自己向netio.sys注册~
WSK是netio.sys的提供的一个功能,
WSK Client的实现也和NMR在一起,也就是WSK Client其实也是一种Client Module~
fwpkclnt.sys是个dll,但是具体实现是通过netio.sys,也就是说wfp也是netio.sys搞出来的~

伟大的netio.sys~
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-19 05:49 , Processed in 0.035225 second(s), 11 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部