我正在尝试使用.pdb和DIA来确定.exe的静态调用图。不幸的是,在增量链接时,使用dia2dump示例时,函数调用的增量跳床thunk不会显示出来。
如果在启用调试和增量链接的情况下运行和链接dia2dump示例(或简单的here示例),则对wprintf
或printf
的调用不会显示在任何函数的符号转储中。但是,如果您禁用增量链接,则会禁用增量链接。
有没有办法通过DIA获得函数使用的增量跳床?或者我应该破解.obj和.lib文件?
发布于 2011-08-04 15:30:23
您是如何链接到CRT的?静态的还是动态的?
我用VS2010 (使用dynamic/dll CRT)编译了这个示例,并将生成的.exe加载到IDA Pro中。以Fatal
函数(来自示例)为例,它的所有printf
调用都直接编译为该函数(即__imp__printf
)的.exe导入条目的引用。这可能就是为什么你看不到它们出现在你的垃圾堆里的原因。如果我使用静态链接到CRT (在增量打开的情况下),它将调用ILT。如果我关闭了增量,它会直接调用printf
(因为它没有导入它)
对于动态CRT,printf函数的间接(调用导入)和ILT (调用间接;我相信你的'trampoline‘)版本仍然存在于增量.exe中,但没有对它们的代码引用。
该示例正确地转储了自身的ILT(如下所示的printf示例),因此当它们被实际调用时,我认为它应该能够正确地将它们转储到函数符号dump中。然而,我使用DIA的经验有限,所以到目前为止,我或多或少是在说我的话。
0x00011799 (PublicSymbol) @ILT+1940(_printf)
https://stackoverflow.com/questions/6920261
复制相似问题