【问题标题】:A tool for understanding assembler programs?理解汇编程序的工具?
【发布时间】:2011-01-20 15:33:10
【问题描述】:

我有一个汇编程序,我试图理解它。 (我实际上是在分析它)。 是否有一个 Linux 工具/编辑器可以对我进行一些结构化? 显示循环/跳转的位置就足够了。 对指令的作用进行方便的描述会很棒。

【问题讨论】:

  • 您有汇编源代码,或者您是否在可执行文件上使用反汇编程序? ——你知道组装吗? x86(32 位)处理器?
  • 我有 oprofile 转储的源代码。所以我猜它类似于objdump格式。我也有源代码,但是经过大量优化,oprofile(objdump?)找不到 ASM 和 C++ 之间的对应关系
  • 所以你有一个用 C++ 编写的可执行文件的反汇编。这与理解最初用汇编编写的程序有点不同,因为您想在特定的汇编指令和原始 C++ 源代码之间建立联系。您可以做的第一件事是确保 C++ 编译器运行启用调试,因此额外的调试信息留在可执行文件中以供反汇编程序参考。反汇编程序仅将过程反转回组装。还有反编译的过程。它往往更难,结果也不是很好。

标签: linux assembly profiling reverse-engineering


【解决方案1】:

如果您正在寻找类似于 OllyDbg 但适用于 linux 的东西,您可以尝试 edb

【讨论】:

    【解决方案2】:

    由于您确实在逆向分析高级语言,因此您可以做一些事情来帮助这个过程。首先在 C++ 编译器和链接器中启用并保留调试信息(不要让它strip 可执行文件)。在 g++ 中,-g 命令行标志执行此操作。其次,许多 C++ 编译器具有输出直接汇编源代码的标志,而不是发出目标代码(由链接器使用)。在 g++ 中,-S 标志启用此功能。

    编译器的程序集可以与 oprofile 反汇编程序的程序集进行比较。

    我对反编译器不是很熟悉,但其中两个,包括来自 another SO post 的一个是 C 的 BoomerangREC,而不是 C++。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      您可以使用Asm plugin for Eclipse

      但是,IDE 通常不用于汇编编程。我不确定通过轻松找出跳跃和循环的位置会获得多少理解 - 无论如何你必须通读所有内容。

      【讨论】:

        【解决方案4】:

        看看这个...

        http://sourceforge.net/projects/asmplugin/

        这是一个 Eclipse 的插件...

        【讨论】:

          【解决方案5】:

          并非如此,但您始终可以查看指令参考,使用语法高亮(vim asm 语法),如果运行它没有限制,您也可以通过调试器单步调试它。对于已经组装好的代码,这可能很有趣:LIDA

          【讨论】:

            【解决方案6】:

            仅适用于 PowerPC CPU Demono 项目旨在恢复二进制代码的算法(目前,仅适用于 PPC) - 它不是完全反编译器。项目正在建设中,但一些例子是作品。 站点具有在线服务,用于从汇编程序生成类似 C 的功能描述: online service for decompile PPC asm

            要使用它,您应该执行以下步骤:

            1. 将二进制代码(用于 PowerPC)反汇编为汇编器文本(由 IDA)
            2. 将汇编器的文本插入字段“Ассемблер”
            3. 按下“Восстановить”按钮
            4. 寻找形成“Восстановленный алгоритм”

            例如,如果你的汇编器有文本:

            funct(){
              0x00000002:  cmpw r3, r4    
              0x00000003:  ble label_1    
              0x00000004:  mr r6, r3      
              0x00000005:  b label_2      
              0x00000006:  label_1:       
              0x00000007:  mr r6, r4      
              0x00000008:  label_2:       
              0x00000009:  cmpw r6, r5    
              0x0000000A:  ble label_3    
              0x0000000B:  mr r7, r6      
              0x0000000C:  b label_4      
              0x0000000D:  label_3:       
              0x0000000E:  mr r7, r5      
              0x0000000F:  label_4:       
              0x00000010:  mr r3, r7      
              0x00000011:  blr            
            }
            

            在线服务恢复如下函数算法说明:

            funct(arg_w_0, arg_w_1, arg_w_2){
              if(arg_w_0>arg_w_1?true?false){
                arg_w_0=arg_w_1;
              }else{
              }
              if(arg_w_0>arg_w_2?true?false){
                arg_w_0=arg_w_2;
              }else{
              }
              return (arg_w_0);
            }
            

            因此,funct() 导出三个数的最大值 - max3()。

            可能,这项服务可以帮助您了解汇编指令的工作原理..

            【讨论】:

              猜你喜欢
              • 2018-01-04
              • 1970-01-01
              • 2016-06-01
              • 1970-01-01
              • 2015-08-26
              • 2011-09-04
              • 2015-08-24
              • 2020-11-04
              • 2011-01-24
              相关资源
              最近更新 更多