簡體   English   中英

在編譯的exe中編輯字符串變量? C ++ win32

[英]Edit strings vars in compiled exe? C++ win32

我希望在我的c ++應用程序中有一些字符串,我希望以后能夠在已部署的應用程序(編譯的exe)中編輯它們, 有沒有辦法讓exe編輯自己或它的資源,所以我可以更新字符串值?

應用程序在啟動時檢查更新,因此我正在考慮使用它來在我需要編輯字符串時發送命令(例如包含用於檢查更新的URL的字符串)。

我不想使用exe外部的任何東西,我可以簡單地使用注冊表,但我更喜歡將所有內容保存在exe中。

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

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

另一個想法是將字符串移動到“配置”文件中,例如XML或INI格式。

修改EXE而不編譯是黑客攻擊,非常氣餒。 您可以使用十六進制編輯器,找到字符串並進行修改。 新文本的長度必須小於或等於原始EXE。

請注意,某些病毒檢查程序會對可執行文件執行CRC或校驗和。 改變可執行文件是這些病毒檢查程序的紅旗。

這是不可能的,除非你的弦樂不會改變位置和長度。

因此,為了使其成為可能:在您的示例中,將用於獲取更新的URL的“大小”設置得相當大(想想:512個字符,最后填充空值)。 這樣,您就有了一些空間來更新String。

為什么不可能使用可變大小的字符串? 我可以用一個小的x86匯編代碼片段來解釋這個:

PUSH OFFSET test.004024F0

我們說吧; 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, 004024F0; MOV ESP, EAX; ADD ESP, 4 MOV EAX, 004024F0; MOV ESP, EAX; ADD ESP, 4 還有可能計算該字段: MOV EAX, 00402000; ADD EAX, 4F0; ... MOV EAX, 00402000; ADD EAX, 4F0; ... MOV EAX, 00402000; ADD EAX, 4F0; ... 所以這使它“幾乎無限”。

但是,如果您使用靜態大小的字段; 您不必更改引用字符串的代碼。 如果你保留了特定字段的足夠空間,那么你可以輕松地寫一個比原來更長的字符串,因為字符串的大小是通過找到第一個“空字節”來計算的; 用空值填充字段的其余部分。

如果使用靜態大小的字段,則在編譯時很難找到“文件中的位置”。 考慮花費大量時間來攻擊自己的應用程序; 您可以編寫修改.exe代碼,並將新的String值存儲在指定的偏移量處。 在編譯時不知道此文件偏移量,您可以稍后使用OllyDbg之類的工具自行修補此文件偏移量。 這使得可執行文件能夠修補自己:-)

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

不想懲罰,但這聽起來不是一個好主意。 擁有用於檢查程序內部更新的URL會使其不靈活。

您正試圖通過重寫exe​​中的字符串來減輕不靈活性。 這真的是在惹麻煩:

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

注冊表(盡管它的所有弱點)確實是這種配置數據應該去的地方。 您可以在EXE中設置默認值,但如果需要進行更改,請將它們放在注冊表中。 這使得更改透明,以后會為您帶來很多悲傷。

想要為更新編寫新URL的Yyour算法應該通過將其寫入注冊表來實現。 或者,有一個配置文件隨您的exe一起發布,並更新它。 (但請記住用戶權限 - 您可能沒有該文件的寫入權限,但您始終可以寫入注冊表的用戶配置單元。)

理論上, BeginUpdateResourceUpdateResourceEndUpdateResource用於此目的。 實際上,讓這些工作完全是非常棘手的。 我完全不確定他們是否可以在正在運行的可執行文件中更新資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM