2010-05-20 103 views
4

我想在我的C++應用程序弦數,我希望能夠在部署的應用程序(編譯後的exe文件)後對其進行編輯,有沒有一種方法,使exe文件編輯本身或者它的資源,以便我可以更新字符串值?在編譯的exe中編輯字符串變量? C++的Win32

該應用程序檢查開始更新,所以我想使用它來在我需要編輯字符串時發送命令(例如包含用於檢查更新的url的字符串)。

我不想使用EXE外部的任何東西,我可以簡單地使用註冊表,但我更願意將所有內容都保存在exe文件中。

我使用visual studio 2010 C++(或任何其他版本的ms visual C++)。

+0

謝謝大家,我想即將使用外部文件,而不是註冊表,或將註冊表是一個更好的主意? – extintor 2010-05-20 18:33:59

+0

它取決於運行更新程序的用戶權限。我在迴應中提到,您始終可以寫入用戶配置單元,但普通用戶無法寫入「c:\ program files」。 – mdma 2010-05-20 23:36:24

回答

3

另一個想法是字符串移動到「配置」的文件,諸如XML或INI格式。

修改已無需編譯EXE文件被黑客和高度氣餒。您可以使用十六進制編輯器,找到該字符串並對其進行修改。新文本的長度必須小於或等於原始EXE。

注意,一些病毒檢測對可執行文件進行的CRC校驗或。更改可執行文件是這些病毒檢查程序的紅旗。

+0

你認爲外部文件會比註冊表好嗎?普通用戶是否可以創建/編輯該文件,或者是否可以給權限和類似的事情帶來麻煩? – extintor 2010-05-20 18:35:20

+0

XML配置文件和註冊表之間的選擇通常是基於數據大小進行的。如果你有少於十幾個字符串,少於4KB的數據,請使用註冊表。 – MSalters 2010-05-21 08:47:48

6

我知道你說你不想使用程序外部的任何東西,但我認爲你真正想在這種情況下是一個純資源的DLL。可執行文件可以在給定的調用中加載任何具有您需要的字符串的DLL。

1

創建一個自編輯exe文件是解決這個問題的一個非常不明智的方法。從外部文件中存儲和讀取字符串要好得多。也許如果你提供一些背景知道爲什麼你不想使用除exe之外的任何東西,我們可以解決這些問題?

1

不想要懲罰,但這並不聽起來像一個偉大的想法。擁有用於檢查程序內部更新的URL使其變得不靈活。

你試圖在你的EXE改寫串,以減輕僵硬。這真的是要求麻煩:

  • 你確定用戶運行你的程序有寫權限可以更新EXE嗎?默認用戶對程序文件夾中安裝的文件沒有寫入權限。
  • 如果程序由多個用戶運行或者由同一用戶多次運行,則exe將被鎖定並且不可修改
  • 系統管理員將很難調整URL。
  • 有一個真正的風險,你會腐敗你的EXE。重寫過程可能很複雜,特別是如果您想使URL長於當前分配的時間。
  • 通過修改你的exe,你刪除了使用代碼簽名的可能性,這在網絡環境中很有用。

註冊表(儘管它的所有弱點)真的是這種配置數據應該去的地方。您可以在您的EXE中放入一個默認值,但如果您需要進行更改,請將它們放入註冊表中。這使得變化透明,以後可以爲你節省很多痛苦。

想要編寫更新的新URL的Yyour算法應通過將其寫入註冊表來完成此操作。另外,有一個配置文件,隨您的EXE現場發貨,並更新。 (但切記用戶權限 - 您可能沒有該文件的寫權限,但你總是可以寫入註冊表的用戶配置單元)。

2

這是不可能的,除非你的字符串不會改變位置&的長度。

所以爲了讓它成爲可能:在你的例子中,讓你的「大小」用於獲取更新很大的URL(想想:512個字符,最後爲空)。這樣,你有一些空間來更新字符串。

爲什麼不可能使用可變大小的字符串?那麼我可以用一個小的x86彙編代碼片斷來解釋一下:

PUSH OFFSET test.004024F0 

假設;在test.004024F0的偏移量處是可變大小的字符串。現在考慮的變化:

我想插入一個字符串,它比原來的字符串,它是在004024F0存儲串以前更長:這使得004024F0到一個新的價值,讓我們說:004024F5(新字符串,在此條目之前,比原始長度長5個字符)。

您認爲很簡單:搜索全部004024F0並將其替換爲004024F5錯了004024F0也可以是一個常規的「指令」(準確地說:ADD BYTE PTR DS:[EAX+24],AL; LOCK ...)。如果這條指令恰好在你的代碼中,它將被錯誤的代碼所取代。

那麼,你可能會想,那麼尋找那個PUSH指令呢? 錯誤:有幾乎無限制的方式來「推」。例如,MOV EAX, 004024F0; MOV ESP, EAX; ADD ESP, 4。也有可能計算字段:MOV EAX, 00402000; ADD EAX, 4F0; ...。所以這使得它「幾乎是無限的」。

但是,如果您使用靜態大小的字段;您不必更改引用字符串的代碼。如果您保留了特定字段的足夠空間,那麼您可以輕鬆地編寫比原始字符串更長的字符串,因爲字符串的大小是通過查找第一個「空字節」來計算的;用空值填充剩餘的場。

如果使用靜態大小的字段,但在編譯時很難找到「文件中的位置」。考慮到大量的時間花在竊取你自己的應用程序;您可以編寫修改.exe的代碼,並將新的字符串值存儲在指定的偏移量處。這個文件偏移量在編譯時是不知道的,你可以使用OllyDbg這樣的工具來修補這個文件偏移量。這使得可執行文件修補自己:-)