获取系统盘符 向黑客迈进!!!

 今天我又研究了下怎样获取系统的盘符。首先我到互联网上搜索相关的方法,但是令我失望的是,这些方法都有些麻烦,我的水平低,而这些东西是用MFC框架实现的,如果使用不同操作系统,那么将无法进行移植,所以效果不好。
 在这里,我有一个方法,这种方法可以利用c++来获取盘符。首先大家想想,如果一个分区装有xp系统,它将有什么样的特征?我想大家应该很容易回答出来:有WINDOWS文件夹啊,有Program Files啊,有Documents and Settings啊,等等。但是这是文件夹啊,我暂时无法使用技术检测文件夹,那么大家可以考虑是否可以检测系统的某些文件?没错!我们可以利用检测是否有某些文件来获取该文件所在系统的盘符。检测文件很难吗?不,很容易很容易,如果你对c++对文件的操作稍有入门的话,这项工作很容易就能达到。

如果你们还是不了解检测某个文件,那么请看这个图


 这个就是我们常常使用的任务管理器。在这个图中我们看到这个程序:svchost.exe。这个程序是常驻在我们的内存中的,电脑失去了这个文件,我们甚至无法进入windows系统。因此我们可以对这个文件进行检测。其它的诸如explorer.exe、winlogon.exe、notepad.exe都可以作为我们检测的文件。懂得了这个道理,那么我们可以运行这样的一个程序:

Code:
  1. #include<iostream>   
  2. #include<fstream>   
  3. using namespace std;   
  4. int main( int argc, char** argv )   
  5. {   
  6.  char str[] = "c://WINDOWS//system32//svchost.exe";   
  7.  ifstream read;   
  8.  while ( 1 )   
  9.  {   
  10.   read.open( str, ios::in );   
  11.   if ( read.is_open() )   
  12.   { cout<<"找到了操作系统的盘为"<<str[0]<<'/n'break; }   
  13.   if ( str[0] > 'z' )   
  14.   { cout<<"找不到系统盘符/n"break; }   
  15.   read.close();   
  16.   str[0]++;   
  17.  }   
  18.  read.close();   
  19.  return 0;   
  20. }   
  21. 示例1   


 这个程序用来循环检查是否在分区中有这个文件。我们将字符串str的第一个字符循环,就可以得到了不同盘符的路径。这里使用了is_open()成员函数。这是因为open()成员函数是void类型的,因此无法检测是否已经打开文件。在这种情况下,只好使用is_open()成员函数了。为什么没有找到系统盘符要到“z”才结束呢?因为系统分配盘符的时候是按照“cdef...xyz”这样的顺序来的,所以到了“z”的时候必须结束才行。程序的截图如下图所示。


 

 

 这样的程序可以解决一些问题,但是有些人的电脑是安装了双系统甚至是三系统的,那么怎样才能分辨出是否是当前操作系统的分区呢?而且有的电脑是安装了windows7系统的,那么如何分辨xp系统和windows7的分区呢。这对于我来说比较难啊,但是我想了很久,找到了区分windows7和windows XP系统的方法。大家有没有听说过华生医生?这个程序在windows XP是有的,你在运行处输入drwtsn32,它就会跳出来。但是在windows7中就没有。因为华生医生它的反响很不好,它简直就是一个垃圾程序。但是凡是windows XP系统都有这个。所以我可以用这个特性来区分windows XP分区还是windows7分区。把上面的程序的这一句“char str[] = "c://WINDOWS//system32//svchost.exe";”改为“char str[] = "c://WINDOWS//system32//drwtsn32.exe";”就行了。但是这个程序在windows7下运行的话,就不行了。所以对于多系统的话,这个方法是在是不管用。

 那么该用什么方法呢?那就必须使用我们的WIN32 API函数了。在这里我向大家介绍一个函数“GetSystemDirectory()”,它的原型是:
#define GetSystemDirectory  GetSystemDirectoryW
#define GetSystemDirectory  GetSystemDirectoryA
WINBASEAPI
  UINT
  WINAPI
  GetSystemDirectoryA(
  __out_ecount_part_opt(uSize, return + 1) LPSTR lpBuffer,
  __in UINT uSize
  );
WINBASEAPI
  UINT
  WINAPI
  GetSystemDirectoryW(
  __out_ecount_part_opt(uSize, return + 1) LPWSTR lpBuffer,
  __in UINT uSize
  );
 我们通过这个函数将会得到系统的目录。如c:/WINDOWS/system32。那么我们只需要把前面的c截取就能得到当前操作系统的盘符了,这个方法相比前面的方法又简单了一步。但是这个是依赖windows.h这个头文件的。所以我想,要是哪个程序能够不依赖WIN32 API 就好了。请看下面的程序:
 

Code:
  1. #include<windows.h>   
  2. #define MAX_BUFFER_SIZE 255   
  3. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE ph, LPSTR cmd, int s)   
  4. {   
  5.  char str[MAX_BUFFER_SIZE];   
  6.  char outstr[] = "系统的盘符是 ";   
  7.  GetSystemDirectory(str, MAX_BUFFER_SIZE);   
  8.  outstr[12] = str[0];   
  9.  MessageBox( NULL, outstr, "系统消息", MB_OK);   
  10.  return 0;   
  11. }   
  12. 示例2  


程序的运行如图所示

接下来我就要介绍怎样对系统进行调用了,其实也是非常的简单,如果大家觉得对自己有帮助的话,就支持我吧。(第三讲完)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值