【问题标题】:How can I view the C code after compilation in binary code?编译成二进制代码后如何查看C代码?
【发布时间】:2011-10-17 20:03:52
【问题描述】:

编译器就是把这段代码翻译成机器码

二进制代码编译后如何查看原始C代码?

【问题讨论】:

  • 我不明白你的问题。 “C”不是动词。
  • 你在问我认为是反编译。对于一个好的 C 反编译器see
  • 查看代码最简单的方法是查看您发送给编译器的源文件。
  • 这道题的语法很烂,应该说清楚。

标签: c


【解决方案1】:

这通常被描述为“把汉堡变回奶牛”。

反编译器将生成与原始代码功能等效的 C 源代码,但它没有任何原始符号名称,并且结构可能不同。它甚至可能不是很“可读”。

您无法从已编译的程序中恢复 原始 源代码。

【讨论】:

    【解决方案2】:

    您无法从编译后的二进制文件中取回原始 C 源代码 - C 中有多种方法可以产生相同的最终结果,因此没有唯一的源代码。

    进程调用decompiling

    如果我误解了您的问题,并且您想知道如何查看编译器从您的 C 代码生成的汇编程序,那么这取决于特定的编译器,但他们都可以做到。见How can I see the assembly code that is generated by a gcc (any flavor) compiler for a C/C++ program?

    【讨论】:

      【解决方案3】:

      使用 ollydbg 并在 disassebly 中找到您的代码 :)

      例如编译后的代码

      int main()
      {
        system("PAUSE");
        return 0;
      }
      

      很难在 disassebly 的所有行中找到,但如果你填充它,你会发现它更容易,例如...编译这段代码

      int main()
      {
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
      
        //mycode
        system("PAUSE");
      
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        return 0;
      }
      

      现在在反汇编中我将能够看到“nops”的行,在它们之间是我的二进制形式的代码

      CPU Disasm
      Address   Hex dump          Command                                  Comments
      004013F8  |.  90            NOP
      004013F9  |.  90            NOP
      004013FA  |.  90            NOP
      004013FB  |.  90            NOP
      004013FC  |.  90            NOP
      004013FD  |.  90            NOP
      004013FE  |.  90            NOP
      004013FF  |.  90            NOP
      00401400  |.  90            NOP
      00401401  |.  90            NOP
      00401402  |.  90            NOP
      00401403  |.  90            NOP
      00401404  |.  90            NOP
      00401405  |.  90            NOP
      00401406  |.  90            NOP
      00401407  |.  90            NOP
      00401408  |.  90            NOP
      00401409  |.  90            NOP
      0040140A  |.  90            NOP
      0040140B  |.  90            NOP
      0040140C  |.  C70424 004044 MOV DWORD PTR SS:[LOCAL.6],OFFSET 004440
      00401413  |.  E8 D8500100   CALL <JMP.&msvcrt.system>                
      00401418  |.  90            NOP
      00401419  |.  90            NOP
      0040141A  |.  90            NOP
      0040141B  |.  90            NOP
      0040141C  |.  90            NOP
      0040141D  |.  90            NOP
      0040141E  |.  90            NOP
      0040141F  |.  90            NOP
      00401420  |.  90            NOP
      00401421  |.  90            NOP
      00401422  |.  90            NOP
      00401423  |.  90            NOP
      00401424  |.  90            NOP
      00401425  |.  90            NOP
      00401426  |.  90            NOP
      00401427  |.  90            NOP
      00401428  |.  90            NOP
      00401429  |.  90            NOP
      0040142A  |.  90            NOP
      0040142B  |.  90            NOP
      

      这样你就可以看到我的系统调用被编译成

      C70424004044E8D8500100
      

      我希望这就是你的意思:)

      这可以通过 ollydbg 或 x32dbg 或 objdump -M intel -d 来完成;)

      【讨论】:

      • 我很确定这就是@pablo663 所问的——编译后如何在机器码中查看他的源代码
      【解决方案4】:

      所以你问如何扭转它? 你应该搜索逆向工程并从那里开始。 您将需要使用反编译器,了解一些汇编知识 仍然不能保证成功,您将能够获得所有原始代码。 如果程序最初有多个文件或某种隐藏技术来随机化代码(混淆),它也会变得更难。您需要做很多工作才能获得与原始代码的基本相似之处。 这是该主题的维基百科链接:http://en.wikipedia.org/wiki/Reverse_engineering

      但是,它在您所在的地区可能是非法的,这取决于您对它的处理方式,请不要惹上麻烦!

      注意:如果这篇文章不允许,请有人告诉我,我会立即删除它。

      编辑:我相信它也可以称为反编译。

      【讨论】:

      • 编译 = C -> 机器码。我会看到这个机器码(二进制码)
      • 这个答案的语气有点傻......我会说你不应该使用大写字母并避免使用粗体 - 它给人的感觉是你在大喊大叫......你应该也许而是使用斜体。
      【解决方案5】:

      如果您使用嵌入在目标文件中的调试信息(编译源文件生成的二进制输出文件)进行编译,则指向源文件原始位置的链接将嵌入目标文件中。这允许调试器(例如 gdb )在调试程序时遇到断点时跳转到源文件中与断点相对应的行。如果您使用 gcc,则可以通过指定 -g 开关添加调试信息进行编译。例如:

      gcc -g -o myProgram myProgram.c
      

      将 myProgram.c 编译成可执行的 myProgram,您可以运行或调试它。要调试 myProgram,您可以使用 gdb:

      gdb myProgram
      

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 2016-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多