Make your own free website on Tripod.com

ASCII資源的中文化(3)   

偉乾

 

(二) 、ASCII中文化後字串變長的處理

    在一般情況下,英文翻譯成中文後的字節數會比原來英文的字節數少,也就不存在不夠位置回寫的問題,但是當英文為“yes,add,new”等等,翻譯後字節變大,不夠位置來回寫,只能譯成“是,加,新”或不翻譯。
    在明白的文章中講解的字串都是RVA ASCII字串,也只有RVA ASCII字串才需要透過調整偏移代碼來增加字串的長度。對於長度ASCII字串,我們只要按照有關字串的格式,取長補短,調整字串之間的位置,就可以達到增加字串長度的目的。
    (一) 、長度 ASCII字串:

    1. 結構字串組:
    我們只要保証字串間有且只能有一個00間隔,保持整個字串組的完整性。字串之間互相調整位置,達到增加字串長度的目的。

    2. 陣列字串組:
    由於這種字串間沒有間隔符,是透過字串標示符定義字串的結束,所以我們調整字串時,需要同時修改字串標示符。

    3. 獨立字串:
    這類字串我們一般出現在VB開發的程式,我們調整字串時,保持字串的格式,同時修改字串標示符。

   (二) 、RVA ASCII字串:
   
RVA字串分為 RVA字串組和字串組兩部分,RVA字串記錄了字串的相對虛擬地址 (就是在記憶體中的地址) 。我們可以透過修改RVA字串,調整字串的開始位置,取長補短,解決字串長度不足的問題。字串的相對虛擬地址可以從以下的公式得出:
               
字串的相對虛擬地址=字串在檔案中的偏移+基址偏移
                基址偏移=imagebase(基地址)+區段RVA-區段offset
    對於大多數的使用VC或DELPHI編譯的程式來說,基址偏移是固定的,VC的基址偏移是400000H,而DELPHI則是400C00H。不過也有例外,我們就要從檔案的區段表中,查出當前字串的位置(在檔案中的偏移)是處在哪個區段,然後計算出字串的基址偏移。
    許多工具都可以顯示檔案的基地址、區段、區段RVA、區段偏移、區段大小等訊息,如exescope、W32dasm、Prucdump等等。




Disassembly of File: winimp32.exe
Code Offset = 00000400, Code Size = 0003BE00
Data Offset = 0003DE00, Data Size = 00012000

Number of Objects = 0006 (dec), Imagebase = 00400000h

   Object01: AUTO       RVA: 00001000         Offset: 00000400      Size: 0003BE00           Flags: 60000020
   Object02: .idata     RVA: 0003D000         Offset: 0003C200      Size: 00001C00           Flags: C0000040
   Object03: DGROUP     RVA: 0003F000         Offset: 0003DE00      Size: 00012000           Flags: C0000040
   Object04: .bss       RVA: 00051000         Offset: 00000000      Size: 00005E00           Flags: C0000080
   Object05: .reloc     RVA: 00057000         Offset: 0004FE00      Size: 00004000           Flags: 42000040
   Object06: .rsrc      RVA: 0005B000         Offset: 00053E00      Size: 0001D600           Flags: 40000040



     我們可以知道,檔案有AUTO .idata DGROUP .bss .reloc .rsrs等區段,區段的開始位置是 (Offset) ,區段的大小是 (Size) ,區段的結束位置是 (Offset+Size)
     我們首先判斷字串的偏移是位於哪個區段,然後利用基址偏移的公式算出基址偏移的值。字串RVA=字串的偏移+基址偏移,RVA字串為 4個字節,數值低位在前、高位在後,反轉過來。然後尋找字串的RVA值,驗証是否字串的RVA,修改。
     在實際操作時,我們使用 RVA轉換器很容易查出字串RVA的值。
   以 WinImp 1.11 中的第二個工具按鈕 Open 為例,這個 Open 在可執行檔案中的偏移為 49EB0h 。首先使用
RVA Converter (RVA 轉換器) 裝入檔案,在Convert offset (轉換偏移量) 選擇 File to RVA (字串偏移轉換為RVA) ,在File (字串偏移) 中輸入字串的偏移量,字串的RVA值可以從RVA欄查到,同時我們還可以知道這個字串所處區段、區段的偏移、大小等訊息。字串RVA值是“44B0B0”反轉過來就是“B0B04400”,然後尋找“B0B04400”。一般同一字串組的RVA都是在一起的,我們可以透過這來判斷找到的地方是否正確。





圖 23



    在最後修改本文時,發現我們中文化人的好朋友梁利鋒開發了類似的工具---偏移量轉換器 (posconv) 0.92 版,增加了支援十進制,做字節翻轉,把結果送到剪貼版等功能,更加好用,強烈推荐 !





圖 24




    1.C 語系字串:
   
我們前面介紹了這種字串以00為字串結束符,與下一字串至少有一個以上的00間隔,字串的長度與字串後面的00字串的總長度是 4的倍數。中文化時,如果字串後面有超過一個以上的00,我們只要保証字串間有一個00間隔,其它的00用來增加字節。
   如果字串後面只有一個00間隔或多出的00不夠增加字節用,我們就需要透過修改字串RVA來增加字串的長度。




 圖 7



     如圖,這裡有兩個字串 (New , Add) 中文化後長度變長。其中字串 Add後面00有5個,我們只要保証至少有一個00與後面的字串間隔。我們中文化為添加,有足夠的位置。字串New後面只有一個00,不夠位置寫入,而後面的字串Open中文化後字串長度不變,字串後面的00有四個。我們只要把字串Open後移一位,就可以滿足字串New的需要。因此我們需要修改字串Open的RVA值,把它加1。
    我們使用 RVA 轉換器 算出字串Open的RVA值為44B0B0,我們需要把44B0B0修改為44B0B1,由於RVA字串為 4個字節,數值低位在前、高位在後,在檔案裡是以B0B04400的數值存在,我們只要查考B0B04400修改為B1B04400,這個檔案中尋找到兩處有B0B04400,我們逐一修改,然後執行程式,就知道那個是真那個是假的RVA值了。
    一般我們修改字串的RVA值,字串都不會移動很遠,我們往後移動字串多少字節,RVA值 就加多少﹔往前移動字串多少字節,RVA值 就減多少。有時候,我們會碰到這樣的情況,在字串附近實在沒有多余的空間增加字串的長度或者有空間但需要移動很多的字串,修改很多字串的RVA值。這個時候,我們可以在檔案的其他空的位置 (都是00的地方) ,覆蓋狀態下,輸入字串,然後使用
RVA 轉換器 根據字串當然的偏移轉換算出 字串當前的RVA值,把當前的RVA值替換原來的RVA值即可。

   2.Pascal語系字串格式相對復雜些,字串後面不但有至少一個ASCII值為“00”的字串分開,而且在字串前第五、六、七,八個字串是ASCII碼值為“FF”的字串,如: FF FF FF FF 02 00 00 00 C4 E3 (圖10) 。除了跟C 語系字串那樣利用多出來的00字串增加字節外,由於字串一般一個接一個聚集在一起,實際上程式只需要有一個FF來作為字串標識,我們保留一個FF來作為下一個字串的標識符,所以實際上我們又可以增加3個字串 (不過這個方法有時會導致程式出問題) 。
     如果還不夠空間增加字節,我們就需要透過修改字串RVA來增加字串的長度,具體方法跟上面相同。不過需要注意的是,必須保持Pascal語系字串的格式,字串的前面4個字串是長度標示符,前面第五個字串是  FF(必須的),第六到八字串也是FF (有時可以不要) 。具體的方法與上面相同,詳細的使用可以參考明白的文章《中文化ASCII字串的高級技巧》




 圖 10


三、後記
  
  
至此,ASCII字串的格式、中文化的處理已經介紹完畢。與其說是寫,不如說是整理。自從年初第一篇ASCII字串的中文化文章《梅花三弄》 (ChinEASE) 發表後,明白、梁利鋒等人也發表了不少關於ASCII字串的中文化文章,使我們的中文化技術更上一層樓。拜讀這些文章,加上平時積累的一些經驗,一直想寫一篇ASCII中文化的文章,嘗試把ASCII字串歸納總結。ASCII資源的中文化的第一稿剛剛寫好,就看看台灣中文化作者六手修羅的文章《調整ASCII字串的長度》。文中的ASCII字串的分類、介紹讓我大開眼界,馬上按照他的分類重頭再寫。由於水平有限,期間向多位中文化人、網友請教,指正了文中不少錯誤的觀點。特別感謝ChinEase提供許多ASCII字串的特例,指正了許多 ASCII格式的錯誤之處。感謝六手修羅給三種長度ASCII字串命名,使小弟的文章有了一點專業的味道^-^。還要向梁利鋒大俠說聲謝謝,由於我對編程一竅不通,為了一些淺顯的常識多次麻煩梁兄,還糾纏不清,讓您受累了。還有......
    修改第二稿時,意外地發現了一個
RVA轉換工具。這個工具應該99年就有了,對於ASCII的格式也早有前人總結過,更開發出工具。除了中文化界本身要團結一致,多做交流合作。更要向編程、破解的高手虛心請教,積極引進技術、工具,才能促進中文化事業的發展 !
    由於我接觸的軟體不多,可能有些 ASCII字串無法按文章的分類入座。如果您中文化時,發現新的ASCII字串格式或有一些心得。請寫出來,和我們大家一起分享。

 

   參考文章:          1.《梅花三弄》  ChinEASE
   參考文章:          2.《中文化ASCII字串的高級技巧》  明白
   參考文章:          3.《基地址引深》  梁利鋒
   參考文章:          4.《調整 ASCII字串的長度》  六手修羅

 

----------2000.8.21--------
----------2000.8.30第三次修正 --------

 

 

--* 如果您發現連結錯誤或其它問題,請寫信通知我們
--* 如果您連結本站本地軟體,請註明來自漢化新世紀,謝謝您的支持 !



回教學