再談一談軟體中文化後字型的修改 (Dephi篇)
作者: 飛鷹 (flithawk)
大家好 ! 自我介紹一下,我叫飛鷹,從事中文化工作已經有一年多的時間了,如今是漢化新世紀的成員之一,今天我想與大家共同探討一下軟體中文化後字型的修改。有人可能會說: 軟體中文化後用 eXescope 這類軟體就可以很輕鬆的改變字型了,還需要再探討嗎 ? 其實,您錯了,不是每一個軟體都可以用這種方法來修改字型,我在中文化當中就發現很多軟體中文化後,字型也全部改成為了我們希望的「新細明體,9號」,但執行軟體一看,還是有些地方的字型非常難看,遇到這種情況我們就需要「強制定義字型」了。現在,我就以一個實例具體講解一下修改這類軟體字型的方法。
參考文獻:
《Delphi
字型修改一例》 作者: 梁利鋒
《Delphi
字號修改之二》 作者: 梁利鋒
《中文化 WinImp 的一點心得——實戰
ASCII 字串後期處理》 作者: Ronnier
《還我廬山真面目——WinZip
Self-Extractor 字型的修改》 作者: Ronnier&飛鷹
改法詳解
實例軟體: PE Explorer 1.40
測試工具: FI 2.5
修改工具: W32Dasm
8.94 中文化版,UltraEdit32 8.20 中文化版(簡稱UE),點睛偏移量轉換器 0.94B。
修改方法: 首先,用 FI 2.5
檢測可知 PE Explorer 1.40 是用Dephi編寫的,我假設您現在已經把該軟體中的所有 RCData
資源與ASCII資源都中文化完了,執行軟體後出現如圖一所示的界面。 (圖一)
從圖中可以看出,用紅色框起來的選單欄中的字型非常難看,下面我們就來修改一下。用 UltraEdit32
開啟該軟體,尋找ASCII碼「MS Sans
Serif」,每找到一處就把該處的修改為「System」,後執行軟體看一看有問題處的字型是不是變大了,如果改變,恭喜您 ! 找對突破口了;如果沒變,把該處改回原樣,繼續往下找,直到找對為止。對於該軟體,當我把尋找到的第二處地方改為「System」時,執行軟體一看,界面選單的字型變了,如圖二所示。
(圖二)
下面,我們先把該處改為「新細明體」,不足的部分用00填充,改變字串長度計數器的值為04,並記下該處的偏移地址,此處是f8137H,如圖三所示 (注意: 記偏移地址的值時游標一定要壓在整個字串的前一個字節上) 。
(圖三)
現在我們要把該偏移地址轉換為RVA值,開啟點睛偏移量轉換器軟體,按這樣操作: 先點擊「...」瀏覽按鈕,選擇需要載入的檔案-->在「實偏移」純文字框中輸入字串的偏移地址 (即f8137) -->
之後,RVA值可以從「虛偏移」純文字框中看到 (這裡顯示為4F9337) ,如圖四所示。
(圖四)
後用 W32Dasm
反編譯該軟體,尋找「4F9337」,可以找到三處內容相同的地方,如果您發現找到的地方向上看時有「push
00000009」這樣的語句,就說明它已經是9號字了,無需再改;直到您找到的地方向上看時有「push 00000048」、「push
00000008」 (說明它是8號字) 和「* Reference To: kernel32.MulDiv,
Ord:0000h」這樣的語句,才能算是找對地方,如沒有上述這些特徵的話,一律表示字型大小的設定肯定不是該處。在該軟體中,找到設定字型大小的反編譯代碼如下:
* Referenced by a CALL at Address:
|:0041D9F7
|
:0041D81C 53 push ebx
:0041D81D 56 push esi
:0041D81E 57
push edi
:0041D81F 6A48 push
00000048
:0041D821 A110D64F00 mov eax, dword ptr
[004FD610]
:0041D826 50 push eax
:0041D827 6A08
push 00000008
* Reference To: kernel32.MulDiv,
Ord:0000h
|
:0041D829 E86E7FFEFF Call 0040579C
:0041D82E
F7D8 neg eax
:0041D830 A330934F00 mov dword ptr [004F9330],
eax
:0041D835 A160C34F00 mov eax, dword ptr [004FC360]
:0041D83A
80780800 cmp byte ptr [eax+08], 00
:0041D83E 746F je
0041D8AF
:0041D840 E893FFFFFF call 0041D7D8
:0041D845 8BD8 mov ebx,
eax
:0041D847 8BC3 mov eax, ebx
:0041D849 2C80 sub al,
80
:0041D84B 7406 je 0041D853
:0041D84D 2C08 sub al, 08
:0041D84F
7431 je 0041D882
:0041D851 EB5C jmp 0041D8AF
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:0041D84B(C)
|
* Possible StringData Ref from Code Obj ->"俵欣 亞僑僔舛僋Times New
RomanU嬮3繳h操A"
|
:0041D853 BEB4D84100 mov esi, 0041D8B4
:0041D858 BF37934F00 mov edi, 004F9337
注意: 上面用藍色字標出的位置是尋找到的地方,從這裡向上看就可以找到軟體設定字型大小的位置;上面用紅色字標出的位置,這就是Dephi程式設定字型大小的特徵,切記 ! ! ! 接下來,我們在
UltraEdit32
中尋找「6A48A110D64F00506A08」 (注意: 這裡不是尋找ASCII碼,所以,軟體中「尋找ASCII」選項不必使用,否則,無法找到需要的內容。) ,找到後改為「6A48A110D64F00506A09」,再執行軟體一看,界面選單的字型正常了,是我們希望看到的「新細明體,9號」字了,如圖五所示。
(圖五)
當我發佈了該軟體中文化版後,我們漢化新世紀的監督執行官 偉
來信說,在他的系統中執行該中文化版,在「資源編輯器」選項(CTRL+R)裡的各個項目查看時,都會出現亂碼的現象,如圖六所示,但這個問題在我的系統中沒有發現,我中文化時只是覺得該處的字型很奇怪,但還看得過去,我就沒有修改了,沒想到竟會出現這種問題,這次又得重新返工了,真是慘呀 !
(圖六)
按照上面講過的尋找方法:
1、尋找字型名稱 (這裡為「Courier New」,共可以找到六處,經過測試發現這六處都需要修改,才能大體上解決該選項中出現亂碼的問題,這裡我只以「版本」項目中的亂碼問題為例,其它項目中的亂碼問題的解決方法完全一樣,這裡不再講述。) ;
2、每找到一處修改為「System」,再執行軟體看效果 (這裡當我改了找到的第二處後,再執行軟體一看,「版本」項目中亂碼問題沒有了,字型也變大了,說明找對突破口了。) ,軟體執行後沒有變化就把此處改回原樣,繼續往下尋找、修改;
為了讓大家加強記憶,我把上面這兩個步驟取個名字,就叫「尋找排除」法您 !
3、把該處的字型名稱改為「新細明體」,並記住此處的偏移地址的值 (這裡為b9e57H) ;
4、調用點睛偏移量轉換器軟體,求出RVA值 (這裡為4BAA57H) ;
5、用 W32Dasm 反編譯軟體,尋找已知的RVA值 (這裡應該尋找4BAA57) ,找對地方後在UE中修改。
在這裡很奇怪,沒有找到4BAA57,哪麼我就減少一個數字再尋找一次看一看,這裡我再尋找4BAA5,共找到九處,其中有一處最為可疑,反編譯代碼如下所示:
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:004BA9C7(C)
|
:004BA9ED 8B03 mov eax, dword ptr
[ebx]
:004BA9EF 8B8048010000 mov eax, dword ptr [eax+00000148]
* Possible StringData Ref from Code Obj
->"新細明體"
|
:004BA9F5 BA58AA4B00 mov edx,
004BAA58
:004BA9FA E8FDEAF8FF call 004494FC
:004BA9FF 8B03
mov eax, dword ptr [ebx]
:004BAA01 8B8048010000 mov eax, dword ptr
[eax+00000148]
:004BAA07 B201 mov dl, 01
:004BAA09 E832EAF8FF call
00449440
:004BAA0E 8B03 mov eax, dword ptr [ebx]
:004BAA10
8B8048010000 mov eax, dword ptr [eax+00000148]
:004BAA16 BA08000080 mov
edx, 80000008
:004BAA1B E870EAF8FF call 00449490
:004BAA20 8B03 mov
eax, dword ptr [ebx]
:004BAA22 8B8048010000 mov eax, dword ptr
[eax+00000148]
:004BAA28 8A1564AA4B00 mov dl, byte ptr
[004BAA64]
:004BAA2E E889EBF8FF call 004495BC
:004BAA33 8B03 mov
eax, dword ptr [ebx]
:004BAA35 8B8048010000 mov eax, dword ptr
[eax+00000148]
:004BAA3B BA08000000 mov edx,
00000008
:004BAA40 E8EBEBF8FF call 00449630
:004BAA45 8B03
mov eax, dword ptr [ebx]
:004BAA47 B201 mov dl, 01
:004BAA49
E87ACEF7FF call 004378C8
:004BAA4E 5B pop ebx
:004BAA4F C3 ret
其中,用綠色字表示的位置不就是我們剛才修改的字型名稱嗎,真是太通俗易懂了 ! 用藍色字表示的位置是尋找到的地方,也是壓入字型名稱的地方;紅色字表示的位置就是字型的大小,看到「00000008」這種的句樣,就應該引起您的高度重視。好了,在UE中尋找BA08000000E8EBEBF8FF,修改為BA09000000E8EBEBF8FF,問題已經解決一大半了 ! 如圖七所示。
(圖七)
從圖七中可以看出,還有部分字型沒有修改,繼續改您 ! 還是以改亂碼處為例好了,我繼續開始講解。老辦法 ! 在UE中尋找字型名稱 (這裡為「Arial」,共可以找到三處,經過測試發現這三處都需要修改,才能完全解決「關於」項目中所有的亂碼及字型大小問題。) ,每找到一處修改為「System」後測試 (這裡當我改了找到的第三處後亂碼消失) ,求出RVA值 (這裡應為4BC4CFH) ,在 W32Dasm 中尋找4BC4CF,還是沒有找到,再尋找4BC4C,共可以找到十三處,其中有四處最為可疑,反編譯代碼如下所示:
尋找到的第一處:
:004BBBE3 A0C4C44B00 mov al, byte ptr
[004BC4C4]
:004BBBE8 50 push eax
:004BBBE9 6800008000 push
00800000
:004BBBEE 6A08 push 00000008
* Possible StringData Ref from Code Obj
->"新細明體"
|
:004BBBF0 68D0C44B00 push
004BC4D0
******************************************************************************************
尋找到的第二處:
:004BBC20 A0C4C44B00 mov al, byte ptr
[004BC4C4]
:004BBC25 50 push eax
:004BBC26 6880000000 push
00000080
:004BBC2B 6A08 push 00000008
* Possible StringData Ref from Code Obj
->"新細明體"
|
:004BBC2D 68D0C44B00 push
004BC4D0
******************************************************************************************
尋找到的第三處:
:004BBC44 A0C4C44B00 mov al, byte ptr
[004BC4C4]
:004BBC49 50 push eax
:004BBC4A 6800008000 push
00800000
:004BBC4F 6A08 push 00000008
* Possible StringData Ref from Code Obj
->"新細明體"
|
:004BBC51 68D0C44B00 push
004BC4D0
******************************************************************************************
尋找到的第四處:
:004BC31C A0C4C44B00 mov al, byte ptr
[004BC4C4]
:004BC321 50 push eax
:004BC322 6808000080 push
80000008
:004BC327 6A08 push 00000008
* Possible StringData Ref from Code Obj
->"新細明體"
|
:004BC329 68D0C44B00 push
004BC4D0
不知道大家注意到了沒有,上面找到的四處地方用紫色字表示出來的位置其實就是要壓入的字型名稱的地址,這裡要壓入的字型名稱的地址相同,說明它們都使用同一字型,唯一不同之點就是它們各自設定各自的字型大小;用藍色字表示的位置是尋找到的符合條件的地方;紅色字表示的位置就是字型的大小;綠色字自然表示的就是字型名稱了。修改方法很簡單,只要把全部找到的地方的6A08改為6A09即可。
該軟體中其它項目字型的修改方法與此大同小異,這裡我就沒有必要繼續講下去了。全部字型修改完成後,效果如圖八所示。
(圖八)
關於文章中我為什麼事先就知道字型名稱呢 ? 我在這裡說明一下方法,只要您用可以抓取DEPHI中ASCII碼的工具 (例如: 點睛字串替換器) ,把抓取出來的ASCII碼進行分析,找出其中所有的字型名稱 (比如: MS Sans Serif、Arial、Courier New等) ,英文軟體中最常見的字型名稱就是「MS Sans Serif」,您可以先找它修改,如果沒有效果,再找其它字型名稱修改,只要您有耐心,一定能修改成功的 !
心得總結
其實修改DEPHI程式的字型,最簡單的方法可以先反編譯需要修改的軟體,後這樣操作:
1、對於決大多數情況,我們可以先用 push 00000048 做為輔助判斷條件來尋找,如果找到,再向下看是否有「00000008」這種句樣存在,如果有,您可以先把該值改大些,例如: 「0000000F」,執行軟體後看有問題地方的字型是否會變的非常大,如果變大,說明您改對位置了,後再在UE中來改字型名稱即可 (可用上面提到的「尋找排除」法來完成操作) ;如果沒有,繼續尋找,直到找完全篇代碼為止。
2、對於比較特殊的情況,用 push 00000048 做為輔助判斷條件來尋找一無所獲時,您就可以試著用字型名稱做為輔助判斷條件來尋找,找到字型名稱所在的位置後,您再向上或者向下找是否有「00000008」這種句樣存在,如果有,您可以先把該值改大些,例如: 「0000000F」,執行軟體後看有問題地方的字型是否會變的非常大,如果變大,說明您改對位置了,後再在UE中來改字型名稱即可 (可用上面提到的「尋找排除」法來完成操作) ;如果沒有,繼續尋找,直到找完全篇代碼為止。
因為,這個軟體比較特殊,上面提到的這兩種簡單修改方法都同時存在於其中,只要一開始就認真閱讀了這篇文章的朋友,一定不難看出上面總結的簡單修改方法的由來。
在寫這篇文章前,偉兄還特別交待我,文章要寫的盡量簡單、容易理解些,不知道我是否做到了呢 ? 總之,只要大家能從這篇文章中得到一點字型修改方面的知識,我想寫這篇文章的目的就已經達到了。
這篇文章中涉及到的所有工具和實例軟體,您都可以到漢化新世紀網站上去下載。