我正在'C/C++ - Win32API'環境中編寫一個dll。 我有一些常數變量(都是DWORD值和LPWSTR/LPSTR字符串),我必須啓用用戶修改。 我正在尋找的是(希望)一種工具,可以通過更新所有必要的PE表的方式來實現所描述的安全二進制修改, 。如何整齊地修改一個PE的數據部分
回答
可以在這樣一個單獨的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。。除非你真的沒有別的選擇,否則我不會打擾。
ARX,非常感謝你!這正是我的意思和需要。 – 2013-03-24 17:42:46
我發生了一些事情:結構實例是const的,所以優化器可以想象「內聯」常量值。如果確實如此,改變PE不會改變有效常數值。你需要測試以確保這一切都沒有發生。如果確實如此,請確保該結構位於其自己的翻譯單元中,然後嘗試移除該const,然後關閉整個程序優化。 – arx 2013-03-25 08:19:44
從外部配置文件讀取它們,讓用戶修改它? – NPE 2013-03-24 15:05:51
不可能在我的場景中,二進制文件必須是完全獨立的。 – 2013-03-24 15:13:34
您的「獨立」需求是否允許使用註冊表? – Michael 2013-03-24 15:28:16