电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

详谈进程与端口的映射


发布日期:2020/4/17
 

关于进程与端口映射的文章已经有很多了我把我对fport的分析也写出来让大家知道fport是如何工作的fportexe是由foundstone team出品的免费软件可以列出系统中所有开放的端口都是由那些进程打开的而下面所描述的方法是基于fport v如果和你机器上的fport有出入请检查fport版本

首先它检测当前用户是否拥有管理员权限(通过读取当前进程的令牌可知当前用户是否具有管理权限请参考相关历程)如果没有打印一句提示后退出然后设置当前进程的令牌接着用ZwOpenSection函数打开内核对象\Device\PhysicalMemory这个对象用于对系统物理内存的访问ZwOpenSection函数的原型如下:

NTSYSAPI

NTSTSTUS

NTAPI

ZwOpenSection(

Out PHANDLE sectionHandle

IN ACCESS_MASK DesiredAccess

IN POBJECT_ATTRIBUTES ObjectAttributes

}

(见ntddkh)

第一个参数得到函数执行成功后的句柄

第二个参数DesiredAccess为一个常数可以是下列值:

#define SECTION_QUERY x

#define SECTION_MAP_WRITEx

#define SECTION_MAP_READ x

#define SECTION_MAP_EXECUTE x

#define SECTION_EXTEND_SIZE x

#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE)

(见ntddkh)

第三个参数是一个结构包含要打开的对象类型等信息结构定义如下:

typedef struct _OBJECT_ATTRIBUTES {

ULONG Length

HANDLE RootDirectory

PUNICODE_STRING ObjectName

ULONG Attributes

PVOID SecurityDescriptor// Points to type SECURITY_DESCRIPTOR

PVOID SecurityQualityOfService// Points to type SECURITY_QUALITY_OF_SERVICE

} OBJECT_ATTRIBUTES

typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES

(见ntdefh)

对于这个结构的初始化用一个宏完成:

#define InitializeObjectAttributes( p n a r s ) { (p)>Length = sizeof( OBJECT_ATTRIBUTES ) (p)>RootDirectory = r(p)>Attributes = a(p)>ObjectName = n(p)>SecurityDescriptor = s(p)>SecurityQualityOfService = NULL}

(见ntdefh)

那么打开内核对象\Device\PhysicalMemory的语句如下:

WCHAR PhysmemName[] =L\\Device\\PhysicalMemory

void *pMapPhysicalMemory

HANDLEpHandle

bool OpenPhysicalMemory()

{

NTSTATUS status

UNICODE_STRING physmemString

OBJECT_ATTRIBUTES attributes

RtlInitUnicodeString( &physmemString PhysmemName ) //初始化Unicode字符串函数原型见ntddkh

InitializeObjectAttributes( &attributes &physmemString

OBJ_CASE_INSENSITIVE NULL NULL ) //初始化OBJECT_ATTRIBUTES结构

status = ZwOpenSection(pHandle SECTION_MAP_READ &attributes ) //打开内核对象\Device\PhysicalMemory获得句柄

if( !NT_SUCCESS( status ))

return false

pMapPhysicalMemory=MapViewOfFile(pHandleFILE_MAP_READ

xx)

//从内存地址x开始映射x个字节

if( GetLastError()!=)

return false

return true

}

为什么要从x开始映射呢是这样我们知道在Windows NT/系统分为内核模式和用户模式也就是我们所说的Ring和Ring在Windows NT/我们所能够看到的进程都运行在Ring一般情况下系统进程(也就是System进程)的页目录(PDE)所在物理地址地址为x或者说系统中最小的页目录所在的物理地址为x而页目录(PDE)由项组成每项均指向一页表(PTE)每一页表也由个页组成而每页的大小为K*=(x)所以上面从物理地址x开始映射了x个字节(具体描述见WebCrazy的文章<<小议Windows NT/的分页机制>>)

程序打开打开内核对象\Device\PhysicalMemory后继续用函数ZwOpenFile打开内核对象\Device\Tcp和Device\UdpZwOpenFile

函数的原型如下:

NTSYSAPI

NTSTATUS

NTAPI

ZwOpenFile(

OUT PHANDLE FileHandle

IN ACCESS_MASK DesiredAccess

IN POBJECT_ATTRIBUTES ObjectAttributes

OUT PIO_STATUS_BLOCK IoStatusBlock

IN ULONG ShareAccess

IN ULONG OpenOptions

)

(见ntddkh)

第一个参数返回打开对象的句柄

第二个参数DesiredAccess为一个常数可以是下列值:

#define FILE_READ_DATA( x ) // file & pipe

#define FILE_LIST_DIRECTORY ( x ) // directory

#define FILE_WRITE_DATA( x ) // file & pipe

#define FILE_ADD_FILE ( x ) // directory

#define FILE_APPEND_DATA ( x ) // file

#define FILE_ADD_SUBDIRECTORY( x ) // directory

#define FILE_CREATE_PIPE_INSTANCE ( x ) // named pipe

#define FILE_READ_EA( x ) // file & directory

#define FILE_WRITE_EA ( x ) // file & directory

#define FILE_EXECUTE( x ) // file

#define FILE_TRAVERSE ( x ) // directory

#define FILE_DELETE_CHILD( x ) // directory

#define FILE_READ_ATTRIBUTES( x ) // all

#define FILE_WRITE_ATTRIBUTES( x ) // all

#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | xFF)

#define FILE_GENERIC_READ(STANDARD_RIGHTS_READ|FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA |SYNCHRONIZE)

#define FILE_GENERIC_WRITE(STANDARD_RIGHTS_WRITE |FILE_WRITE_DATA |FILE_WRITE_ATTRIBUTES |FILE_WRITE_EA|FILE_APPEND_DATA|SYNCHRONIZE)

#define FILE_GENERIC_EXECUTE(STANDARD_RIGHTS_EXECUTE|FILE_READ_ATTRIBUTES|FILE_EXECUTE |SYNCHRONIZE)

(见ntdefh)

第三个参数是一个结构包含要打开的对象类型等信息结构定义见上面所述

第四个参数返回打开对象的属性是一个结构定义如下:

typedef struct _IO_STATUS_BLOCK {

union {

NTSTATUS Status

PVOID Pointer

}

ULONG_PTR Information

} IO_STATUS_BLOCK *PIO_STATUS_BLOCK

#if defined(_WIN)

typedef struct _IO_STATUS_BLOCK {

NTSTATUS Status

ULONG Information

} IO_STATUS_BLOCK *PIO_STATUS_BLOCK

#endif

(见ntddkh)

第五个参数ShareAccess是一个常数可以是下列值:

#define FILE_SHARE_READx// winnt

#define FILE_SHARE_WRITE x// winnt

#define FILE_SHARE_DELETEx// winnt

(见ntddkh)

第六个参数OpenOptions也是一个常数可以是下列的值:

#define FILE_DIRECTORY_FILEx

#define FILE_WRITE_THROUGH x

#define FILE_SEQUENTIAL_ONLYx

#define FILE_NO_INTERMEDIATE_BUFFERING x

#define FILE_SYNCHRONOUS_IO_ALERTx

#define FILE_SYNCHRONOUS_IO_NONALERTx

#define FILE_NON_DIRECTORY_FILEx

#define FILE_CREATE_TREE_CONNECTION x

#define FILE_COMPLETE_IF_OPLOCKEDx

#define FILE_NO_EA_KNOWLEDGEx

#define FILE_OPEN_FOR_RECOVERYx

#define FILE_RANDOM_ACCESS x

#define FILE_DELETE_ON_CLOSEx

#define FILE_OPEN_BY_FILE_IDx

#define FILE_OPEN_FOR_BACKUP_INTENT x

#define FILE_NO_COMPRESSIONx

#define FILE_RESERVE_OPFILTER x

#define FILE_OPEN_REPARSE_POINTx

#define FILE_OPEN_NO_RECALLx

#define FILE_OPEN_FOR_FREE_SPACE_QUERY x

#define FILE_COPY_STRUCTURED_STORAGEx

#define FILE_STRUCTURED_STORAGEx

#define FILE_VALID_OPTION_FLAGSxffffff

#define FILE_VALID_PIPE_OPTION_FLAGSx

#define FILE_VALID_MAILSLOT_OPTION_FLAGSx

#define FILE_VALID_SET_FLAGSx

(见ntddkh)

那么打开内核对象\Device\Tcp和\Device\Udp的语句如下:

WCHAR physmemNameTcp[]=L\\Device\\TCP

WCHAR physmemNameUdp[]=L\\Device\\UDP

HANDLE pTcpHandle

HANDLE pUdpHandle


上一篇:修改XP注册表实现开机自动拨号

下一篇:用注册表删除多余网卡本地连接