我試圖編輯十六進制編輯器中的庫,插入模式。重點是重新命名其中的一些條目。如果我使用「Otherwrite」模式,一切正常,但每次嘗試在「插入」模式下向字符串末尾添加幾個符號時,庫無法加載。我在這裏錯過的任何東西?在十六進制編輯器中編輯庫,同時保持其完整性
回答
是的,你錯過了很多。一個庫遵循PE/COFF格式,這在整個文件中的指針非常繁重。 (例如,朝文件的開頭是一個表格,指向文件中每個部分的位置)。
如果您正在編輯資源,如果您確定修改任何指向修改後的指針和大小的任何指針和大小,就可以在不破壞內容的情況下執行此操作,但我懷疑這很容易。在編輯.text段(即代碼)的情況下,我懷疑你會完成它,因爲函數調用和跳轉的操作數是它們在代碼中的位置的相對位置 - 您需要更新整個代碼來解釋編輯。
解決此問題的一種技術是「代碼洞穴」,您可以使用顯式JMP指令將一段現有代碼替換爲某個空白位置(您可以在運行時執行此操作,您可以在其中創建新的內存) - 您可以在其中定義一些可以是任意長度的新代碼 - 然後您可以顯式地將JMP返回到您調用的位置(對於JMP操作碼+操作數,則爲+5字節)。
你改變它們的名字與舊名稱的長度相同嗎?如果不是,那麼所有的偏移量都會被移位。並且做任何函數互相調用?這可能是另一個問題。獲得源代碼會更容易(如果項目的網站不是內部的,或者來自供應商,如果它已關閉,則從項目的網站獲取)並更改它們,然後重新編譯它。無論如何,我很好奇你爲什麼要改名字。
DLL是一個複雜的二進制格式(即編譯代碼)。編譯過程將命名函數調用轉換爲硬連接引用,以指向文件中的特定位置(「偏移量」)。因此,如果將字符插入文件的中間,那麼在該點之後的偏移將不再與它們引用的位置實際上匹配,這意味着庫中的函數調用將運行錯誤的代碼(如果它們設法運行任何東西完全)。
基本上,底線是你正在做的事情總是打破東西。如果你不走運,它甚至可能破壞真的,並造成嚴重的損害。
如果您所做的只是編輯文件中的資源('.text'之外),那麼「函數調用的位置」實際上不是問題 - 因爲調用操作數是帶符號整數,相對於它們的當前位置 - 只要整個代碼塊一致地移動,他們將仍然在呼叫正確的地方。 – 2010-09-14 13:55:38
當然 - 詳細的格式知識以及必須改變的內容。如果您想知道爲什麼某些編輯會導致加載失敗,那麼您就錯過了這些知識。
庫旨在由鏈接器編寫以使用鏈接器。它們遵循定義明確的格式,旨在使連接器易於編寫和閱讀。他們不需要像編譯器那樣容忍人類輸入。
很簡單,圖書館不打算由十六進制編輯器修改。可以通過用相同長度的名稱覆蓋它們來更改條目,或者可能在某處放置索引。如果你改變任何東西的長度,你可能會破壞指針和元數據。
你不給任何理由想要這樣做。如果是爲了好玩,那麼它比你想象的要難。如果你還有其他原因,你最好得到源代碼,或者讓一個有源代碼重新命名和重建。
- 1. .NET中的十六進制編輯
- 2. 在MFC中編寫一個十六進制編輯器
- 3. 在十六進制編輯器中編寫註釋
- 4. 十六進制編輯與C++
- 5. 十六進制彙編編輯器命令入門?
- 6. 如何製作固定的十六進制編輯器?
- 7. 我可以在Visual Studio中十六進制編輯文件嗎?
- 8. 蟒蛇十六進制編輯器二元變化
- 9. 使用十六進制編輯器打開.dat文件
- 10. 十六進制編輯器如何快速顯示數據?
- 11. 爲C#推薦十六進制編輯器類?
- 12. 奇怪的記事本++十六進制編輯器插件
- 13. 使用十六進制數字在新十六進制編輯器中打開文件
- 14. 使用十六進制編輯器修改庫中的env變量名稱?
- 15. 我如何從十六進制編輯器保護我的程序?
- 16. DataGridView的細胞編輯問題與十進制/十六進制格式
- 17. 哪個腳本編輯器可以編碼十六進制顏色值?
- 18. 祝福十六進制編輯器 - 比較2個二進制文件
- 19. 註冊表編輯:如何計算DWord十六進制值
- 20. 十六進制編輯dll以更改依賴項名稱?
- 21. 如何以十六進制編輯.dll文件
- 22. Python - 如何編輯字節的十六進制文件字節
- 23. UCS2十六進制編碼
- 24. 在vim編輯器中上下導航時保持同一列
- 25. PIC的十六進制反編譯器
- 26. 十進制編輯問題ASP.NET MVC
- 27. 十六進制斌邏輯運算後
- 28. 尋找一個簡單的編輯器,允許我直觀地編輯十六進制顏色值
- 29. Froala編輯器在粘貼代碼時保持縮進
- 30. 如何使用C編輯二進制文件的十六進制值#
該庫是我的,但我失去了它的源代碼。長度的變化,如何使它與這種轉變一起工作? – SharpAffair 2010-09-14 13:38:03