-
-
[求助]隐藏分区后无法恢复 [已解决]
-
发表于:
2007-10-4 22:47
4298
-
刚在网上看到一段迅速隐藏分区的代码,编译调试了一下,发现效果不错.
尽兴中忘记在虚拟机上试验,于是在任务管理器中强行结束掉CMD.EXE后,导致RestoreDevice 函数没有执行,从而使除了C盘以外的所有盘都被隐藏了!
具体是调用了此函数导致隐藏的
DefineDosDevice
查询盘符的函数是
QueryDosDevice
偶现在也不不知道如何破除隐藏了, 具体代码如下:
#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct SaveContext
{
string strNtPath;
string strDosDevice;
};
typedef vector<SaveContext> svrVector;
void RestoreDevice(SaveContext &Context);
int main(void)
{
//读磁盘配置并排除C盘
DWORD dwDisks=GetLogicalDrives()&0xfffffffb;
svrVector NtDevices;
TCHAR chDosDevice[8]={0};
*(WORD*)chDosDevice=':A';
TCHAR chNtPath[MAX_PATH]={0};
for(int Mask=1;Mask;Mask<<=1,chDosDevice[0]++)
{
if(dwDisks&Mask)
{
QueryDosDevice(chDosDevice,chNtPath,MAX_PATH);
SaveContext Context;
Context.strDosDevice=chDosDevice;
Context.strNtPath=chNtPath;
//先保存符号名和设备之间的关系
NtDevices.push_back(Context);
cout<<Context.strDosDevice<<"<--->"<<Context.strNtPath<<endl;
//除了C:以外其它的盘符正一个一个的不见了
DefineDosDevice(DDD_REMOVE_DEFINITION,Context.strDosDevice.c_str(),NULL);
}
}
//现在打开"我的电脑"看看
system("pause");
//现在隐藏的盘符又出现了,呵呵
for_each(NtDevices.begin(),NtDevices.end(),RestoreDevice);
return 0;
}
void RestoreDevice(SaveContext &Context)
{
DefineDosDevice(DDD_RAW_TARGET_PATH,Context.strDosDevice.c_str(),Context.strNtPath.c_str());
}
,注:重启后又恢复了. 如果不重启电脑,可不可以想办法恢复呢?
大叔们丢个code 偶借鉴一下啊~
[课程]Linux pwn 探索篇!