我从带有 Dr. Watson 信息的最终用户那里得到崩溃报告,我想用它们来找出崩溃发生的位置(即代码的哪一行)。
我不能只使用崩溃报告中的 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 的基本偏移量在哪里?