![](/img/trans.png)
[英]VSCode C++ Compiled exe was infected with Win32:TrojanX-gen[Trj]
[英]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中設置默認值,但如果需要進行更改,請將它們放在注冊表中。 這使得更改透明,以后會為您帶來很多悲傷。
想要為更新編寫新URL的Yyour算法應該通過將其寫入注冊表來實現。 或者,有一個配置文件隨您的exe一起發布,並更新它。 (但請記住用戶權限 - 您可能沒有該文件的寫入權限,但您始終可以寫入注冊表的用戶配置單元。)
理論上, BeginUpdateResource
, UpdateResource
和EndUpdateResource
用於此目的。 實際上,讓這些工作完全是非常棘手的。 我完全不確定他們是否可以在正在運行的可執行文件中更新資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.