利用未公开函数枚举进程及其关联的端口系列之(-)

    技术2022-05-11  140

    通过前述可知,枚举出系统中所有进程以及它们所打开的端口,这完成木马病毒的检测与清除工作的关键任务。要做到这一点方法有多种,但最简单的就是调用NTDLL.dll中的几个未公开API,如NtQuerySystemInfomation,NtQueryInfomationProcess。其中NtQuerySystemInfomation函数提供了一个简单的途径以获得系统中所有的HANDLE(句柄),只要找到系统中的SOCKET句柄,就可以通过这个句柄得到该进程所使用的端口号,这样就完成了进程与端口之间的关联,我们正是通过这种关联来判断一个进程是否为木马进程。NtQuerySystemInfomation函数的原型如下:  DWORD NtQuerySystemInformation( DWORD dwRecordType, PDWORD pdwHandleList, DWORD dwNumBytes, PDWORD pdwNumBytesRet );  其中,第一个参数dwRecordType用于指定所要查询的系统信息类型,为了查询系统HANDLE列表,此项参数要设置为16,此数值是来自网上资料,由于这个函数是未公开函数暂时无法得到更详细的资料,第二个参数是一个指针,用来返回系统句柄列表,在调用函数之前,必须为这个指针分配足够的内存空间,否则函数调用会出错;第三个参数是指定为HandleList预先所分配的内存空间大小,单位是byte;第四个参数是函数调用后返回的HandleList的大小,如果函数调用成功,返回值将是0,否则可以使用GetLastError()获得详细的错误代码。  一旦NtQuerySystemInformation函数调用成功,系统中所有的句柄将被存放在pdwHandleList所指向内存空间中,其中,pdwHandleList所指向的第一个32位数,是这个缓冲区所包含的句柄数量,之后是顺序排列的句柄指针pHandleInfo,指向的是HANDLEINFO结构。HANDLEINFO结构定义如下:  typedef struct _HandleInfo  {    USHORT dwPid;    USHORT CreatorBackTraceIndex;    BYTE ObjType;    BYTE HandleAttributes;    USHORT HndlOffset;    DWORD dwKeObject;    ULONG GrantedAccess;  }HANDLEINFO, *PHANDLEINFO;  这个结构定义表明,句柄信息中包括了句柄所属进程的PID,只要获取句柄信息可以关联进程和端口了。不过,在NT系统中包含有各种各样的句柄:进程句柄、令牌句柄、文件句柄、窗口句柄……怎样才能判断出一个句柄究竟是不是SOCKET句柄呢?这就要通过HANDLEINFO结构中的ObjType属性了,根据已有资料分析,SOCKET句柄的类型值为0x1A,所以,只要将所有类型为0x1A的句柄取出,进行GetSockName操作就可以得到当前的进程/端口对应列表。不过此时我们得到的句柄都是属于其他的进程,根据在NT系统中进程保护的原则,一个进程不能够直接得到其他进程的各种信息,特别是句柄,不同进程中的同一句柄(句柄的数值相同)可能有完全不样同的意义。因此,得到SOCKET句柄后还必须进行一次转换,将其他进程的句柄转换为本进程的句柄,这个转换工作只要简单地调用DuplicateHandle函数就可以完成了。DuplicateHandle函数的调用方法略。  这样才可以通过getsockname、getsockopt等函数来获得SOCKET的各种属性了。示例代码段如下:  ......  sockaddr_in name = {0};  name.sin_family = AF_INET;  int namelen = sizeof(sockaddr_in);  SOCKET s = (SOCKET)hMyHandle;  char szSockType[6][6] = { "NUL", "TCP", "UDP", "RAW", "RDM","SEQ" };  iRet = getsockname( s, (sockaddr*)&name, &namelen );  if ( iRet != SOCKET_ERROR )  {    int sockType = 0;    int optlen = 4;    iRet = getsockopt(  s,SOL_SOCKET, SO_TYPE, (char*)&sockType, &optlen );    printf("PID=M PORT=] %s ",pHandleInfo->dwPid,    ntohs( name.sin_port ), szSockType[sockType] );  }  /*******************************************************************************************/

    NtQuerySystemInfomation第一个参数的详细定义

                                          

    [补充]NtQuerySystemInfomation第一个参数的详细定义 ;)

    NtQuerySystemInfomation是很强大的一个函数,它能够查询的所有信息都包含在下面的这个列表中,对于每个详细的信息都有一个相应的数据结构对应,详细的细节可以参考书籍《Windows NT/2000 Native API Reference》by Gary Nebbett

    :)希望对shotgun这样的kernel hacker们有所帮助下面注释语句的格式说明://常数数值  该类型数据是否可读  该类型数据是否可写typedef enum _SYSTEM_INFORMATION_CLASS {SystemBasicInformation,                // 0 Y NSystemProcessorInformation,            // 1 Y NSystemPerformanceInformation,            // 2 Y NSystemTimeOfDayInformation,            // 3 Y NSystemNotImplemented1,                // 4 Y NSystemProcessesAndThreadsInformation,        // 5 Y NSystemCallCounts,                // 6 Y NSystemConfigurationInformation,            // 7 Y NSystemProcessorTimes,                // 8 Y NSystemGlobalFlag,                // 9 Y YSystemNotImplemented2,                // 10 Y NSystemModuleInformation,            // 11 Y NSystemLockInformation,                // 12 Y NSystemNotImplemented3,                // 13 Y NSystemNotImplemented4,                // 14 Y NSystemNotImplemented5,                // 15 Y N[b]SystemHandleInformation,            // 16 Y N[/b]SystemObjectInformation,            // 17 Y NSystemPagefileInformation,            // 18 Y NSystemInstructionEmulationCounts,        // 19 Y NSystemInvalidInfoClass1,            // 20SystemCacheInformation,                // 21 Y YSystemPoolTagInformation,            // 22 Y NSystemProcessorStatistics,            // 23 Y NSystemDpcInformation,                // 24 Y YSystemNotImplemented6,                // 25 Y NSystemLoadImage,                // 26 N YSystemUnloadImage,                // 27 N YSystemTimeAdjustment,                // 28 Y YSystemNotImplemented7,                // 29 Y NSystemNotImplemented8,                // 30 Y NSystemNotImplemented9,                // 31 Y NSystemCrashDumpInformation,            // 32 Y NSystemExceptionInformation,            // 33 Y NSystemCrashDumpStateInformation,        // 34 Y Y/NSystemKernelDebuggerInformation,        // 35 Y NSystemContextSwitchInformation,            // 36 Y NSystemRegistryQuotaInformation,            // 37 Y YSystemLoadAndCallImage,                // 38 N YSystemPrioritySeparation,            // 39 N YSystemNotImplemented10,                // 40 Y NSystemNotImplemented11,                // 41 Y NSystemInvalidInfoClass2,            // 42SystemInvalidInfoClass3,            // 43SystemTimeZoneInformation,            // 44 Y NSystemLookasideInformation,            // 45 Y NSystemSetTimeSlipEvent,                // 46 N YSystemCreateSession,                // 47 N YSystemDeleteSession,                // 48 N YSystemInvalidInfoClass4,            // 49SystemRangeStartInformation,            // 50 Y NSystemVerifierInformation,            // 51 Y YSystemAddVerifier,                // 52 N YSystemSessionProcessesInformation        // 53 Y N} SYSTEM_INFORMATION_CLASS;


    最新回复(0)