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