现在的位置: 首页 > 综合 > 正文

Windows系列操作系统信息一网打尽

2012年09月10日 ⁄ 综合 ⁄ 共 6345字 ⁄ 字号 评论关闭

Windows系列操作系统信息一网打尽

 

 

四川师范大学信息安全研究中心      安美洪

 

 

 

在对一个目标进行攻击时,我们需要的是查点技术,那么当我们进入一个系统后我们一般首先看看的是什么呀,我想这个不用说,那就是查看电脑的相关信息了,如何能够进行信息的快速,准确的收集呢?办法很多,但如何才能够尽是的减轻我们的工作量呢?能解决吧,答案是有的,那就是编程实现自动化的收集,如在大量远程控制类软件中的各种网管软件,我们也要经常实现对各终端的信息的采集,那就是编程调用API函数实现的,今天我们一起来吧,看看如何轻松的实现这样的收集目标,动手打造自己的黑软。为了便于更多的人能够看懂,我大部分的内容是用C语言实现的,同时为了程序的可移植性与可重用性,你可以再把它封闭成一个类,为你编写相关的程序提供了方便,另外,你也可以加入你自己的更多的检测内容。同时我把用到的API函数调用时在MSDN上的出处也作了注明,以便于大家去了解,进行进一步的扩展,从而实现更多程序的功能。

 

            一、OS版本的检测

这个其实不用说,要是你进入了别人的电脑的话,一看就知是什么版本了,我们主要需要这个功能的可能还是在大多的远程控制软件中,或后门程序中吧!这里要注意的是,我们需要定义一个结构体变量OSVERSIONINFOEX osvi;它包括了当前运行的操作系统的相关信息,请参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfoex_str.asp它的定义如下:

typedef struct _OSVERSIONINFOEX {

 DWORD dwOSVersionInfoSize;

 DWORD dwMajorVersion;

 DWORD dwMinorVersion;

 DWORD dwBuildNumber; 

 DWORD dwPlatformId; 

 TCHAR szCSDVersion[128];

 WORD wServicePackMajor;

 WORD wServicePackMinor;

 WORD wSuiteMask;

 BYTE wProductType;

 BYTE wReserved;

}OSVERSIONINFOEX,

 *POSVERSIONINFOEX,

 *LPOSVERSIONINFOEX;

然后用这个函数进行调用BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInfo);在调用时GetVersionEx要先进行对它的初始化,也就是:

osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);

在这里我也是对现在常用的几个系统进行检测,要检测更多版本信息的话,请参考相关的资料;下边是检测的代码:

 

 

void OsInfo()

{

   OSVERSIONINFOEX osvi;

   BOOL bOsVersionInfoEx;

 

   // Try calling GetVersionEx using the OSVERSIONINFOEX structure.

   // If that fails, try using the OSVERSIONINFO structure.

 

   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

 //下边是错误检查

   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )

   { 

   //初始化osvi.dwOSVersionInfoSize

      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);

      if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )

      printf("获取系统版本失败:");

   }

   printf ("系统版本:");

 

   switch (osvi.dwPlatformId)

   {

      // Test for the Windows NT product family.

      case VER_PLATFORM_WIN32_NT:

 

         // 开始匹配系统版本.

         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )

            printf ("Microsoft Windows Server 2003/n ");

 

         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )

            printf ("Microsoft Windows XP/n ");

 

         if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )

            printf ("Microsoft Windows 2000/n ");

 

         if ( osvi.dwMajorVersion <= 4 )

            printf("Microsoft Windows NT/n ");

         else

            printf("其它WIN系列/n ");

         break;

case !VER_PLATFORM_WIN32_NT://其它的未知版本

                printf("未知的版本/n ");

   }

 

}

 

二、计算机名的检测

主机名是什么,我们又如何调用相关的函数得到这些信息呢?还是来查查MSDN吧!请参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getversionex.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getusername.asp

我们看看它所需的函数是

BOOL GetComputerName

(

  LPTSTR lpBuffer,

  LPDWORD lpnSize

);

其中,lpBuffer是指返回到的缓冲区,它的大小至少是MAX_COMPUTERNAME_LENGTH + 1否则会发生错误;如果失败的话它的返回值是0;同时为了减少文章篇幅,顺便把当前用户名的检测也给出,程序内容几乎一样。下边就是实现的代码:

void GetComputerName()

{

  LPTSTR Name;

  DWORD Size=1024;

  TCHAR Buffer[1024];

  Name=Buffer;

  if(GetComputerName(Name,&Size)!=0)

//如果是检测用户名也就改为:

//GetUserName(Name,&Size)

//下同,相应的修改就可以了

          printf("主机名字:%s/n",Name);

  else

         printf("主机名字:获取失败");

 

}

 

              三、系统文件夹的检测

 由于不同的版本,系统所在的文件名可能不一样,另外就是路径也可能不是在C盘下,我们如何编程快速的找出它所在的路径呢?别担心,用这个就可实现了

UINT GetSystemDirectory

(

  LPTSTR lpBuffer,

  UINT uSize

);

 

其中的参数我就不在多说了,查一下MSDN吧,说得清清楚楚了,lpBuffer是指缓冲区的地址,而uSize是指的是缓冲区的大小,要是这个缓冲太小的话,会产生错误返回,所以它的值要求设定为MAX_PATH。更多的信息请参考下边地址:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemdirectory.asp下面就是实现这个功能的代码:

void GetSystemDirectory()

{

LPTSTR Name;

DWORD Size=MAX_PATH+1;

TCHAR Buffer[MAX_PATH];

Name=Buffer;

if(GetSystemDirectory(Name,Size)!=0)

   printf("系统目录:%s/n",Name);

else

   printf("系统目录:获取失败/n");

}

 

四、键盘信息的检测

 在这里,主要是能够检测的是什么商家生产,以及它有多少个键,但我们在这里也仅是简单的介绍,需要调用的函数是:int GetKeyboardType( int nTypeFlag)nTypeFlag主要有三个取值,012,我们在这里就取0作为参数说明,请参考:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getkeyboardtype.asp下边是代码:

void GetKeyboardTypeProducer()

{

int type;

type=GetKeyboardType(0);//0表示对商家的检测

 

if(type==0)

   printf("键盘信息:获取失败/n");

switch(type)

{

       case 1:

         printf("键盘信息:IBM PC/XT or compatible (83-key) keyboard/n");

               break;

       case 2:

         printf("键盘信息:Olivetti-ICO(102-key) keyboard/n");

               break;

       case 3:

         printf("键盘信息:IBM PC/AT (84-key) or similar keyboard/n");

               break;

    //...省略一些

       case 7:

               printf("键盘信息:Japanese keyboard/n");

               break;

       default:

         printf("键盘信息:未知/n");

               break;

}

}

 

             五、CPU信息的检测

 CPU是计算机最重要的部分,我们收集信息时,可能很想知道别人到底是几个芯吧!还有就是它是什么商家生成的什么型号,在这里主要是先定义一个SYSTEM_INFO siSysInfo的变量,来看看这个结构体吧:

typedef struct _SYSTEM_INFO

{ 

union

{ 

DWORD dwOemId;   

struct

{     

WORD wProcessorArchitecture; 

WORD wReserved; 

};

};

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress; 

DWORD_PTR dwActiveProcessorMask; 

DWORD dwNumberOfProcessors; 

DWORD dwProcessorType; 

DWORD dwAllocationGranularity; 

WORD wProcessorLevel;

WORD wProcessorRevision;

} SYSTEM_INFO;

然后调用函数void GetSystemInfo( LPSYSTEM_INFO lpSystemInfo);当然我们这里就只选最重要的几个成员变量给大家编程实现了,如CPU的商家,CPU的个数等,相关的信息就靠各人的需要自己扩展吧!请参考:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/system_info_str.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getkeyboardtype.asp下边是代码:

 

void GetCpuInfo()

{

  SYSTEM_INFO siSysInfo;

 

   //调用函数把相关信息以COPYsiSysInfo结构中

 

   GetSystemInfo(&siSysInfo);

 

   // 列出处理器的信息

   printf("设备生产商: %u/n", siSysInfo.dwOemId);

   printf("处理器数量: %u/n", siSysInfo.dwNumberOfProcessors);

   printf("页数的大小: %u/n", siSysInfo.dwPageSize);

   printf("处理器类型: %u/n", siSysInfo.dwProcessorType);

 

}

 

             六、内存信息的检测

 内存也是计算机的一个重要部件,我们可能通过调用函数检测出它的物理大小,虚存的大小等,在这里主要涉及的函数是:

void GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);其中,lpBuffer是一个指向结构体LPMEMORYSTATUS的一个指针,这个结构体如下:

typedef struct _MEMORYSTATUS

{ 

DWORD dwLength;

DWORD dwMemoryLoad; 

SIZE_T dwTotalPhys;

SIZE_T dwAvailPhys;

SIZE_T dwTotalPageFile;

SIZE_T dwAvailPageFile;

SIZE_T dwTotalVirtual;

SIZE_T dwAvailVirtual;

}MEMORYSTATUS,

*LPMEMORYSTATUS;

但这个函数没有相应的返回值,调用它我们就可得到内存的相关信息了。请参考:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/memorystatus_str.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/globalmemorystatus.asp下边是实现的代码:

void GetMem()

{

 MEMORYSTATUS stat;

  memset(&stat,sizeof(MEMORYSTATUS),0);

  stat.dwLength=sizeof(MEMORYSTATUS);

  GlobalMemoryStatus (&stat);

  printf("共有%ld%% 在使用/n",stat.dwMemoryLoad);

  printf("共有%ldKB 物理内存/n",stat.dwTotalPhys/1024);

  printf("共有%ldKB 空闲物理内存/n",stat.dwAvailPhys/1024);

  printf("共有%ldKB-->

作者:

抱歉!评论已关闭.