2009-08-28 103 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

相關問題