2009-08-28 73 views
3

通过这个,我的意思是可以用C编写一个程序,编译它,然后看看它在一个和零中看起来像什么?像1337黑客那样行事并假装实际编程为1和0将是很酷的:p。是否可以查看一个和零个二进制文件?

+0

是啊....只是用hexeditor打开你编译的程序...人们实际上是这样做的反向工程的东西*。 – mpen 2009-08-28 02:40:04

+8

可悲的是,我实际上不得不盯着十六进制内存转储来调试某些种类的崩溃在我的工作中,我的同事们称之为“阅读矩阵”,而我认为它是“阿司匹林的时间”。 – Crashworks 2009-08-28 03:20:36

回答

12

您可以使用xxd

xxd -b filename 
 
C:\opt\bin> xxd -b ctags.exe | head 
0000000: 01001101 01011010 10010000 00000000 00000011 00000000 MZ.... 
0000006: 00000000 00000000 00000100 00000000 00000000 00000000 ...... 
000000c: 11111111 11111111 00000000 00000000 10111000 00000000 ...... 
0000012: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 
0000018: 01000000 00000000 00000000 00000000 00000000 00000000 @..... 
000001e: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 
0000024: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 
000002a: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 
0000030: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 
0000036: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 

只是为了让这种关系更多一点的编程:

#include <stdio.h> 
#include <stdlib.h> 

const char *lookup[] = { 
    /* 0  1  2  3  4  5  6  7 */ 
    "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", 
    /* 8  9  A  B  C  D  E  F */ 
    "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", 
}; 

int main(int argc, char *argv[]) { 
    FILE *fin; 
    int c; 
    size_t bytes_read = 0; 

    if (argc != 2) { 
     fputs("No filename provided", stderr); 
     exit(EXIT_FAILURE); 
    } 

    fin = fopen(argv[1], "rb"); 
    if (!fin) { 
     fprintf(stderr, "Cannot open %s\n", argv[1]); 
     exit(EXIT_FAILURE); 
    } 

    while (EOF != (c = fgetc(fin))) { 
     printf("%s", lookup[ (c & 0xf0) >> 4 ]); 
     printf("%s", lookup[ (c & 0x0f) ]); 

     bytes_read += 1; 
     if (bytes_read % 9 == 0) { 
      puts(""); 
     } 
    } 

    fclose(fin); 

    return EXIT_SUCCESS; 
} 

输出:

 
C:\Temp> binary.exe c:\opt\bin\ctags.exe | head 
010011010101101010010000000000000000001100000000000000000000000000000100 
000000000000000000000000111111111111111100000000000000001011100000000000 
000000000000000000000000000000000000000000000000010000000000000000000000 
000000000000000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000111000000000000000000000 
000000000000111000011111101110100000111000000000101101000000100111001101 
001000011011100000000001010011001100110100100001010101000110100001101001 
011100110010000001110000011100100110111101100111011100100110000101101101 
4

使用hexdumphex editor查看十六进制字节的二进制。

十六进制只是一种更简洁的查看二进制文件的方式。每个十六进制数字(0-F)代表四位。例如,0xF十进制为15,二进制是1111

+1

如果你碰巧在Linux下运行KDE,KHexEdit是一个很好的十六进制编辑器。 – 2009-08-28 02:45:12

0

当然有可能。您可以使用this post中的信息编写自己的查看器。

1

你的意思是你不能编译并将操作码翻译成二进制文件?

实际上,我学会编程的计算机之一必须通过前面板开关切换引导程序代码。你需要输入足够的代码才能从8“软盘驱动器启动加载程序并加载操作系统,你可以看到一个here的图片,我确实需要知道启动加载器操作码的二进制文件

+0

+1使用了8英寸软盘。让我想起了几天来,我在一个巨型机柜中用了一台水冷IBM系统,内存高达64K。 – 2009-08-28 03:14:11

+0

出于好奇,最终存在多少代码?几个操作码,几十个,几百个? – 2009-08-28 03:16:17

+0

@布鲁克斯 - 我希望我能记住。我认为这可能不是很多。我非常肯定,我可以在我的整个程序中切换并跳过软盘。调试是通过遍历内存空间并查看指示1/0s的红灯来检查值来完成的。当我将操作系统复制到我自己的软盘上时,得到了我的第一个反盗版讲座,所以我可以将操作系统和我的程序合二为一而不必切换。 **这给人留下了深刻的印象。我们只是说,许可部门和我现在相处得很好。 – tvanfosson 2009-08-28 10:53:07

相关问题