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

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

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

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

该过程称为反编译

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

使用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”的行,并且在它们之间是我的二进制forms的代码

 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  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 

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

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

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

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

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

但是,它可能在您所在的地区非法,取决于您使用它做什么,请不要遇到麻烦!

注意:如果不允许发布此post,请有人告诉我,我会立即将其删除。

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

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

 gcc -g -o myProgram myProgram.c 

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

 gdb myProgram