2014-12-03 31 views
-1

我目前正在開發一個應用程序(Windows),需要在下載時進行內部修改。 另外,我使用Linux主機提供它,因此無法按照建議按需編譯。
Ninite如何處理?
在Ninite.com中,每次選擇不同的選項時,您都會得到相同的.exe,但只需稍作修改即可。
下載時修改可執行文件(像Ninite)

選項1
編譯與預定義的數據的程序(在Windows)。
使用PHP來查看文件並替換我的自定義字符串。

選項2
用不同的資源文件

其他附加原來的.EXE?

有人開發出類似這樣的東西嗎?最好的方法是什麼?
謝謝。

+0

你想保留的信息是什麼? – 2014-12-03 12:16:02

+0

在主應用程序中?除客戶資料外 – 2014-12-03 12:21:51

+0

請編輯您的問題以改善它。您將其重點從「修補我的可執行文件」改爲「讓我的應用程序持久保存」 – 2014-12-03 12:43:17

回答

1

您可以將數據追加到原始可執行文件的後面。 Windows PE文件格式足夠健壯,這不會使可執行文件本身無效。 (然而,它會使任何現有的數字簽名無效。)

如果事先不知道其大小,找到這個數據的開始可能是一個挑戰。在這種情況下,可能需要附加可變長度數據,然後附加數據長度(本身是一個固定長度的字段--4個字節應該這樣做)。要讀取額外的數據,請讀取最後4個字節以獲取數據長度。獲取文件長度,爲長度字段減去4,然後減去變量長度以獲取數據的開始。

1

最便攜的方式可能是在應用程序內部安裝插件(其路徑在主程序中有線)。該插件將被修改(例如,在Linux上,通過生成C++代碼gencod.cc,分成g++ -Wall -shared -fPIC -O gencod.cc -o gencod.so編譯,然後dlopen-./gencod.so),並且您的應用程序可以生成該插件的C++源代碼並進行編譯。

我想這同樣可能是可行的在Windows上(我不知道)。可能問題是編譯它(編譯命令在Windows和Linux上會有所不同)。注意Windows上的AFAIK進程不能修改自己的可執行文件(但你應該檢查)。

Qt有一個可移植的插件層。見QPluginLoader & Qt Plugins HowTo

可替換地,不修改該應用程序,但使用一些persistent文件或數據(在良好限定的位置,是誰的位置或文件路徑被佈線在executable-優選在文本格式等JSON,或可能使用sqlite或真正的數據庫)保持不斷變化的信息。另請閱讀關於application checkpointing

如果您需要實現特定的應用程序檢查點,那麼您應該儘早設計您的應用程序,並考慮此問題。研究garbage collection算法(檢查點過程類似於精確複製GC)並閱讀更多關於continuations的信息。也可以參考this answer來解釋一個非常類似的問題。