是否有可能在運行時修改可執行文件(我在問Windows XP/Vista/7/Server)?我剛剛評估過SmartUtils Portable Storage application。它可以創建所謂的「託管可執行存儲文件」,在運行時自行修改它們......這樣的存儲文件就像標準的自解壓存檔(數據被添加到可執行模塊中),但主要區別在於您可以在沒有主程序的情況下查看和修改其內容。這怎麼可能?我需要類似的功能在我的項目(C++)中:我想能夠創建可以修改附加到它的數據的可執行文件。是否可以在運行時修改可執行文件?
回答
如果所有你真的問的是SmartUtils移動存儲如何做它的魔力,那麼我建議,這是一個自動執行的zip壓縮包。檔案的EXE(就像WinZip或7-Zip創建的那樣)從臨時文件夾中自動提取並執行你的應用程序exe,併爲你提供一個API,這些API可以解壓縮,處理,執行檔案。
因此,Windows從不嘗試修改正在運行的.exe。相反,你的.exe文件(temp文件解壓縮爲& run)是正在執行的操作(以及綁定到它的庫),它操縱源.exe(真正的自執行存檔 - 可能是.zip)。
下次用戶「運行」修改過的「exe」時,再次提取您的.exe文件,運行後,它可以再次操作自解壓縮.exe。
我希望對你有意義。
而這只是一個最好的猜測!
是的 - 一種常用的技術是在可執行文件末尾添加數據文件。
典型方案是一個整數0×00000000寫入到可執行的末尾,再附加的每個文件,然後在字節它的大小。
然後,當可執行程序需要讀取數據時,它會檢查自己文件中的最後4個字節,將其用作文件長度,並將該字節數複製到自己的文件中,然後將接下來的4個字節作爲另一個長度並將其作爲一個文件複製,直到獲得長度爲0000.如果您還需要編寫文件名 - 這增加了一點複雜性,但它基本上是相同的想法。
您可以附加一個TOC指針到一個EXE(和可能是一個神奇的ID的Cookie),所以你可以驗證它是一個TOC指針,然後用它來備份到每個追加記錄的開始。
只要你不惹了該文件的標題&主要內容,它應該還是由操作系統加載。
但是,你犧牲任何簽署您的EXE了 - 你可能有不同的權限問題,以抗衡...
我寫的工具打開一個Windows EXE我的開發環境,它推斷的資源,修改各種各樣的東西,並重新包裝整個事情。我們使用它來將beta版標記爲release(所以它修改了版本記錄)。
如果你知道它的結構並正確重建,你可以做任何你想要的EXE文件。
我不認爲你可以獲得當前正在執行的文件的可寫句柄。 –
這就是問題!使用CreateFile/WriteFile標準方法不能修改可執行文件。但似乎我寫的應用程序實現了某種解決方法... –
如果Windows不會讓你寫入正在執行的文件(並不奇怪),那麼你必須提取資源並在其他地方操作它們(或將執行轉移到不同的模塊,這會打開並修改原始模塊)。 – Mordachai
因爲這個被標記爲Windows
,您也可以考慮「備用數據流」。這使您可以將單個文件視爲目錄。您可以將一個名爲Program.EXE:ExtraData
的流添加到您的程序中,並使用正常的文件功能寫入該流。
話又說回來,你的可執行文件極有可能會在Program Files\
,這是不寫的正常(非升高)的用戶。
不幸的是,這是一個NTFS專用功能,據我瞭解,通常不能在DVD/CD/USB密鑰等上使用。 有一段時間,Raymond Chan寫道,表示Windows Shell團隊停止使用因爲它不可移植(我認爲你可以推斷出如果Windows Shell避免這種情況,它肯定是相當有限的) – Mordachai
那麼,CD或DVD上的自修改EXE將會面臨獨特的挑戰;)。至於Windows Shell,可能是指[爲什麼在Windows 2000上創建的自定義屬性丟失了...](http://blogs.msdn.com/b/oldnewthing/archive/2011/05/27/10168422 .aspx) – MSalters
感謝您添加鏈接。是的,這就是我所指的。 OP的SmartUtils指的是不使用流,因此不會受到這種限制。不確定OP的要求是什麼,但值得考慮這個限制。 ;) – Mordachai
- 1. 是否可以修改可執行文件中的.frm文件的設置?
- 2. 是否可以在運行時編輯.NET可執行文件的資源?
- 3. 是否可以在運行時修改屬性的屬性?
- 4. 是否可以在運行時修改VCL樣式?
- 5. 正在運行的可執行文件修改自己
- 6. 是否可以在Google App Engine ** Flexible **環境中運行Windows可執行文件?
- 7. 是否可以在C#中運行時創建/執行代碼?
- 8. C程序可以修改其可執行文件嗎?
- 9. 可執行文件運行時
- 10. 數據庫運行時可以修改cnf文件嗎?
- 11. 確定一個可執行文件是否正在運行
- 12. 是否可以修改文件中的行?
- 13. 織物SUDO運行時是否可以執行函數
- 14. 是否可以運行不可執行的npm腳本?
- 15. 是否可以在運行時修改並保存程序中的XML文件而不是外部文件?
- 16. 是否可以同時執行sendto()recvfrom()?
- 17. 是否可以在運行時編輯嵌入資源文件?
- 18. 是否可以在運行時切換jar文件?
- 19. 是否可以在運行時提供新的PropertiesConfiguration文件?
- 20. Windows窗體:是否可以在運行時插入.cs文件?
- 21. 在PHP中運行可執行文件
- 22. 在gradlew中運行可執行文件
- 23. 是否有可以在運行時修改其代碼的vb.net程序?
- 24. Bigcommerce - 在函數執行後是否可以更改文本?
- 25. 是否可以創建「class」運行時?
- 26. 是否可以創建vbscript文件,可以使用發送鍵和運行程序同時執行?
- 27. 可執行文件大小是否可以優化?
- 28. 是否可以從gdbserver獲取遠程可執行文件名?
- 29. 是否可以解構和重建WIX可執行文件?
- 30. 是否可以修改PrintDialog?
[自我修改代碼](http://en.wikipedia.org/wiki/Self-modifying_code)是一個好開始 –
@parapurarajkumar:我不認爲我們在這裏討論的是自修改代碼;可能它只是在真正的可執行文件末尾添加的一些檔案。 –
歡迎來到StackOverflow。請編輯您的問題,以確切指定您需要實現的功能。期望人們去研究一個外部網站,以便弄清楚你所要求的是不合理的。如果由於某種原因網站不可用,它會使您的問題變得毫無意義(並且對於未來的讀者而言是不可測量的)。當你處於這種狀態時,你可能應該添加一個標籤來指明你的目標操作系統;他們之間有什麼不同。謝謝。 :) –