·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 非标汉化 >> 調整ASCII 字串的長度    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

調整ASCII 字串的長度

作者: 六手修罗 来源:修羅易經 时间:2003-07-29 点击:10602

調整ASCII 字串的長度
(台湾*六手修罗)

在修改 ASCII 字串時,如果要置換上去的文字比較短時,通常都是直接置換上去,並將多餘的字元,以 ASCII 字元 0x0 補上就可以了。這是因為大部份程式及函式操作 ASCII 字串時,都預期它是一個 ASCIIZ 字串,而 ASCIIZ 字串是以 0x0 做為字串終結字元,所以原始字串長度較長,通常並不會有影響。(也有例外情形 )

如果要換上的字串較長,祇要還有空格,並且填上新的字串後,還能保持與下個字串間至少有一個 0x0 字元做間隔,就不會問題。

比較麻煩的是如果要換上的字串太長時,就會面臨欄位不足( 通常兩字串間最大間矩祇有 4 位元組 ),字串無法置入的窘境了。一般遇到這種情形,都會縮減文字,使其能夠置入。但有時太短的文字,並無法完整表達意思,那就是非常頭大的問題了。

這個問題其實並非無解,不過很麻煩,因為私雖然找出方法,可是迄今尚未找到任何合用的工具,如果要使用,祇好採用16進位編輯器,土法鍊鋼手工打造了。

一般說來在程式中的字串,有兩種記錄類型。會使用那一種並不一定,得視程式如何撰寫而定。

第一種是長度字串表 ( 不是指資源中的字串表 ),這一類的字串是一個接一個的排在程式中,而每個字串的開頭,都會有一個前置欄位,用來記錄字串的長度。其結構看起來就如同下圖:

字串 1 長度 字串 1 實際內容 字串 2 長度 字串 2 實際內容
字串 3 長度 字串 3 實際內容 字串 4 長度 字串 4 實際內容

通常這類字串當您要增加長度時,祇要維持整個結構的完整就行了,例如要將 "字串 2" 增加 4 個位元,祇要在 "字串 2 實際內容" 與 "字串 3 長度" 間插入 4 個位元組,並將 "字串 2 長度" 那一欄的值加 4。最後為保持 PE 結構的完整,您要在整個表的後面不使用的部份,刪除去多出的 4 個位元組。這樣就大功告成了。同理,如果您想將之調短,祇要逆向操作即可。

第二種則是 RVA 字串表 ( 這個詞是為區分硬掰的,事實上沒有這種東西,真實的內容通常是程式的變數表或常數表,所以實際情形可能會有變數或常數混在表中 ),其內容可分為兩個部份。RVA 表及字串表。

RVA表 ( 固定長度,每一欄 4 位元組 )

字串 1 RVA 字串 2 RVA 字串 3 RVA 字串 4 RVA

字串表 ( 長度不定,每一欄固定 4 的倍數 )

字串 1 內容 字串 2 內容 字串 3 內容 字串 4 內容

由於這兩個部份,並沒有規定一定要放在一起 (不過通常都放在一起或距離很近),使得這個工作更形困難。有時您可以肉眼判斷出 RVA 表,但有時您得靠正確的計算來找出它。現在以修改 "字串 2 內容" 為例。

首先您當然是得找到字串在檔案中的位置,接著您要將檔案位置轉換成 RVA 。要轉換它您得從檔案的區段表中,查出目前檔案位置是處於那個區段之中,接著可以依下列公式算出字串的 RVA。( 有部份檔案的 RVA 值會剛好等於檔案位置,這跟區段表中 RVA 值及檔案位置是否相同有關,而並非必然相等,其間關係可由下列公式看出。 )

RVA = 區段 RVA + ( 目前檔案位置 - 區段檔案位置 )

有了 RVA 值,自然您就可以利用搜尋的方法,來找出 RVA 表了。要驗證您找到的地方對不對的方法也很簡單,"字串 1 內容" 及 "字串 2 內容" 檔案位置差多少,"字串 1 RVA" 及 "字串 2 RVA" 的值就該差多少,其餘類推。( 特別注意,PC 中大部份值的存放是倒置的,包括 RVA 值,也就是低位元組在前,高位元組在後。)

現在您可以在 "字串 2 內容" 及 "字串 3 內容" 間,插入您需要的位元組數。但不是任何數目都可以,您必需將其調整為 4 的倍數,多出的字元則填以 0x0 字元。這有兩個規則您必須遵守,1. 任兩個字串之間至少必須有一個 0x0 字元做為區隔。2. 任一字串開始的檔案位置, 必須是 4 的倍數。所以若字串位元組數剛好是 4 的倍數,您得用四個 0x0 字元做區隔。

由於從 "字串 3 內容" 開始的那些欄位,其檔案位置全被您插入的位元組推擠到後面去了,所以 RVA 表中從 "字串 3 RVA" 開始及之後的欄位,值當然也全都不對了,所以全得改寫成新值才行。新 RVA = 舊 RVA + 插入位元組數。

最後同樣地為維持 PE 結構的完整,您要在整個表的後面不使用的部份,刪除去多的新增的位元組數目。如果您打算縮短字串一樣可以逆向操作。而如果有的您打算調長,有的打算調短,自然也可以擷長補短,祇要維持兩個表都正確,及兩個表之後的資料在檔案中的位置不變就可以了。

這些操作稍有不慎,就會造成檔案格式的錯誤,所以在編輯之前最好先行備份。

作者主页

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): ASCII 非标 长度

·上一篇: 关于汉化 .dot文件的一点体会 ·下一篇: 使用 Language Localizator 修改 DFM 文件内置的图象文件

· 版权申明: 本文引自《修羅易經》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《修羅易經》[ 作者: 六手修罗],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号