中文化ASCII字串的高級技巧

---關於ASCII字串

作者: 梁瑞本

 

一、ASCII字串的定義和簡介

□ASCII字串--在中文化界裡,把在一個程式中不能使用資源方式來擷取的,但是在執行時會顯示出來的提示訊息稱為ASCII字串(一般稱為ASCII碼)。在中文化軟體過程中,ASCII字串的中文化一直是最麻煩和最容易出錯的地方,這是由於ASCII字串一般都分佈在程式中的代碼段或資料段裡,不屬於資源部分,不能使用標準的資源擷取工具擷取出來。由於程式執行代碼也在代碼段裡,並且字串往往並不是集中固定在某一個地方,所以很難分辨是否為需要翻譯的字串。
□ASCII字串一般劃分為
C語系字串和Pascal語系字串:
□1、C語系字串指的是在字串前後都有一個ASCII碼為「00」的字串來與其它代碼區分開來(圖1) ,

如: 00 69 73 6B 2E 00 (disk) 。C語系字串主要出現在程式的資料段部分。一般用C語系編寫的程式 (註: 典型的是用VC++來編寫的程式) 最多C語系字串。由於C語字串在資料段裡往往會集中一處,所以尋找起來比較方便。
□2、Pascal語系字串只有用Pascal語系來編寫的程式才有 (註:
Delphi就是使用Object Pascal語系) 。是指字串後面不但有至少一個ASCII值為「00」的字串分開,而且在字串第一個字串前三個字串都是00,在前第四個字串是該字串的長度標識符,前第五、六、七,八個字串是ASCII碼值為「FF」的字串,如: FF FF FF FF 02 00 00 00 C4 E3 (圖2) 。

有這麼多的特點,判斷是否為ASCII字串比起C語系字串容易多了,不過由於Pascal語字串分佈在整個代碼段裡,所以尋找起來就比較難了。

二、中文化時遇到的問題

□□由於ASCII字串在代碼段或資料段中,所以中文化ASCII字串有其的特殊性:
□□
、要保證程式的執行,就不能增加程式檔案的大小,也就是不能直接增加ASCII字串的長度,否則程式就會出錯而不能正常執行。
□□
、難以判斷是否為可翻譯或需要翻譯的字串。
□□鑒於ASCII字串的特殊性,所以目前中文化ASCII字串時,絕大多數都是使用十六進制編輯器來手動修改,不但中文化需要的時間長,並且很容易出錯,一個字--
!

三、ASCII字串擷取工具的介紹和分析

□□難道就沒有一個程式可以用來自動擷取ASCII碼嗎?當然有了,但是目前中文化界的所有ASCII碼擷取工具都是基於一種擷取方法,使用的判斷條件大都是:字串全是字母或數字,字串前後都有值為00的字串,字串要有一定的長度,高級一點的擷取工具會設定不擷取包含某些字串的字串(這樣可以除去一部份不需要翻譯的字串,如WIN32API函數,但有時反而不擷取不到應該擷取的ASCII字串),更高級的擷取工具可以判斷字串是否為英文單詞,並且可以設定要擷取的字串中包含英文單詞的數量,擷取的範圍固定在代碼段和資料段裡 (這樣擷取出來的字串相對準確,可以除去WIN32API函數以及一些代碼。是所有判斷方法中準確性最高的一種,但是編寫程式的難度大,擷取速度慢,因為要有一個英文庫,所以此類的擷取工具很少) 。在擷取時,如果滿足所有擷取條件的字串,就擷取出來。雖然這樣,但結果還是只有很少的中文化高手使用,原因是擷取效果還是差強人意。以及最重要的是不能增加字串長度。

三、如何增加ASCII字串的長度

□□要是按修改資源的方法來增加字串長度是不行的,因為那樣雖然增加了字串的長度,但是檔案長度也增加了,也就是代碼或資料的位置改變了。那麼,程式執行時就會產手錯誤,而使中文化告敗。可見,增加字串的長度,是首先要保證程式可以正常執行,所以不修改程式的長度,而是修在程式內部利用一些空餘的位置來放罷新增的字串,由於C語系字串和Pascal語系字串不同,所以把增加字串的技巧分為四章,第一章寫的一般情況下增加C語系字串的長度,第二章是寫在比較特殊的情況下使用的技巧,第三章是增加Pascal語系字串的長度的技巧,第四章則是在比較特殊的情況下使用的方法,在看完四章後,相信您中文化軟體時,對ASCII字串一定能更完美地中文化,而不是以前的「是」或「否」了。

三、要瞭解的知識

□□在這裡,我將介紹一下增加ASCII字串長度的主要原理,以及將使用一個輔助計算的小工具: 代碼轉達換器。在WIN32程式中,顯示一個提示訊息都是透過調用API來完成的,調用的時候,會先把字串在記憶體中的偏移地址移到一個暫存器中,然後調用API函數,而API函數根據偏移地址找到字串在記憶體中的位置。我們在調試一個程式時就可看到 (圖3) ,

這是用在調試DELPHI程式時的一個函數MessageDlg,由上面我們可以看到,字串在記憶體中的地址是固定的,其地址在編譯時就已經以代碼的形式存放到檔案中,那麼我們可不可以透過修改這個偏移代碼來使其顯示另一個字串呢 ? 事實證明是可以的,這就是中文化ASCII字串的出路了,我們可以透過修改它來使我們可以自由地增加字串長度,而又可以使程式可以正常執行。
□□由於程式在載入時有一個基地址,程式載入時,是在基地址開始加載的,所以載入後字串在記憶體的位置與在檔案中的位置不同,我們可以表示為: 字串在記憶體中的地址=字串在檔案中的偏移+基地址。可見,我們只需要知道基地址就可以計算出調用偏移代碼 (註: 意思是程式調用字串時的偏移代碼) 了。但是基地址是不是固定的,數值是多少呢 ? 透過查看了數十個軟體,基地址並不是固定的,使用VC或DELPHI編譯的程式各有一個比較固定的基地址,這是由編譯器來確定的,VC的基地址是400000H,而DELPHI則是400C00H,現在我們只需要把字串在記憶體中的偏移加上基地址就可以知道調用偏移代碼了,但是由上圖可以看出,這與在檔案中的代碼並不同,如在記憶體中的地址為「00442F00」,則在程式中用代碼「002F4400」表示,這是把記憶體地址經過位移後的代碼,這就要用代碼轉換器來計算了。

五、關於代碼轉換器

□□代碼轉換器就是為了便於在調用偏移代碼和字串偏移之間轉換之用 (圖4) ,只要把字串在檔案中的偏移 (十進制在十進制輸入框中輸入,十六進制在十六進制輸入框中輸入) 輸入到代碼轉換器中,代碼轉換器就可以在調用代碼框顯示出調用偏移代碼,

您也可以把調用偏移代碼在調用代碼輸入框中輸入,這樣就會在十進制和十六進制輸入框裡分別計算出字串在檔案中的偏移,DELPHI程式選擇框是由於VC和DELPHI的基地址不同,計算的基數也就不同,所以如果您計算的是DELPHI程式,就選取這個選擇,否則就不用理了。十進制輸入框與十六進制輸入框純是數制轉換,只有調用代碼輸入框是不同的數值,在各個輸入框按下Enter就會自動清除各個輸入框的數字,可以進行新的計算。該軟體可到漢化新世紀下載

下一章:中文化ASCII字串的高級技巧---C語系字串(1)



回教學