我正在尝试使用 .pdb 和 DIA SDK 确定 .exe 的静态调用图。不幸的是,当增量链接时,函数调用的增量蹦床 thunk 在使用 dia2dump 示例时不会显示。
如果您在打开调试和增量链接的情况下运行并链接dia2dump示例(或此处的简单示例),则调用wprintf
或printf
不会出现在任何函数的符号转储中。但是,如果您禁用增量链接,它们会这样做。
有没有办法通过 DIA 获得函数使用的增量蹦床?还是我应该破解 .obj 和 .lib 文件?
你是如何链接到 CRT 的?静态还是动态?
我在 VS2010 中编译了示例(使用动态/dll CRT)并将生成的 .exe 加载到 IDA Pro 中。以Fatal
函数(来自示例)为例,它的所有printf
调用都直接编译为该函数的 .exe 导入条目的引用(即__imp__printf
)。所以这可能就是你没有看到它们出现在你的转储中的原因。如果我使用静态链接到 CRT(增量打开),它会调用 ILT。如果我关闭增量,它会printf
直接调用(因为它没有导入它)
使用动态 CRT,间接(调用导入)和 ILT(调用间接;我相信您的“蹦床”)版本的 printf 函数等仍然存在于增量 .exe 中,但没有对它们的代码引用。
该示例正确地转储了自身的 ILT(下面的 printf 示例),因此我认为它能够在实际调用它们时正确地将它们转储到函数符号转储中。但是,我对 DIA 的经验有限,所以现在我或多或少是在说我的屁股。
0x00011799 (PublicSymbol) @ILT+1940(_printf)