2013-03-24 51 views
2

我正在'C/C++ - Win32API'環境中編寫一個dll。 我有一些常數變量(都是DWORD值和LPWSTR/LPSTR字符串),我必須啓用用戶修改。 我正在尋找的是(希望)一種工具,可以通過更新所有必要的PE表的方式來實現所描述的安全二進制修改, 。如何整齊地修改一個PE的數據部分

+0

從外部配置文件讀取它們,讓用戶修改它? – NPE 2013-03-24 15:05:51

+0

不可能在我的場景中,二進制文件必須是完全獨立的。 – 2013-03-24 15:13:34

+0

您的「獨立」需求是否允許使用註冊表? – Michael 2013-03-24 15:28:16

回答

3

可以在這樣一個單獨的PE部分創建結構:

// Create the section 
#pragma section("myconst", read) 

// Declare a struct to hold the constant data 
typedef struct 
{ 
    DWORD a; 
    DWORD b; 
    char stringa[256]; 
    char stringb[256]; 
} ConstData; 

// Create an initialized instance of the struct in the new section 
__declspec(allocate("myconst")) 
const ConstData theData = {0xdeadbeef, 0xfeedface, "Hello", "dolly"}; 

編譯代碼。打開Visual Studio命令提示符,運行

dumpbin /all myexe.exe > dump.txt 
notepad dump.txt 

搜索myconst部分。您應該看到如下所示:

SECTION HEADER #4 
myconst name 
    208 virtual size 
    4000 virtual address (00404000 to 00404207) 
    400 size of raw data 
    2000 file pointer to raw data (00002000 to 000023FF) 
     0 file pointer to relocation table 
     0 file pointer to line numbers 
     0 number of relocations 
     0 number of line numbers 
40000040 flags 
     Initialized Data 
     Read Only 

RAW DATA #4 
    00404000: EF BE AD DE CE FA ED FE 48 65 6C 6C 6F 00 00 00 ï¾­ÞÎúíþHello... 
    00404010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
    00404020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 

您可以看到在代碼中初始化的兩個十六進制值和第一個字符串值。你也可以看到PE文件中的這個數據的偏移量 - 「指向原始數據的文件指針」 - 是0x2000。

用這些信息武裝起來,構建一個新的數據塊非常容易,打開PE文件並覆蓋0x2000處的數據。

要確定代碼的偏移量,您需要解析PE文件頭和節頭。這非常簡單。或者您可以從生成過程的一部分抓取來自dumpbin輸出的偏移量,並將其饋送到編輯工具的內部。

請注意,要在發佈模式下測試此功能,您需要實際使用theData,否則鏈接程序會將其丟棄。另請注意,該部分只有read屬性,因此它是真正的只讀屬性。試圖寫它會給訪問衝突。

最後......這一切都很sc。。除非你真的沒有別的選擇,否則我不會打擾。

+0

ARX,非常感謝你!這正是我的意思和需要。 – 2013-03-24 17:42:46

+2

我發生了一些事情:結構實例是const的,所以優化器可以想象「內聯」常量值。如果確實如此,改變PE不會改變有效常數值。你需要測試以確保這一切都沒有發生。如果確實如此,請確保該結構位於其自己的翻譯單元中,然後嘗試移除該const,然後關閉整個程序優化。 – arx 2013-03-25 08:19:44