2012-06-29 26 views
0

我遇到了一個問題,我可能在我頭上,希望有人能幫助我。我的C++技能相當欠缺,但我願意學習。在VS2005中修補一個二進制文件而不用重新編譯

這裏有一個Visual Studio 2005 C++項目,它爲我們使用的軟件生成一個DLL。問題是,我的代碼比客戶使用的要新一些,在這個時候更新客戶端是不可能的。

我需要做一些改變(主要評論一些函數和調用,改變一些值,就是這樣)。通常我會在代碼中的變化和編譯,但是這給了我一個二進制文件與客戶不兼容(因爲它們已經過時)

我有大多兼容的代碼生成的二進制文件,二進制本身。當然,必須有某種方法來修補現有的DLL與我的更改,而不真正編譯項目?我從來沒有做過任何二進制補丁。

任何幫助將不勝感激!

+0

你看過[Patchwiz](http://msdn.microsoft.com/en-us/library/windows/desktop/aa370590(v = vs.85).aspx)嗎?你最初是用['/hotpatch'](http://msdn.microsoft.com/en-us/library/ms173507(VS.80).aspx)編譯的? – ildjarn

+0

謝謝!據我所知,沒有/ hotpatch。 patchwiz如何幫助我?它似乎打算在兩個已知狀態之間進行批量修補 – user1491792

回答

0

DLL的實際設計是爲了解決您所描述的問題,即如何在客戶端無需重新編譯整個項目的情況下修復產品? DLL找到了一個二進制邊界,你可以簡單地換掉。

不幸的是我認爲最好的方法是重新編譯DLL。希望你能聽到我下面的話。 :)

即使您的代碼比客戶端的代碼更新,您需要維護的接口在.def文件中定義。因此,只要你不打破.def文件中定義的函數的原始接口協議,你的代碼庫就可以完全不同於客戶端,那就沒有關係了。

http://msdn.microsoft.com/en-us/library/d91k01sh(v=vs.80).aspx

事實上,你可以添加更多的功能到.def文件,只要上了年紀的功能(和他們的簽名)的原始順序不會改變,你會不會打破你的客戶應用程序。這就是Windows如何將更新的DLL發佈到其(相當多)客戶端的方式。

+0

謝謝!我不需要當前版本的.def文件嗎?我所擁有的就是二進制本身。 :(此外,我的代碼和當前版本之間的變化已經影響到軟件通信的方式,我很懷疑我可以兼容。黑客可能是唯一的選擇... – user1491792

+0

是的,你將需要一個.def文件對不起,我不知道如何進行二進制黑客攻擊,除了通過閱讀程序集來逆向工程代碼,修改二進制文件的彙編代碼,你有沒有當前二進制文件的符號客戶的手?根據變更的範圍,您可能會發現很難驗證黑客不會對軟件其他部分的完整性產生負面影響。請注意,編譯器通常會優化二進制文件,您可能會發現很難進行調試甚至有符號的軟件 – yuklai

+0

另外,我有點困惑,因爲你原來的問題提到你有一個Visual Studio項目,所以我假設你有源代碼,因此.def文件,但你的C省略表示你只有二進制。我誤解了什麼嗎? – yuklai

相關問題