我正在'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
- 1. PE部分數據
- 2. 整齊地修改內部字典中的一員
- 3. 如何修改LVM PE的大小?
- 4. PE .idata部分
- 5. 修改線的一部分
- 6. 修改數據作爲alembic升級的一部分
- 7. 修改柱狀圖只顯示總數據的一小部分
- 8. 對齊另一個部分
- 9. 修補一個PE可執行文件
- 10. 如何修剪的整數部分的字符串只
- 11. PE文件部分名稱
- 12. 如何就地修改一維數組的每個元素?
- 13. 如何修補整個集合到一個數據庫
- 14. 如何修改web.config部分運行時?
- 15. 如何修改數據使其唯一?
- 16. MSSQL從同一個表中複製數據修改部分行中的文本
- 17. 如何將一個整數分解爲一個整數數組
- 18. 如何修改Magento的父主題中的一小部分?
- 19. HDFS如何修改數據
- 20. 修改整數數組中的整數
- 21. 如何修改一個ActionEvent
- 22. 如何修改一個ListView
- 23. 如何修改一個div?
- 24. 修改整數值
- 25. 如何修改另一個winform的數據表
- 26. 如何對齊一個DialogViewController中的rootElement的部分
- 27. 如何修改IP地址字符串以獲取其前3個部分?
- 28. 如何在C++中創建一個整數的對齊數組?
- 29. Python:我如何總結一個整整齊的整行?
- 30. 如何從plpgsql函數返回一個整數並回滾每個修改?
從外部配置文件讀取它們,讓用戶修改它? – NPE 2013-03-24 15:05:51
不可能在我的場景中,二進制文件必須是完全獨立的。 – 2013-03-24 15:13:34
您的「獨立」需求是否允許使用註冊表? – Michael 2013-03-24 15:28:16