6

mspdbsrv.exe 是 Microsoft 内部用于更新 PDB 文件的实用程序。编译器通过 RPC 向 mspdbsrv 发送符号更新,然后 mspdbsrv 依次更新 PDB 文件。

我试图了解这些更新的样子。不幸的是,微软没有发布 IDL,所以我不知道 RPC 函数原型,但是将这些更新视为原始数据已经足够有趣了。

这是我的想法:

在这种情况下,mspdbsrv.exe 默认端点是\RPC Control\mspdb_10.00.30319.01_rtl_32_00000000000733A0. 但是 mspdbsrv 有一个命令行参数-endpoint,将其端点设置为不同的端点。然而,编译器可能总是连接到默认端点。
我想我可以创建一种在 mspdbsrv 默认端点上侦听的“代理服务器”,使用不同的端点运行 mspdbsrv.exe,并在记录时透明地通过 RPC 到 mspdbsrv。编译器不会知道它已连接到代理,因为代理公开了 mspdbsrv 端点。

这有意义吗?在没有 IDL 的情况下,我如何编写这样的代理 RPC 服务器?
如果有人知道有关这些 PDB 更新的一些详细信息,也许有一条捷径?

更新

我发现00000000000733A0mspdbsrv 端口名称的后缀是什么...( mspdb_10.00.30319.01_rtl_32_00000000000733A0)。
这是当前用户的安全访问令牌!以下是如何获取它的片段:

HANDLE hToken;    
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) != 0)
{

    TOKEN_STATISTICS tsStats;
    DWORD dwOutSize;

    if (GetTokenInformation(hToken, TokenStatistics, &tsStats, sizeof(tsStats), &dwOutSize))
    {
        printf(TEXT("%08x%08x\n"), (UINT)tsStats.AuthenticationId.HighPart, (UINT)tsStats.AuthenticationId.LowPart);
    }
}
4

0 回答 0