2010-09-14 63 views

回答

4

是的,你錯過了很多。一個庫遵循PE/COFF格式,這在整個文件中的指針非常繁重。 (例如,朝文件的開頭是一個表格,指向文件中每個部分的位置)。

如果您正在編輯資源,如果您確定修改任何指向修改後的指針和大小的任何指針和大小,就可以在不破壞內容的情況下執行此操作,但我懷疑這很容易。在編輯.text段(即代碼)的情況下,我懷疑你會完成它,因爲函數調用和跳轉的操作數是它們在代碼中的位置的相對位置 - 您需要更新整個代碼來解釋編輯。

解決此問題的一種技術是「代碼洞穴」,您可以使用顯式JMP指令將一段現有代碼替換爲某個空白位置(您可以在運行時執行此操作,您可以在其中創建新的內存) - 您可以在其中定義一些可以是任意長度的新代碼 - 然後您可以顯式地將JMP返回到您調用的位置(對於JMP操作碼+操作數,則爲+5字節)。

2

你改變它們的名字與舊名稱的長度相同嗎?如果不是,那麼所有的偏移量都會被移位。並且做任何函數互相調用?這可能是另一個問題。獲得源代碼會更容易(如果項目的網站不是內部的,或者來自供應商,如果它已關閉,則從項目的網站獲取)並更改它們,然後重新編譯它。無論如何,我很好奇你爲什麼要改名字。

+0

該庫是我的,但我失去了它的源代碼。長度的變化,如何使它與這種轉變一起工作? – SharpAffair 2010-09-14 13:38:03

2

DLL是一個複雜的二進制格式(即編譯代碼)。編譯過程將命名函數調用轉換爲硬連接引用,以指向文件中的特定位置(「偏移量」)。因此,如果將字符插入文件的中間,那麼在該點之後的偏移將不再與它們引用的位置實際上匹配,這意味着庫中的函數調用將運行錯誤的代碼(如果它們設法運行任何東西完全)。

基本上,底線是你正在做的事情總是打破東西。如果你不走運,它甚至可能破壞真的,並造成嚴重的損害。

+0

如果您所做的只是編輯文件中的資源('.text'之外),那麼「函數調用的位置」實際上不是問題 - 因爲調用操作數是帶符號整數,相對於它們的當前位置 - 只要整個代碼塊一致地移動,他們將仍然在呼叫正確的地方。 – 2010-09-14 13:55:38

2

當然 - 詳細的格式知識以及必須改變的內容。如果您想知道爲什麼某些編輯會導致加載失敗,那麼您就錯過了這些知識。

庫旨在由鏈接器編寫以使用鏈接器。它們遵循定義明確的格式,旨在使連接器易於編寫和閱讀。他們不需要像編譯器那樣容忍人類輸入。

很簡單,圖書館不打算由十六進制編輯器修改。可以通過用相同長度的名稱覆蓋它們來更改條目,或者可能在某處放置索引。如果你改變任何東西的長度,你可能會破壞指針和元數據。

你不給任何理由想要這樣做。如果是爲了好玩,那麼它比你想象的要難。如果你還有其他原因,你最好得到源代碼,或者讓一個有源代碼重新命名和重建。

相關問題