首页  编辑  

關於 Resource

Tags: /超级猛料/Resource.资源和使用/   Date Created:
一般中文化之時,最常應用的方法,無非編輯 Resource 了,當 Resource 無法編輯時,不是得被迫採用 ASCII 碼編輯,就是得放棄。故好好認識 Resource ,就相形重要了。
在此並不打算將 Resource 整個肢解,因為事實上那並不需要,市面上有很多編修 Resource 的工具可用,所以並不用去瞭解整個結構,也能夠編修它,所必須知道是些相關的知識,以便在必要時能夠修正它。
首先您要認識的是,Resource 在程式中記錄的位置,它記錄在 PE 檔的 Optional Header 中的 Resource Table 。這裡記錄了資源表的位址和大小。而這邊記錄的位址,是載入記憶體中的位址偏移值,實際在檔案中的位置,則記錄於區段表中。一旦這兩項資料不正確,您就不能編修它了。
什麼情況下資料會不正確,一是您用的工具弄壞了,另一個常見的原因則是,程式本身有些特殊的處理。像是許多程式本身經過壓縮處理,在執行時才將本身程式及資料解壓縮,如此記錄位址中指向的資料,早已面目全非,自然是不能編輯了。這種情形之下,除了將這層壓縮的動作剝除之外,就別無它法了。這個剝除動作,一般稱之為剝殼,除了壓縮的殼之外,更常見的是含有防止破解作用的。
在澤地萃中,有常用的剝殼工具,可以解較常見的殼,您可以參考看看。
另一個常見無法編輯 Resource 的原因,則是程式根本不使用 Resource ,這類程式通常在 Resource 中,就祇有 Icon 和 Version 兩項而已。這時祇好考慮使用別的方式來中文化它,或是根本放棄了。
部份壓縮過的執行檔,Resource 記錄中也是祇有 Icon 及 Version ,而不是保留了一堆已不正確的項目,如何將之與不使用 Resource 者分辨呢?除了部份常見的壓縮格式,會在 Section name 留下記號之外,較可靠的方式,則是在檔案中搜尋您要翻譯的字串 ( 例如功能表項目 ),ASCII 及 Unicode 兩種字串都要搜尋,當都找不到時,則應該是壓縮過的了。
部份的 Resource 編修工具,使用 Section name 來解讀 Resource,編修工具會尋找 ".rsrc" 的 Section name,一旦找不到時將無法編修,Section 名稱錯了,其實並不影響程式執行,因為 Loader 並不管它叫什麼名稱,祇要能載到正確位址,自然能從 Optional Header 中找到所需的資料。( 所以有部份 Resource 編輯工具還是能編輯它 )
所以要想讓不能編修的工具,也能編輯被改了區段名稱的程式,將名稱改回 ".rsrc" 即可。但要如何知道是那個 Section 呢?一個最簡單的方法,自然是從 Optional Header 中記錄的 Resource Table 來比對了,它們是對應的。
如果您找不到與 Resource Table 位址對應的區段,則表示資源區段已和其它資料混合在一起了。通常這種情形下,資源的資料已不可再重定位,也就是您不能再使用資源編輯的方式編輯它,不然可能會造成檔案的毀損。
有時即使資源合乎常規的一個區段,您也能正常編輯它,但存檔後檔案卻會毀損,則是有某些不可重定位的項目,位於 Resource Table 起點之後。除非使用特殊的方式,先修正這個問題,不然您編輯時就不能更動資源的大小,否則檔案當然會損毀的。
Resource 的種類扣除自定的類型,標準的類型倒是不多,中文化時會動用到的則更少。除了將字串換掉,編輯對話框,您還可以換掉程式的圖示,及程式的版本說明資訊。某些時候,還可以換掉程式中使用的大部份圖形。這些祇要程式使用標準的資源類型,都可以輕易辦到。
標準資源的匯出及修改當然不會有什麼問題,像圖示及點陣圖,都有很多現成可用的工具。但部份工具,在匯出非標準資源時,通常採用資源檔格式 (.res),在編修時較為麻煩,因為您還得考慮資源檔格式的正確性。如果您用的工具支援二進位格式的話,就採用二進位格式吧!那樣可以少掉很多的麻煩。