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

本文介绍了使用C++获取系统盘符的两种方法。一种是通过检测特定系统文件的存在来确定盘符,例如通过查找svchost.exe或drwtsn32.exe的位置。另一种方法则是利用GetSystemDirectory()函数直接获取系统目录。

今天我又研究了下怎样获取系统的盘符。首先我到互联网上搜索相关的方法,但是令我失望的是,这些方法都有些麻烦,我的水平低,而这些东西是用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. usingnamespacestd;
  4. intmain(intargc,char**argv)
  5. {
  6. charstr[]="c://WINDOWS//system32//svchost.exe";
  7. ifstreamread;
  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. return0;
  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. #defineMAX_BUFFER_SIZE255
  3. intWINAPIWinMain(HINSTANCEhInst,HINSTANCEph,LPSTRcmd,ints)
  4. {
  5. charstr[MAX_BUFFER_SIZE];
  6. charoutstr[]="系统的盘符是";
  7. GetSystemDirectory(str,MAX_BUFFER_SIZE);
  8. outstr[12]=str[0];
  9. MessageBox(NULL,outstr,"系统消息",MB_OK);
  10. return0;
  11. }
  12. 示例2


程序的运行如图所示

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值