对不起,标题太乱了!基本上这就是我想知道的。

这听起来可能有点愚蠢,但是,如果您有反汇编的指令说:

您是否要弄清楚该指令在源代码中涉及什么?

我可能应该提到,我使用Intel的PIN作为发出这些反汇编指令的应用程序,所以我知道这些指令属于哪个函数/例程,我只是想更加精确一点。

感谢您的帮助/提示。

评论

您是否想知道jz或其他一些特定的汇编指令来自何处(一个特定的问题),还是想了解有关如何对汇编代码进行逆向工程以与源代码相匹配的一般方法(一个一般性的问题,可能是对于SO / SE而言太宽泛了)?

好吧,基本上,我有一个应用程序会发出反汇编的指令,现在我必须去查找它在源代码中对应的内容。吐出的反汇编指令通常是跳转指令。

@阿喀琉斯:不可能。没有一对一的映射。多个源代码行可能以一种asm指令结束,或者以另一种方式循环或混合。

@PlasmaHH:是否至少有可能弄清楚该指令来自的基本块?

您无法合理地将机器代码转换回源代码。尤其是优化程序使它变得很古老。另一种可行的方法是,请编译器生成一个程序集列表。

#1 楼

如果您拥有源代码(以及编译它的方法),则不应使用反编译器。编译器已经在原始源代码和汇编指令之间产生映射。这就是调试信息。

查看它的最简单方法是在调试器中启动程序,设置一个断点,当该断点命中时,切换到反汇编视图。这将向您显示说明以及导致它们的源代码行。 (如果编译器启用了优化功能,那么两者之间并不一定会保持良好的对应关系,但是您至少可以看到基本条件。)阶段,并输出一个汇编文件而不是目标代码。根据编译器的不同,您也许还可以获取它,以使用源代码行注释装配。这将产生与在调试器的反汇编视图中看到的类似的信息。

如何完全依赖于IDE的所有操作的详细信息。阅读其文档。

#2 楼

如果使用的是GCC工具链,则可以使用objdump进行反汇编并与源代码混合:

objdump -S executable > disasm.txt


有关更多选项和信息,请参见objdump手册页。 br />
如果您使用其他工具链,请参阅该工具链的文档。

#3 楼

对于该特定指令:

jz 0x8048e1a



这是条件跳转,因此在函数中搜索iffordo / while或三元表达式(?:
如果设置了零标志,它会跳转,但是您需要检查前面的指令才能看到设置该标志的内容。您也许可以将逻辑与上面确定的分支条件之一对齐
它跳转到一个地址-它在哪里?该地址上的代码做什么?您也许可以将其与条件分支的内容进行匹配。
如果不分支该怎么办?您也许可以将其与条件分支(或未采取分支的隐式跳转)对齐。
请注意,允许编译器/优化器反转比较和分支的含义,例如跳转至嵌套的块,然后返回

通常:


如果有源,则编译为汇编器并包括编译器支持的所有源和行号注释

在禁用优化的情况下,这样做一次可能会有所帮助,因此您可以获得相当干净的翻译,然后将其与优化版本进行比较。中间步骤可以帮助您弄清优化器的更改。相反,反汇编程序支持的注释。
在代码中查找独特的点:

函数的输入和退出很容易发现
对脱机(特别是libc或其他)的调用库)函数应清晰显示,并限制优化器至少对函数的参数进行重新排序的能力,以及取决于其结果的逻辑
源行号和指令。如果优化器很忙,则行号可能会疯狂地跳来跳去,但这会让您了解两者之间的关系只需阅读源代码并了解其逻辑和控制流程即可。然后,只需阅读程序集并了解其逻辑和控制流程即可。然后考虑一下它们如何匹配。