中文化ASCII字串的高級技巧

---C語系字串(2)

作者: 梁瑞本   

一、前言

□□當一個需要翻譯的C語系字串前後都沒有足夠的ASCII值為00的字串用來作為增加字串的位置,那麼是否就意味著不能增加該字串的長度呢 ? 當然不會了,不管在VC或者Delphi程式裡,都是會有方法來增加字串長度,在C語系字串中,使用重組資料段

二、使用前提

□□這個方法在一般情況下都是可以使用的,因為大多數C語系字串在資料段裡是集中在一處的,而英文翻譯成中文後,總會有一部分字串翻譯後字節數會比原來英文字節數少。但是由於此方法要修改的地方太多,因此比起上一章來說,會讓人覺得較難。所以建議您在沒有必要的時候不要用這個方法。原因嘛,何必自找麻煩 !

三、操作方法

1、讓我們看一個簡單的重組資料段示例
□□讓我們用UEDIT32開啟一個用VC編寫的程式 (在這裡仍以Recover 4 all為例) ,修改任意一個字串為大家示範一下操作過程。我們看到,在資料段裡有一個C語系字串為「File(s) of the same name already esist in」 (圖1) ,

現在我們要在這個字串中增加「這是一個重組資料段的例子」共24個字串 (每個中文算兩個字串) ,在這裡,字串前後都沒有多餘的00用來作為增加字串的空間,那麼應如何做呢 ? 讓我們先記下這個要修改的字串首字串在檔案中的偏移值 (最後把可能修改的字串的首字偏移都記下來) ,這可以把游標移到首字串上,然後在UEDI32的任務欄就可以看到。該值為「323468」,現在我們瀏覽一下字串的前後,看一下離這個字串最近的多餘00在那裡 (註: 只限於資料段) 。我們可以看到向下方向的第一個字串,由於中文化後,在字串後面留下很多空餘的00 (共有44字00) ,足夠我們增加24個字串了,那我們試試利用這些多餘的00來增加字串。我們記下字串「不能恢復目錄,請選擇目錄裡面的檔案。」的首字串偏移「323512」 (因為我們需要修改這個字串的位置) ,然後使用移動字串的方法來把「不能恢復目錄,請選擇目錄裡面的檔案」移到第二個字串最近的地方 (字串與字串之間至少要有兩個值為00的字串隔開) (圖2) 。

現在看一下,是不是在需要增加字串的字串後面有了足夠的00來增加字串了呢 ? 不過這樣直接修改儲存是不行的,因為我們已經改變了字串「不能恢復目錄,請選擇目錄裡面的檔案。」的首字串偏移了,這個字串移動前的首字偏移為「323512」,而移動後的首字串偏移變成了「323554」了。所以還需要改正這個字串的調用偏移代碼,以使其能調用正確的字串 (在每移動一個字串就改正該字串的調用偏移代碼,並儲存執行測試一次,以保正當前的修改是正確的,不然的話就恢復備份檔案,重新修改) ,我們首先要改正調用「不能恢復目錄,請選擇目錄裡面的檔案」這個字串的調用偏移代碼。執行代碼轉換器,用它來計算調用偏移代碼。首先在十進制輸入框中輸入這個字串移動前的首字串偏移「323512」,在調用代碼框就會計算出調用偏移代碼為「B8EF4400」,再在十進制輸入框中輸入這個字串移動後的首字串偏移「323554」,代碼轉換器計算出的調用偏移代碼為「E2EF4400」。知道了調用偏移代碼,按下CTRL+F調用UEDIT32的尋找對話框,以十六進制方法尋找字串移動前的調用偏移代碼「B8EF4400」,尋找方向設為「向上」。在這個程式中一共會找到兩處 (一般程式只找到一處) ,我們把這兩處的調用偏移代碼「B8EF4400」均修改為字串移動字串後的調用偏移代碼「E2EF4400」 (圖3、圖4) 。

     

            

保存後執行程式,測試一下是否執行正確 (要顯示出該提示框,沒有提示地址出錯才算正確) ,沒有問題了,那麼我們就可以增加「這是一個重組資料段的例子」共24個字串 (圖5) ,

修改完後保存檔案,執行程式,在保存檔案時,目標目錄裡有同名檔案時就會出現對話框,可以看到,在對話框中出現了增加的字串「這是一個重組資料段的例子」 (圖6)

四、問題綜述

□□上面是一個典型的資料段重組的例子,它是透過挪移字串取得足夠的位置來增加字串,這在一個字串周圍都沒有00,而下面或上面的字串有中文化時空餘出來的00的時候是非實有用的,我們也可舉一反三,透過挪移更多的字串來取得更多的位置,增加更多的字串。例如挪移兩個,挪移三個....更多,重點是能夠正確修改調用挪移過的字串的調用偏移代碼以及是在資料段內挪移。如果能正確修改,您甚至可以把正個資料段重組。
□□不過有時候會有特殊的情況出現,比如有的程式的基地址不是400000H,這樣用代碼轉換器就不能正確計算出調用偏移代碼了,不過由於實際上需要增加字串的字串不多,基地址特殊的程式很少,所以這種情況是很少出現的。當您用代碼轉換器計算出來的調用偏移代碼沒有找到,那麼您就要考慮一下這軟體的基地址是不是特殊的,如果您不能解決的話,可以聯繫<漢化新世紀>來幫您試一試,或者不增加字串。
□□至於如何知道資料段的大小和位置,一般情況下,您只需在字串集中的地方用挪移就沒有此問題了,當您確實需要知道的時候,也可以用Exescop來取得程式的資料段地址。具體的使用請看說明書或以後我寫一篇專門介紹一下。

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



回教學