我收到Dr.Watson信息的最终用户的崩溃报告,我想用它们来找出崩溃发生的位置(即在哪一行码)。使用'CS:EIP处的字节'来找出崩溃发生的位置
我不能仅仅从崩溃报告中使用EIP,因为我们发布的exe是数字签名的,并且会改变所有的偏移量。然而,崩溃信息也有“CS:EIP字节”,这是从发生崩溃的EIP开始的前16个字节。它看起来像这样:
Bytes at CS:EIP:
85 c4 14 c3 8b ff 55 8b ec 6a 0a 6a 00 ff 75 08
这16个字节恰好在exe中出现一次。我可以使用HEX查看器在EXE中找到它们的偏移量,但为了在调试过程中跳到那里并查看源代码中的哪一行,我需要在加载EXE后知道它们在内存中的偏移量。
程序加载后扫描程序代码段的最佳方式是什么?我可以添加能够找到EXE的基本偏移量的代码,然后循环执行并使用memcmp来查找出现字节模式的位置。
另外,我怎样才能找到EXE的基础偏移量在哪里?
EIP通过签名更改?我很确定它没有。 (Authenticode签名,我假设 - “Exe”和“EIP”建议Win/86) – MSalters 2012-03-02 13:40:38
你是对的。我刚刚检查过它。前者基本保持不变,一开始只有一点变化。无论如何,我只是不能很好地重新创建exe,只能使用EIP。也许我没有完全相同的来源,我不知道。我认为使用CS:EIP中的字节要好得多,因为即使在源代码发生实质性更改时它仍然可以工作,只要崩溃周围的代码保持不变即可。 – sashoalm 2012-03-02 15:00:16