2012-08-17 61 views
0

簡單的問題我知道,我想要做的是能夠獲取文件的字節以將這些字節添加到位數組,然後我可以使用它來寫入名爲bytes.exe的文件並啓動它。我知道如何在運行時讀取現有文件的字節。但我不知道如何在設計時將文件的字節複製並粘貼到我的bitarray[]中。如何獲取文件的字節?

目標是能夠在運行時將bitarray[]寫入myfile.exe,然後啓動該文件。有很多bitarray[]'s我將使用,基於許多不同的文件類型,所以我正在尋找一種簡單的方法。

是否有某種應該使用的反編譯器?我只是看資源腳本,但我不想附加任何依賴關係到我的主要.exe。

+0

顯式複製文件有什麼問題?是否有一個原因你試圖手動移動字節? – 2012-08-17 05:31:08

+0

你的意思是在設計時複製文件?我怎麼做? – 2012-08-17 05:36:39

+0

「設計時間」是什麼意思? – 2012-08-17 05:48:57

回答

1

如果您的目標是Windows,最簡單的方法是將myfile.exe作爲資源,然後在運行時加載資源並創建一個文件並將資源的內容寫入新文件。

如果您不能使用資源,那麼您需要創建一個源文件(.c或.h),用於初始化一個字節數組,其內容爲myfile.exe,並將其作爲構建的一部分。看看這個答案一種可能的方法:

https://stackoverflow.com/a/73653/333127

編輯:經過進一步審查,我不認爲在我上面提到會爲二進制程序輸入文件鏈接的源代碼。這裏有一個快速的替代我只是扔在一起:

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

#define BYTES_PER_LINE 70 

int main(int argc, char* argv[]) 
{ 
    FILE* fp; 
    int ch; 
    int numBytes = 0; 

    if (argc < 2) { 
     printf("Usage: tobytes <file>\n"); 
     exit(1); 
    } 

    fp = fopen(argv[1], "rb"); 
    if (fp == NULL) { 
     printf("Cannot open file %s\n", argv[1]); 
     exit(1); 
    } 

    printf("char fileContents[] = {\n"); 
    while ((ch = fgetc(fp)) != EOF) { 
     if (numBytes > 0) 
      printf(","); 

     ++numBytes; 
     if (numBytes % BYTES_PER_LINE == 0) 
      printf("\n"); 

     printf("0x%x", ch); 
    } 
    printf("\n};\n"); 

    fclose(fp); 

    return 0; 
} 
+0

好的。我只是會有一個程序來做到這一點。我猜如果沒有的話我會發布我的。 – 2012-08-17 06:18:43

+0

我可以使用源發佈我的新程序ExeEmbedder©?(開玩笑50%) – 2012-08-17 06:27:37

+0

如果你安裝了vim,你可以運行'xxd -i thefile'來做同樣的事情 – nos 2012-08-17 07:00:02

0

這不是100%清楚自己想要做什麼,但爲什麼不寫一個小程序,讀取一個文件,並將其轉換成C數組。

如果文件數據是:

01 02 03 04 (binary) 

程序會生成一個文件,該文件是:

char data[] = {0x01, 0x02, 0x03, 0x04}; 

,然後運行該程序作爲應用程序的預生成步驟(在Makefile或任何您正在使用的構建系統),並將輸出生成到您的源代碼樹中。

通過這種方式,數據將被編譯到您的應用程序中並且可以靜態提供。

正如我所說,我不清楚這是否是您正在嘗試解決的問題。

+0

是的,甜美。我考慮過這種方法,但我只是覺得我可能已經完成了。我試圖谷歌爲這樣做的程序,但沒有運氣。這令我感到吃驚,因爲我認爲這會比較常見。 – 2012-08-17 06:14:32

+0

這種東西通常被稱爲「資源」和「資源編譯器」,其中數據文件通過各種機制捆綁到應用程序中。每個平臺都有不同的表現。我所描述的是具有最少特徵的最簡單的方法。 – 2012-08-17 06:17:52

+0

謝謝,我會圍繞這些關鍵字谷歌。我需要的只是獲取程序「abc.exe」的字節並將其作爲字節數組放入myprog.exe,然後在運行時將程序重新命名爲newprog.exe。 – 2012-08-17 06:22:41