2011-12-08 58 views
0

是否有可能在運行時修改可執行文件(我在問Windows XP/Vista/7/Server)?我剛剛評估過SmartUtils Portable Storage application。它可以創建所謂的「託管可執行存儲文件」,在運行時自行修改它們......這樣的存儲文件就像標準的自解壓存檔(數據被添加到可執行模塊中),但主要區別在於您可以在沒有主程序的情況下查看和修改其內容。這怎麼可能?我需要類似的功能在我的項目(C++)中:我想能夠創建可以修改附加到它的數據的可執行文件。是否可以在運行時修改可執行文件?

+1

[自我修改代碼](http://en.wikipedia.org/wiki/Self-modifying_code)是一個好開始 –

+1

@parapurarajkumar:我不認爲我們在這裏討論的是自修改代碼;可能它只是在真正的可執行文件末尾添加的一些檔案。 –

+0

歡迎來到StackOverflow。請編輯您的問題,以確切指定您需要實現的功能。期望人們去研究一個外部網站,以便弄清楚你所要求的是不合理的。如果由於某種原因網站不可用,它會使您的問題變得毫無意義(並且對於未來的讀者而言是不可測量的)。當你處於這種狀態時,你可能應該添加一個標籤來指明你的目標操作系統;他們之間有什麼不同。謝謝。 :) –

回答

1

如果所有你真的問的是SmartUtils移動存儲如何做它的魔力,那麼我建議,這是一個自動執行的zip壓縮包。檔案的EXE(就像WinZip或7-Zip創建的那樣)從臨時文件夾中自動提取並執行你的應用程序exe,併爲你提供一個API,這些API可以解壓縮,處理,執行檔案。

因此,Windows從不嘗試修改正在運行的.exe。相反,你的.exe文件(temp文件解壓縮爲& run)是正在執行的操作(以及綁定到它的庫),它操縱源.exe(真正的自執行存檔 - 可能是.zip)。

下次用戶「運行」修改過的「exe」時,再次提取您的.exe文件,運行後,它可以再次操作自解壓縮.exe。

我希望對你有意義。

而這只是一個最好的猜測!

1

是的 - 一種常用的技術是在可執行文件末尾添加數據文件。

典型方案是一個整數0×00000000寫入到可執行的末尾,再附加的每個文件,然後在字節它的大小。

然後,當可執行程序需要讀取數據時,它會檢查自己文件中的最後4個字節,將其用作文件長度,並將該字節數複製到自己的文件中,然後將接下來的4個字節作爲另一個長度並將其作爲一個文件複製,直到獲得長度爲0000.如果您還需要編寫文件名 - 這增加了一點複雜性,但它基本上是相同的想法。

0

您可以附加一個TOC指針到一個EXE(和可能是一個神奇的ID的Cookie),所以你可以驗證它是一個TOC指針,然後用它來備份到每個追加記錄的開始。

只要你不惹了該文件的標題&主要內容,它應該還是由操作系統加載。

但是,你犧牲任何簽署您的EXE了 - 你可能有不同的權限問題,以抗衡...

我寫的工具打開一個Windows EXE我的開發環境,它推斷的資源,修改各種各樣的東西,並重新包裝整個事情。我們使用它來將beta版標記爲release(所以它修改了版本記錄)。

如果你知道它的結構並正確重建,你可以做任何你想要的EXE文件。

+0

我不認爲你可以獲得當前正在執行的文件的可寫句柄。 –

+0

這就是問題!使用CreateFile/WriteFile標準方法不能修改可執行文件。但似乎我寫的應用程序實現了某種解決方法... –

+0

如果Windows不會讓你寫入正在執行的文件(並不奇怪),那麼你必須提取資源並在其他地方操作它們(或將執行轉移到不同的模塊,這會打開並修改原始模塊)。 – Mordachai

0

因爲這個被標記爲Windows,您也可以考慮「備用數據流」。這使您可以將單個文件視爲目錄。您可以將一個名爲Program.EXE:ExtraData的流添加到您的程序中,並使用正常的文件功能寫入該流。

話又說回來,你的可執行文件極有可能會在Program Files\,這是不寫的正常(非升高)的用戶。

+0

不幸的是,這是一個NTFS專用功能,據我瞭解,通常不能在DVD/CD/USB密鑰等上使用。 有一段時間,Raymond Chan寫道,表示Windows Shell團隊停止使用因爲它不可移植(我認爲你可以推斷出如果Windows Shell避免這種情況,它肯定是相當有限的) – Mordachai

+2

那麼,CD或DVD上的自修改EXE將會面臨獨特的挑戰;)。至於Windows Shell,可能是指[爲什麼在Windows 2000上創建的自定義屬性丟失了...](http://blogs.msdn.com/b/oldnewthing/archive/2011/05/27/10168422 .aspx) – MSalters

+0

感謝您添加鏈接。是的,這就是我所指的。 OP的SmartUtils指的是不使用流,因此不會受到這種限制。不確定OP的要求是什麼,但值得考慮這個限制。 ;) – Mordachai

相關問題