研究mspdbsrv的RPC调用

时间:2012-06-03 16:14:47

标签: visual-studio-2010 visual-c++ rpc pdb-files pdb

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更新的一些细节,也许有一条捷径?

更新

我发现mspdbsrv端口名称的00000000000733A0后缀是什么......(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);
    }
}

0 个答案:

没有答案