Make your own free website on Tripod.com

字型修改一例 (Advanced PDF Password Recovery Pro 1.50)

作者: 飛鷹 (flithawk)


    最近,我在中文化 Advanced PDF Password Recovery Pro 1.50 時,又遇到了ASCII字型/字號的修改問題,介於現在我們還有很多成員對此問題的瞭解不深,所以,我特寫下此文,讓大家對ASCII字型/字號的修改方法有更進一步的瞭解、認識。因為,最近我的課程比較緊,可能寫的亂一些,希望大家諒解。

    首先,用 FontKey 監測軟體的執行,監測出的有問題的部分,結果摘抄如下所示: (在這裡我們清楚的知道了軟體字型設定有問題的部分調用了 CreateFontIndirectA 函數,也知道了調用的字型是 MS Sans Serif 和 字型的大小)

CreateFontIndirectA(LPLOGFONT:005EFC2C:FFFFFFF5_00000000_00000000_00000000_00000000_00_00_00_00_00_00_00_00:"MS Sans Serif")
CreateFontIndirectA returns: AA0
CreateFontIndirectA(LPLOGFONT:005EF9B0:FFFFFFF5_00000000_00000000_00000000_00000000_00_01_00_00_00_00_00_00:"MS Sans Serif")
CreateFontIndirectA returns: 818

    所以,應在UE中尋找「MS Sans Serif」,共會找到四處,把找到的第二處修改為「System」後,執行軟體後發現軟體界面上的字型明顯變大,說明我們已找到修改字型問題的突破口了,記住此處的偏移地址是 2AA39,用 點睛偏移量轉換器 可知此處的 RVA 值為 42C239。在這之後,用 W32DASM 反編譯需要修改的軟體,並尋找「42C239」,只可以找到一處,編譯代碼如下所示:

* Referenced by a CALL at Address:
|:004199F9
|
:00406E68 53 push ebx
:00406E69 56 push esi
:00406E6A 57 push edi
:00406E6B C8E80200 enter 02E8, 00
:00406E6F 83ED72 sub ebp, 00000072
:00406E72 8BBD86000000 mov edi, dword ptr [ebp+00000086]
:00406E78 E8A6D10000 call 00414023
:00406E7D C7050088430000000000 mov dword ptr [00438800], 00000000
:00406E87 893D3C444300 mov dword ptr [0043443C], edi
:00406E8D 6A00 push 00000000

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:0000h
|
:00406E8F 2EFF15F4A44200 Call dword ptr cs:[0042A4F4]
:00406E96 89C6 mov esi, eax
:00406E98 6A5A push 0000005A
:00406E9A 50 push eax

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:4E03h
|
:00406E9B 2EFF1518A54200 Call dword ptr cs:[0042A518]
:00406EA2 89C1 mov ecx, eax
:00406EA4 BB3C000000 mov ebx, 0000003C
:00406EA9 31D2 xor edx, edx
:00406EAB 8D4592 lea eax, dword ptr [ebp-6E]
:00406EAE E83DE50000 call 004153F0
:00406EB3 89C8 mov eax, ecx
:00406EB5 C1E003 shl eax, 03
:00406EB8 BADCFFFFFF mov edx, FFFFFFDC
:00406EBD 29C2 sub edx, eax
:00406EBF 89D0 mov eax, edx
:00406EC1 B948000000 mov ecx, 00000048
:00406EC6 99 cdq
:00406EC7 F7F9 idiv ecx
:00406EC9 894592 mov dword ptr [ebp-6E], eax
:00406ECC 6839C24200 push 0042C239==>尋找到的地方
:00406ED1 8D45AE lea eax, dword ptr [ebp-52]
:00406ED4 50 push eax
:00406ED5 2EFF155CA84200 call dword ptr cs:[0042A85C]
:00406EDC 8D4592 lea eax, dword ptr [ebp-6E]
:00406EDF 50 push eax

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:0000h==>從這裡往下應該就是調用 CreateFontIndirectA 函數,但這裡它並沒有明顯的標誌 (即沒有 CreateFontIndirectA 的字樣,而是 ADVAPI32.ADVAPI32.dll,我不明白為什麼,看來現在的軟體真是無奇不有呀 ! ) ,這裡我是憑經驗判斷出來的
|
:00406EE0 2EFF1500A54200 Call dword ptr cs:[0042A500]
:00406EE7 A328444300 mov dword ptr [00434428], eax
:00406EEC E8B7CFFFFF call 00403EA8
:00406EF1 A3AC454300 mov dword ptr [004345AC], eax
:00406EF6 FF3528444300 push dword ptr [00434428]
:00406EFC 56 push esi

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:FA33h
|
:00406EFD 2EFF1538A54200 Call dword ptr cs:[0042A538]
:00406F04 89C3 mov ebx, eax
:00406F06 8D45CE lea eax, dword ptr [ebp-32]
:00406F09 50 push eax
:00406F0A 56 push esi

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:AB94h
|
:00406F0B 2EFF1528A54200 Call dword ptr cs:[0042A528]
:00406F12 53 push ebx
:00406F13 56 push esi

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:FA33h
|
:00406F14 2EFF1538A54200 Call dword ptr cs:[0042A538]
:00406F1B 56 push esi

* Reference To: ADVAPI32.ADVAPI32.dll, Ord:2AFFh
|
:00406F1C 2EFF1510A54200 Call dword ptr cs:[0042A510]

    在這裡,我根據Ronnier兄與我合寫的一篇文章《還我廬山真面目》中方法,可以確定下面的編譯代碼部分就是設定軟體界面字型大小的關鍵處,摘抄如下:

:00406EB5 C1E003 shl eax, 03
:00406EB8 BADCFFFFFF mov edx, FFFFFFDC
:00406EBD 29C2 sub edx, eax
:00406EBF 89D0 mov eax, edx
:00406EC1 B948000000 mov ecx, 00000048
:00406EC6 99 cdq
:00406EC7 F7F9 idiv ecx
:00406EC9 894592 mov dword ptr [ebp-6E], eax

下面的編譯代碼是表示壓入字型名稱:

:00406ECC 6839C24200 push 0042C239
:00406ED1 8D45AE lea eax, dword ptr [ebp-52]
:00406ED4 50 push eax
:00406ED5 2EFF155CA84200 call dword ptr cs:[0042A85C]

    修改方法一是: 先在UE中把文章開頭剛找到的字型名稱 MS Sans Serif,改為 新細明體,再把從 00406EB5 處到 00406ECC 處的編譯代碼,修改為下面的形式後,就可以把它改為「新細明體,9號」字:

:00406EB5 C745A986000000 mov [ebp-57],00000086
:00406EBC C74592F4FFFFFF mov [ebp-6E],FFFFFFF4
:00406EC3 90 nop
:00406EC4 90 nop
:00406EC5 90 nop
:00406EC6 90 nop
:00406EC7 90 nop
:00406EC8 90 nop
:00406EC9 90 nop
:00406ECA 90 nop
:00406ECB 90 nop

即在UE中,就是把 C1E003BADCFFFFFF29C289D0B94800000099F7F9894592 改為:
  C745A986000000C74592F4FFFFFF909090909090909090
這樣就修改了字型大小和語系。

按這種方法修改完成後,再用 FontKey 監測軟體的執行,結果如下所示:

CreateFontIndirectA(LPLOGFONT:005EFC2C:FFFFFFF4_00000000_00000000_00000000_00000000_00_00_00_86_00_00_00_00:"新細明體")
CreateFontIndirectA returns: 5F8
CreateFontIndirectA(LPLOGFONT:005EF9B0:FFFFFFF4_00000000_00000000_00000000_00000000_00_01_00_86_00_00_00_00:"新細明體")
CreateFontIndirectA returns: BBC

看到了您 ! 正是我們需要的,說明改對地方了。

    修改方法二:

先把下面的152個字節代碼,複製到 300h 開始處:

F4FFFFFF000000000000000000000000900100000000008600000000CBCECCE5000000000000000000000000000000000000000000000000
0000000000000000E800000000582D45030000BB0003000003D8895C2404050C400000FF20000000E800000000582D650300005B83C43833
C951515151516A8651515168900100005151516AF453050C400000FF200000004003400060034000

後把 00406EE0 處的 Call dword ptr cs:[0042A500],改為 Call dword ptr cs:[00400390],在UE中就是把 2EFF1500A54200 改為 2EFF1590034000;再計算出 RVA=VA - ImageBase=0042A500 - 00400000 = 0002A500,反過來就是 00A50200,所以再在UE中把 357h 處開始的四個字節,原來是 0C400000 ,改成 00A50200 即可。

按這種方法修改完成後,再用 FontKey 監測軟體的執行,結果如下所示:

CreateFontIndirectA(LPLOGFONT:00400300:FFFFFFF4_00000000_00000000_00000000_00000190_00_00_00_86_00_00_00_00:"新細明體")
CreateFontIndirectA returns: 9C0
CreateFontIndirectA(LPLOGFONT:005EF9B0:FFFFFFF4_00000000_00000000_00000000_00000190_00_01_00_86_00_00_00_00:"新細明體")
CreateFontIndirectA returns: 1B8

    看到了您 ! 正是我們需要的,說明改對地方了。

    這種方法是按照梁利兄所寫的文章《有鑒於 FontKey 新版遙遙無期……》中的修改方法得來的。

    上面我介紹了兩種對於該軟體 ASCII字型/字號 的修改方法,希望大家以後遇到此類問題可以迎刃而解。這個軟體很特殊,用 W32DASM 反編譯後,無法找到 GDI32.CreateFontIndirectA 這個API函數,凡是找到的API函數全部都是 ADVAPI32.ADVAPI32.dll 這種形式,真是不知道是什麼意思 ? 在這種情況下,找到需要修改的地方確實不易,完全就是憑經驗,所以,我們應該善於在中文化軟體的過程中積累各種經驗,以備後用。

    如果文章中有什麼錯誤,歡迎大家給我提出、指正,在此我先謝謝各位了 !

    改完了這個軟體的ASCII字型/字號的問題後,我又拿出了以前我中文化過的同一個公司的產品 Advanced ZIP Password Recovery 3.52 來改正它的ASCII字型/字號的問題,在這裡我知道了有字型大小問題處的 RVA 值是 0042B221,在 W32DASM 中反編譯該軟體,並尋找此值,找到的編譯代碼如下:


:00414539 E8F2370100 call 00427D30
:0041453E 89C8 mov eax, ecx
:00414540 C1E003 shl eax, 03
:00414543 BADCFFFFFF mov edx, FFFFFFDC
:00414548 29C2 sub edx, eax
:0041454A 89D0 mov eax, edx
:0041454C B948000000 mov ecx, 00000048
:00414551 99 cdq
:00414552 F7F9 idiv ecx
:00414554 894592 mov dword ptr [ebp-6E], eax
:00414557 6821B24200 push 0042B221==>尋找到的地方
:0041455C 8D45AE lea eax, dword ptr [ebp-52]
:0041455F 50 push eax
:00414560 2EFF1568974200 call dword ptr cs:[00429768]
:00414567 8D4592 lea eax, dword ptr [ebp-6E]
:0041456A 50 push eax
:0041456B 2EFF1580944200 call dword ptr cs:[00429480]
:00414572 A324D44A00 mov dword ptr [004AD424], eax
:00414577 E88ECCFFFF call 0041120A
:0041457C A3A8D54A00 mov dword ptr [004AD5A8], eax
:00414581 FF3524D44A00 push dword ptr [004AD424]
:00414587 56 push esi

根據上面修改 Advanced PDF Password Recovery Pro 1.50 的經驗,我們可以知道下面的編譯代碼就是字型大小的由來處:

:00414540 C1E003 shl eax, 03
:00414543 BADCFFFFFF mov edx, FFFFFFDC
:00414548 29C2 sub edx, eax
:0041454A 89D0 mov eax, edx
:0041454C B948000000 mov ecx, 00000048
:00414551 99 cdq
:00414552 F7F9 idiv ecx
:00414554 894592 mov dword ptr [ebp-6E], eax
 

下面的編譯代碼就是壓入字型名稱:

:00414557 6821B24200 push 0042B221
:0041455C 8D45AE lea eax, dword ptr [ebp-52]
:0041455F 50 push eax
:00414560 2EFF1568974200 call dword ptr cs:[00429768]

從 0041456B 處的 call dword ptr cs:[00429480] 往下就是調用 CreateFontIndirectA 函數,但在這裡就更奇怪了,上面的部分中不僅完全就找不到 GDI32.CreateFontIndirectA 這種字樣,而且,在用 W32DASM 反編譯該軟體後,您就根本找不到任何的API函數,是我沒有把殼脫乾淨,還是別的什麼保護方式,這裡我就無從得知了。

在這之後,我又繼續對 Advanced Archive Password Recovery 2.0 和 Advanced RAR Password Recovery 1.11 的ASCII字型/字號的設定問題進行了分析,反編譯軟體後找到的編譯代碼段的格式與上面的這兩個軟體基本一致。

下邊的編譯代碼部分,摘取於 Advanced Archive Password Recovery 2.0 中:

:004176F8 E8F3CC0100 call 004343F0
:004176FD 89C8 mov eax, ecx
:004176FF C1E003 shl eax, 03
:00417702 BADCFFFFFF mov edx, FFFFFFDC
:00417707 29C2 sub edx, eax
:00417709 89D0 mov eax, edx
:0041770B B948000000 mov ecx, 00000048
:00417710 99 cdq
:00417711 F7F9 idiv ecx
:00417713 894592 mov dword ptr [ebp-6E], eax
:00417716 682A824300 push 0043822A==>尋找到的與RVA值對應的地方
:0041771B 8D45AE lea eax, dword ptr [ebp-52]
:0041771E 50 push eax
:0041771F 2EFF1588674300 call dword ptr cs:[00436788]
:00417726 8D4592 lea eax, dword ptr [ebp-6E]
:00417729 50 push eax
:0041772A 2EFF1590644300 call dword ptr cs:[00436490]
:00417731 A324044C00 mov dword ptr [004C0424], eax
:00417736 E83DCDFFFF call 00414478
:0041773B A3A8054C00 mov dword ptr [004C05A8], eax
:00417740 FF3524044C00 push dword ptr [004C0424]
:00417746 56 push esi

下邊的編譯代碼部分,摘取於 Advanced RAR Password Recovery 1.11 中:

:00408870 E8EBF20000 call 00417B60
:00408875 89C8 mov eax, ecx
:00408877 C1E003 shl eax, 03
:0040887A BADCFFFFFF mov edx, FFFFFFDC
:0040887F 29C2 sub edx, eax
:00408881 89D0 mov eax, edx
:00408883 B948000000 mov ecx, 00000048
:00408888 99 cdq
:00408889 F7F9 idiv ecx
:0040888B 8945A6 mov dword ptr [ebp-5A], eax
:0040888E 689DB14100 push 0041B19D==>尋找到的與RVA值對應的地方
:00408893 8D45C2 lea eax, dword ptr [ebp-3E]
:00408896 50 push eax
:00408897 2EFF1538974100 call dword ptr cs:[00419738]
:0040889E 8D45A6 lea eax, dword ptr [ebp-5A]
:004088A1 50 push eax
:004088A2 2EFF156C944100 call dword ptr cs:[0041946C]
:004088A9 A324144200 mov dword ptr [00421424], eax
:004088AE E8CDD4FFFF call 00405D80
:004088B3 A3A4154200 mov dword ptr [004215A4], eax
:004088B8 FF3524144200 push dword ptr [00421424]
:004088BE 56 push esi

    照這種形式看的話,Elcome 這個公司出的軟體,ASCII字型/字號的修改方法應該與上面所寫的文章相差無幾,以後大家中文化時如果遇到這個公司的軟體,ASCII字型/字號的問題應該是比較容易解決的您 !

    今天,我就介紹到這裡啦,我也寫的有些累了,大家也一定看的很疲倦了,收工,休息 ! ! !
 


漢化新世紀成員-飛鷹
撰寫於2001年11月1日
修正於2001年11月3日



回教學