注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

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

2010-01-20 14:25:48|  分类: Windows 高级编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在对一个目标进行攻击时,我们需要的是查点技术,那么当我们进入一个系统后我们一般首先看看的是什么呀,我想这个不用说,那就是查看电脑的相关信息了,如何能够进行信息的快速,准确的收集呢?办法很多,但如何才能够尽是的减轻我们的工作量呢?能解决吧,答案是有的,那就是编程实现自动化的收集,如在大量远程控制类软件中的各种网管软件,我们也要经常实现对各终端的信息的采集,那就是编程调用API函数实现的,今天我们一起来吧,看看如何轻松的实现这样的收集目标,动手打造自己的黑软。为了便于更多的人能够看懂,我大部分的内容是用C语言实现的,同时为了程序的可移植性与可重用性,你可以再把它封闭成一个类,为你编写相关的程序提供了方便,另外,你也可以加入你自己的更多的检测内容。同时我把用到的API函数调用时在MSDN上的出处也作了注明,以便于大家去了解,进行进一步的扩展,从而实现更多程序的功能。
  一、OS版本的检测
  这个其实不用说,要是你进入了别人的电脑的话,一看就知是什么版本了,我们主要需要这个功能的可能还是在大多的远程控制软件中,或后门程序中吧!这里要注意的是,我们需要定义一个结构体变量OSVERSIONINFOEXosvi;它包括了当前运行的操作系统的相关信息,请参考: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主要有三个取值,0、1、2,我们在这里就取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;
   //调用函数把相关信息以COPY到siSysInfo结构中
   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虚拟内存\n",stat.dwTotalVirtual/1024);
   printf("共有%ldKB空闲虚拟内存\n",stat.dwAvailVirtual/1024);
  }
  七、磁盘信息的检测
  对磁盘的信息的检测,我们主要涉及到的是盘符,分区信息,总大小,空闲的大小等信息的搜集,在这里,主要需要的几个函数是:UINT GetDriveType(LPCTSTR lpRootPathName);
  DWORD GetLogicalDrives(void);还有BOOL GetVolumeInformation();等的调用:由于内容太多,请参考相关几个网址:
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getdrivetype.asp
  下这是实现枚举盘符,及检测分区的信息,更多信息检测就靠自己动手了,下边是代码:
  void DriveInfo()
  {
  int i;
  char temp,*p;
  LPCTSTR lpRootPathName;
  LPTSTR buffer;
  DWORD nFileSystemNameSize=MAX_PATH;
  for(i=65;i<91;i++)
  {
  temp='i';
  p=&temp;
  lpRootPathName=(LPCTSTR)(strcat(p,":\\"));
  switch(GetDriveType(lpRootPathName))
  {
  case DRIVE_FIXED:
   GetVolumeInformation(lpRootPathName,NULL,NULL,NULL,NULL,
   NULL,buffer,nFileSystemNameSize);
   printf("硬盘:%s<%s>\n",lpRootPathName,buffer);
  
  break;
  case DRIVE_CDROM:
   printf("CD-ROM:%s\n",lpRootPathName);
  
  break;
  case DRIVE_REMOTE:
   GetVolumeInformation(lpRootPathName,NULL,NULL,NULL,NULL,
   NULL,buffer,nFileSystemNameSize);
   printf("网络硬盘%s<%s>\n",lpRootPathName,buffer);
  
  break;
  //case....省略其它的
   }
  }
  }
  最后总结
  由于检测的信息太多,我在这,无法全部都说清楚,只是给大家作个引导,更多信息的信息还要靠大家去补充吧,如对MAC地址的检测,IP地址的检测等,又涉及网络方面的编程,在此就不多讲了。如果可能的话,你还可以用面向对象的思想,把它再封装成一个GETCOMPUTERINFO的类,这样就可以进行更广泛的移植,重用了。另处,文章可能还有些不足的地方,如程序的容错性方面,讨论请联系:anmeihong@sina.com MY qq.18184412,谢谢指出。
  评论这张
 
阅读(718)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018