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

pab*_*663 0 c

编译器接受此代码,并将其转换为机器代码

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

Joh*_*ode 8

这通常被描述为"将汉堡包变回奶牛".

反编译器将生成在功能上等同于原始代码的C源代码,但它不具有任何原始符号名称,并且可能不是相同的结构.它可能甚至不是非常"可读".

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


Mar*_*ett 7

您无法从已编译的二进制文件中获取原始C源代码 - 在C中有许多方法可以生成相同的最终结果,因此没有唯一的源.

该过程称为反编译

如果我误解了你的问题,你想知道如何查看编译器从C代码生成的汇编程序,那么这取决于特定的编译器,但他们都可以这样做.请参阅如何查看由gcc(任何风格)编译器为C/C++程序生成的汇编代码?


fjl*_*jlj 5

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

例如编译的代码

int main()
{
  system("PAUSE");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)

现在在反汇编中,我将能够看到"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
Run Code Online (Sandbox Code Playgroud)

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

C70424004044E8D8500100
Run Code Online (Sandbox Code Playgroud)

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