首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在二进制代码编译后查看C代码?

如何在二进制代码编译后查看C代码?
EN

Stack Overflow用户
提问于 2011-10-17 20:03:52
回答 5查看 21.3K关注 0票数 1

编译器获取这些代码,并将其转换为机器代码。

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

EN

回答 5

Stack Overflow用户

发布于 2011-10-17 21:25:24

这通常被描述为“把汉堡包变成牛”。

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

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

票数 8
EN

Stack Overflow用户

发布于 2011-10-17 20:07:15

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

这个过程称为反编译

如果我误解了您的问题,并且您想知道如何查看编译器从C代码中生成的汇编程序,那么这取决于特定的编译器,但它们都可以这样做。请参阅我怎样才能看到由gcc编译器为C/C++程序生成的汇编代码?

票数 7
EN

Stack Overflow用户

发布于 2011-10-17 20:14:48

使用ollydbg并在可有可无的代码中找到代码:)

例如,编译后的代码

代码语言:javascript
运行
复制
int main()
{
  system("PAUSE");
  return 0;
}

很难在所有的行中找到不确定的,但如果你垫它,你可以发现它更容易,例如.编译这段代码

代码语言:javascript
运行
复制
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“的行,在它们之间是二进制形式的代码。

代码语言:javascript
运行
复制
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

所以你可以看到我的系统调用被编译成

代码语言:javascript
运行
复制
C70424004044E8D8500100

我希望你的意思是:)

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7798923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档