漢字通破解手記 (19千字)

看雪資料發表於2000-09-06

漢字通破解手記
軟體下載:http://kanjiweb.com/anonftp/pub/kanjiweb.exe

***********
寫一篇破解過程,錯誤不少,還望包涵,貽笑大方了.
***********

執行Multword.exe,按X,出現註冊視窗,告訴你序列號,我這裡是34936378,以此為例.
按register註冊,輸入註冊碼7878,ctrl+d到sice,下bpx hmemcpy,g回到程式.
按ok後,sice很聽話的跳出來了.按f12到跳出錯誤視窗,記住按的次數.
然後重複來一下,現在按的次數比剛才少1.然後開始按f10.
現在一步步跟吧.
……以下略去若干行.

:0001.37BF 8D8658FE              lea ax, [bp+FE58]
:0001.37C3 8CD2                  mov dx, ss
:0001.37C5 52                    push dx
………
:0001.37F7 9A907A8537            call 0001.7A90
:0001.37FC 83C40A                add sp, 000A
:0001.37FF 23C0                  and ax, ax
:0001.3801 7403                  je 3806

:0001.3806 8D8630FE              lea ax, [bp+FE30]
:0001.380A 8CD2                  mov dx, ss
:0001.380C 52                    push dx
………
:0001.3894 9ABA716038            call 0001.71BA
:0001.3899 83C408                add sp, 0008
:0001.389C 8A861EFE              mov al , [bp+FE1E]
:0001.38A0 98                    cbw
:0001.38A1 05FBFF                add ax, FFFB
:0001.38A4 50                    push ax
:0001.38A5 8D86BCFE              lea ax, [bp+FEBC]
:0001.38A9 8CD2                  mov dx, ss
:0001.38AB 52                    push dx
:0001.38AC 50                    push ax
:0001.38AD FF76E8                push word ptr [bp-18]
:0001.38B0 9A8E729738            call 0001.728E
:0001.38B5 83C408                add sp, 0008
:0001.38B8 C78638FE0000          mov word ptr [bp-01C8], 0000
:0001.38BE EB11                  jmp 38D1

:0001.38C0 8B8638FE              mov ax, [bp+FE38]
:0001.38C4 8D9EBCFE              lea bx, [bp+FEBC]
:0001.38C8 03D8                  add bx, ax
:0001.38CA 803786                xor byte ptr [bx], 86
:0001.38CD FF8638FE              inc word ptr [bp+FE38]

:0001.38D1 83BE38FE09            cmp word ptr [bp+FE38], 0009
:0001.38D6 7CE8                  jl 38C0

:0001.38D8 8D86BCFE              lea ax, [bp+FEBC]
:0001.38DC 8CD2                  mov dx, ss
:0001.38DE 52                    push dx
:0001.38DF 50                    push ax
:0001.38E0 8D863AFE              lea ax, [bp+FE3A]
:0001.38E4 8CD2                  mov dx, ss
:0001.38E6 52                    push dx
:0001.38E7 50                    push ax
:0001.38E8 9A7C77B338            call 0001.777C
:0001.38ED 83C408                add sp, 0008
:0001.38F0 23C0                  and ax, ax
:0001.38F2 7403                  je 38F7
:0001.38F4 E94D00                jmp 3944

:0001.3954 B8EC08                mov ax, 08EC
:0001.3957 8CDA                  mov dx, ds
:0001.3959 52                    push dx
:0001.395A 50                    push ax
:0001.395B 6A00                  push 0000
:0001.395D 9AD7020000            call USER.MESSAGEBOX
到這裡按f10後跳出錯誤視窗.
是什麼讓程式跳到這裡的?能不能避開?
向上看看,哦.0001.38E8這裡有點問題.如果38f2跳轉會怎麼樣?
從38f7一路下來會有個0001.3942 EB1E jmp 3962,跳到3962就避開了會跳出錯誤視窗的395d了.
可以在38f0處下r ax 0或者38f2處下a命令,然後輸入jnz 38f7或者jmp 38f7,
按g回到程式後,沒有註冊視窗,重新執行軟體,register那裡不可按了,註冊成功.

***********
如果你要改軟體註冊的話到這裡可以了.
可以用ultra edit/winhex/hiew等軟體找83C40823C07403,改74為75或者eb.這樣就做出了修改版.
如果要找註冊碼的繼續向下看了:
***********

現在不可註冊了.軟體寫了什麼註冊標記呢用?用fileopen/regopen等軟體來看看軟體執行,或者用w32dasm分析一下,註冊標記是在Multfont.dll檔案中.重新裝一下軟體.可以先複製一下Multfont.dll.
38f2在38E8 call 0001.777C後面,這777c裡面是什麼?會讓38f2的ax為0(註冊成功)或者1(註冊失敗)?
我們再來一遍,在38e8按f8進入這個call看看.

:0001.777C 55                    push bp
:0001.777D 8BEC                  mov bp, sp
:0001.777F 8BD7                  mov dx, di
:0001.7781 8BDE                  mov bx, si
:0001.7783 1E                    push ds
:0001.7784 C57606                lds si, [bp+06]
:0001.7787 C47E0A                les di, [bp+0A]
:0001.778A 33C0                  xor ax, ax
:0001.778C B9FFFF                mov cx, FFFF
:0001.778F F2                    repnz
:0001.7790 AE                    scasb
:0001.7791 F7D1                  not cx
:0001.7793 2BF9                  sub di, cx
:0001.7795 F3                    repz
:0001.7796 A6                    cmpsb
:0001.7797 7405                  je 779E
:0001.7799 1BC0                  sbb ax, ax
:0001.779B 83D8FF                sbb ax, FFFF

:0001.779E 1F                    pop ds
:0001.779F 8BF3                  mov si, bx
:0001.77A1 8BFA                  mov di, dx
:0001.77A3 5D                    pop bp
:0001.77A4 CB                    retf

按位元組比較串指令,資料段由si定址儲存單元和di定址儲存單元比較.帶有字首repe,相等繼續比較.比較後cx暫存器為0,兩者相等,不為0,兩者不相等.如兩者不相等.7790帶借位相減ax=0,779b相減ax=1.
在7796下d ds:si,看到輸入的7878.
d es:di看到真正的註冊碼1CMPSU4Yb.

***********
如果你要註冊碼的話到這裡可以了.
但註冊碼1CMPSU4Yb對應的序列號是34936378,別的機器並不能用.
如果要找別的機子也可以用方法繼續向下看了:
***********

註冊標記是放在Multfont.dll中,我們可以用winhex來比較一下注冊後的和註冊前的有什麼不同.
在19140h處未註冊版是0409d007.註冊版是15026619.
15026619->19660215.熟悉吧.這是個日期.
可能是作者的生日,也可能是作者的MM的生日.我們就不用管它了.你可以寫信給作者問問看.^-^
那0409d007->07d00904是什麼?07d0轉換成十進位制數字是2000.09轉換成十進位制是09,04轉換成十進位制是04,
20000904?怎麼這麼熟悉?哦.這不就是昨天裝軟體的日期嘛.
這個軟體有十五天的試用期,第一次使用的日期就放在這裡.
現在我們用最開始未使用過的Multfont.dll複製註冊檔案.
執行軟體註冊視窗出現不同的序列號.
用ultra edit等軟體來改Multfont.dll檔案從19140h開始改為15026619.
重新執行軟體,register不可按,註冊成功.

***********
如果你要找別的機子也能用的註冊方法到這裡可以了.
如果要找註冊演算法繼續向下看了:
***********

現在我們想找註冊演算法以做出註冊器,7796處真正的註冊碼是從哪裡來的?
0001.7787有個les di, [bp+0A],但我們還是不知道的.^-^
現在向上看看,再想想,我們這一路跟蹤下來有什麼值得懷疑的地方嗎?

:0001.38C0 8B8638FE              mov ax, [bp+FE38]
:0001.38C4 8D9EBCFE              lea bx, [bp+FEBC]
:0001.38C8 03D8                  add bx, ax
:0001.38CA 803786                xor byte ptr [bx], 86
:0001.38CD FF8638FE              inc word ptr [bp+FE38]

:0001.38D1 83BE38FE09            cmp word ptr [bp+FE38], 0009
:0001.38D6 7CE8                  jl 38C0

38d1這裡沒事比較[bp+fe39]和9的值做什麼?吃飽了撐的?^-^當然不是了.
在這裡的迴圈做什麼呢?看38ca.目的是[bx]中值xor 86.
也就是[bp+FEBC]中開始9個位元組xor 86.[bp+FEBC]是什麼東東?
在38c4我們這裡下d bx看看,是b7,c5,cb,d6,d5,d3,b2,df,e4.
這幾個數依次xor 86後成了31,43,4d,50,53,55,34,59,62.
就是我們要找的註冊碼1CMPSU4Yb.
b7,c5,cb,d6,d5,d3,b2,df,e4,這幾個數字又是從哪裡來的呢?
往上找吧.0001.37F7 call 0001.7A90這裡進去看看,
:0001.7A90 8CD8                  mov ax, ds
:0001.7A92 90                    nop
:0001.7A93 45                    inc bp
:0001.7A94 55                    push bp
:0001.7A95 8BEC                  mov bp, sp
:0001.7A97 1E                    push ds
:0001.7A98 8ED8                  mov ds, ax
:0001.7A9A 1E                    push ds
:0001.7A9B C55606                lds dx, [bp+06]
:0001.7A9E 8B460A                mov ax, [bp+0A]
:0001.7AA1 B43D                  mov ah, 3D
:0001.7AA3 2EF706B06A0100        test word ptr cs:[6AB0], 0001
:0001.7AAA 7407                  je 7AB3
:0001.7AAC 9A767A0000            call KERNEL.DOS3CALL
dos3call?
這是做什麼?哦.dos功能呼叫.
7aa1處ah=3d.功能號為3d的dos功能呼叫是開啟一個檔案.
ds:dx為檔名地址.所以我們在7aac這裡下ds:dx看看,程式開啟的是Multfont.dll檔案.
再下來
3894 call 0001.71BA
進入後
……
:0001.71F7 8BD1                  mov dx, cx
:0001.71F9 B80142                mov ax, 4201
:0001.71FC 2EF706B06A0100        test word ptr cs:[6AB0], 0001
:0001.7203 7407                  je 720C
:0001.7205 9A446D0000            call KERNEL.DOS3CALL
71f9處ax=4201.ah=42.al=01
功能號為42的dos功能呼叫是移動檔案指標.al為移動方式,al=0表示指標從檔案開始位置移動.
在7205處看dx值為9145,這是移動位元組數低有效16位,cx值為1,這是移動位元組數高有效16位.
所以指標移動19145h位元組.
Multfont.dll的19145h位元組開始是什麼?
b7,c5,cb,d6,d5,d3,b2,df,e4.
這就是我們找的數.
移動到這裡要讀吧.是的.然後程式在38B0處開始讀這些數.
進入call 0001.728E
:0001.72DF B43F                  mov ah, 3F
:0001.72E1 2EF706B06A0100        test word ptr cs:[6AB0], 0001
:0001.72E8 7407                  je 72F1
:0001.72EA 9A7C720000            call KERNEL.DOS3CALL
:0001.72EF EB02                  jmp 72F3
功能號為3f的dos功能呼叫是讀檔案,
cx的值是讀取的位元組數,這裡是19.
ds:dx是檔案資料緩衝區地址.
我們看看是什麼東東.哦.就是b7,c5,cb,d6,d5,d3,b2,df,e4,……19個位元組數值.
但只有前面9個對我們有用.
現在我們可以來寫註冊器了.
讀取Multfont.dll中從19145h開始9個位元組,然後每一個xor 86.
結果就是註冊碼了.
啊.這就算註冊器啊?
怎麼不是,還很自動呢.不用輸入序列號.:)
雖然這是非常正確的,但有些觀眾耐心聽我的廢話看到這裡,本來想寫個註冊器讓MM開心一下,沒想到卻是看到這樣的註冊器.唉,大家不要著急嘛.其實給MM用自動的多好.漂亮的女人是比較懶吧.:)

***********
如果你要找註冊演算法寫出註冊器的話到這裡可以了.
如果要找完整的註冊演算法寫出真正的註冊器繼續向下看了:
***********

這要找序列號和註冊碼的關係了.
我們來看看序列號是什麼.34936378.
還記得38b0處程式讀了19個位元組吧.如果你比較未執行前和執行後的Multfont.dll也可以看到,
在1914fh開始4個位元組是02,15,10,3a.
0215103a?我們拿出windows設計得最好最有用途的工具計算器來看看.^-^
0215103ah轉換成十進位制就是34936378.
現在思路進一步清楚了.
程式讀取Multfont.dll檔案中1914fh開始4個位元組,轉換成十六進位制的數做為註冊視窗中出現的序列號.
當輸入的註冊碼xor 86後與19145h開始9個位元組相等的話,註冊成功.
Multfont.dll檔案是什麼時候開始寫進這些與序列號註冊碼有關的數值的?
比較我們以前複製的未第一次執行和執行後的Multfont.dll檔案,
未第一次執行前19140h開始是:
ff,ff,ff,ff,ff,31,43,4b,4e,52,53,32,54,54,00,00
00,00,00,00,00,00,00,00,00,41,4e,44,59,1e
其中19145h開始9個位元組是1CKNRS2TT.
執行後19140h開始是:
04,09,d0,07,ff,b7,c5,cb,d6,d5,d3,b2,df,e4,00,02
15,16,3a,00,00,00,00,00,00,41,4e,44,59,1e
我們可以看出,程式執行第一次的時候,寫進了第一次執行日期,寫進了與序列號有關的數值,寫進了與註冊碼有關的數值.這樣來看,我們要找出序列號和註冊碼的關係是要在程式第一次執行的時候.
這就是關鍵所在了.
我們把未執行的Multfont.dll檔案覆蓋執行後檔案,讓程式以為是第一次執行.
這樣,它會開始寫進這些數值.
它什麼時候寫?用什麼些?
我們想到了軟體一直使用的dos功能呼叫call KERNEL.DOS3CALL.
寫檔案的功能號是40.
我們在softice中下bpx dos3call if ah==40,
執行軟體後softice中斷.
按f10到這裡
:0001.7587 B440                  mov ah, 40
:0001.7589 2EF706B06A0100        test word ptr cs:[6AB0], 0001
:0001.7590 7407                  je 7599
:0001.7592 9A13750000            call KERNEL.DOS3CALL
下d dx,看到寫進的是0409d007.ax=4,寫進4個位元組.
這個7587在:0001.041A call 0001.7406這個call裡面.

:0001.041A 9A06740904            call 0001.7406
:0001.041F 83C408                add sp, 0008
:0001.0422 6A00                  push 0000
:0001.0424 8B860EFF              mov ax, [bp+FF0E]
:0001.0428 8B9610FF              mov dx, [bp+FF10]
:0001.042C 050500                add ax, 0005
:0001.042F 83D200                adc dx, 0000
:0001.0432 52                    push dx
:0001.0433 50                    push ax
:0001.0434 FF7684                push word ptr [bp-7C]
:0001.0437 9ABA711D04            call 0001.71BA
:0001.043C 83C408                add sp, 0008
:0001.043F 6A09                  push 0009
:0001.0441 8D86F2FE              lea ax, [bp+FEF2]
:0001.0445 8CD2                  mov dx, ss
:0001.0447 52                    push dx
:0001.0448 50                    push ax
:0001.0449 FF7684                push word ptr [bp-7C]
:0001.044C 9A8E723A04            call 0001.728E
:0001.0451 83C408                add sp, 0008
:0001.0454 8D86ECFE              lea ax, [bp+FEEC]
:0001.0458 8CD2                  mov dx, ss
:0001.045A 52                    push dx
:0001.045B 50                    push ax
:0001.045C 9A287B4F04            call 0001.7B28
:0001.0461 83C404                add sp, 0004
:0001.0464 8A86EFFE              mov al , [bp+FEEF]
:0001.0468 25FF00                and ax, 00FF
:0001.046B B90A00                mov cx, 000A
:0001.046E 99                    cwd
:0001.046F F7F9                  idiv cx
:0001.0471 0086F3FE              add [bp+FEF3], al
:0001.0475 8A86EFFE              mov al , [bp+FEEF]
:0001.0479 25FF00                and ax, 00FF
:0001.047C B90A00                mov cx, 000A
:0001.047F 99                    cwd
:0001.0480 F7F9                  idiv cx
:0001.0482 0096F4FE              add [bp+FEF4], dl
:0001.0486 8A86ECFE              mov al , [bp+FEEC]
:0001.048A 25FF00                and ax, 00FF
:0001.048D B90A00                mov cx, 000A
:0001.0490 99                    cwd
:0001.0491 F7F9                  idiv cx
:0001.0493 0086F5FE              add [bp+FEF5], al
:0001.0497 8A86ECFE              mov al , [bp+FEEC]
:0001.049B 25FF00                and ax, 00FF
:0001.049E B90A00                mov cx, 000A
:0001.04A1 99                    cwd
:0001.04A2 F7F9                  idiv cx
:0001.04A4 0096F6FE              add [bp+FEF6], dl
:0001.04A8 8A86EDFE              mov al , [bp+FEED]
:0001.04AC 25FF00                and ax, 00FF
:0001.04AF B90A00                mov cx, 000A
:0001.04B2 99                    cwd
:0001.04B3 F7F9                  idiv cx
:0001.04B5 0086F7FE              add [bp+FEF7], al
:0001.04B9 8A86EDFE              mov al , [bp+FEED]
:0001.04BD 25FF00                and ax, 00FF
:0001.04C0 B90A00                mov cx, 000A
:0001.04C3 99                    cwd
:0001.04C4 F7F9                  idiv cx
:0001.04C6 0096F8FE              add [bp+FEF8], dl
:0001.04CA 8A86EEFE              mov al , [bp+FEEE]
:0001.04CE 25FF00                and ax, 00FF
:0001.04D1 B90A00                mov cx, 000A
:0001.04D4 99                    cwd
:0001.04D5 F7F9                  idiv cx
:0001.04D7 0086F9FE              add [bp+FEF9], al
:0001.04DB 8A86EEFE              mov al , [bp+FEEE]
:0001.04DF 25FF00                and ax, 00FF
:0001.04E2 B90A00                mov cx, 000A
:0001.04E5 99                    cwd
:0001.04E6 F7F9                  idiv cx
:0001.04E8 0096FAFE              add [bp+FEFA], dl
先停一下,以免看多了頭暈.
注意0464這裡: mov al , [bp+FEEF]
引進了一個[bp+feef].
進入上面的045c call 0001.7B28可看到:
……
:0001.7B32 B42C                  mov ah, 2C
:0001.7B34 2EF706B06A0100        test word ptr cs:[6AB0], 0001
:0001.7B3B 7407                  je 7B44
:0001.7B3D 9A047B0000            call KERNEL.DOS3CALL
功能號是2c的dos功能呼叫是讀系統時間.
ch是小時數,cl是分鐘數,dh是秒數,dl是百分之一秒數.
這個call不看也可以,看了就會明白序列號是怎麼來的了.原來是讀系統時間的結果.
為了解釋方便,這裡還是以02,15,16,3a為例.
(第一次執行軟體時間是在15點16分鐘58.02秒,啊,在softice作用下我的系統時間又改變了,這裡不是早上2點15分哦,第一個和第四個變換一下,但是這與註冊演算法無關就是了,不必看.^-^)
0464處al為02,046f處al(02)除以cx(常量a),
0471處[bp+fef3]數值加上2/a商0,[bp+fef3]值為常量1CKNRS2TT(1沒有算)中的'C'.'C'+0='C',
0475處al仍為02,0480處al(02)除以cx(常量a),
0482處[bp+FEF4]數值加上2/a餘數2,[bp+fef4]值為常量1CKNRS2TT中的'K'.'C'+2='M',
接下來分別用15,16,3a除以a,商及餘數加到常量1CKNRS2TT對應的數值中.
[bp+fef3]開始數值是CMPSU4Y\,加上前面的1,[bp+fef2]開始數值是1CMPSU4Y\,
這個和註冊碼有點象了.但還不是真正的註冊碼,繼續往下看:
:0001.04EC 8A86F3FE              mov al , [bp+FEF3]
:0001.04F0 98                    cbw
:0001.04F1 3D5A00                cmp ax, 005A
:0001.04F4 7E05                  jle 04FB
:0001.04F6 8086F3FE06            add byte ptr [bp+FEF3], 06
比較[bp+fef3]數值與5a大小,若小於就跳,繼續比較下一個位元組,如大於數值加6,以下同.
:0001.04FB 8A86F4FE              mov al , [bp+FEF4]
:0001.04FF 98                    cbw
:0001.0500 3D5A00                cmp ax, 005A
:0001.0503 7E05                  jle 050A
:0001.0505 8086F4FE06            add byte ptr [bp+FEF4], 06
:0001.050A 8A86F5FE              mov al , [bp+FEF5]
:0001.050E 98                    cbw
:0001.050F 3D5A00                cmp ax, 005A
:0001.0512 7E05                  jle 0519
:0001.0514 8086F5FE06            add byte ptr [bp+FEF5], 06
:0001.0519 8A86F6FE              mov al , [bp+FEF6]
:0001.051D 98                    cbw
:0001.051E 3D5A00                cmp ax, 005A
:0001.0521 7E05                  jle 0528
:0001.0523 8086F6FE06            add byte ptr [bp+FEF6], 06
:0001.0528 8A86F7FE              mov al , [bp+FEF7]
:0001.052C 98                    cbw
:0001.052D 3D5A00                cmp ax, 005A
:0001.0530 7E05                  jle 0537
:0001.0532 8086F7FE06            add byte ptr [bp+FEF7], 06
:0001.0537 8A86F8FE              mov al , [bp+FEF8]
:0001.053B 98                    cbw
:0001.053C 3D5A00                cmp ax, 005A
:0001.053F 7E05                  jle 0546
:0001.0541 8086F8FE06            add byte ptr [bp+FEF8], 06
:0001.0546 8A86F8FE              mov al , [bp+FEF8]
:0001.054A 98                    cbw
:0001.054B 3D3900                cmp ax, 0039
:0001.054E 7E0F                  jle 055F
:0001.0550 8A86F8FE              mov al , [bp+FEF8]
:0001.0554 98                    cbw
:0001.0555 3D4100                cmp ax, 0041
:0001.0558 7D05                  jge 055F
:0001.055A 8086F8FE07            add byte ptr [bp+FEF8], 07
這裡比較奇怪點,如果[bp+FEF8]數值大於39同時小於41,加上7.
:0001.055F 8A86F9FE              mov al , [bp+FEF9]
:0001.0563 98                    cbw
:0001.0564 3D5A00                cmp ax, 005A
:0001.0567 7E05                  jle 056E
:0001.0569 8086F9FE06            add byte ptr [bp+FEF9], 06
:0001.056E 8A86FAFE              mov al , [bp+FEFA]
:0001.0572 98                    cbw
:0001.0573 3D5A00                cmp ax, 005A
:0001.0576 7E05                  jle 057D
:0001.0578 8086FAFE06            add byte ptr [bp+FEFA], 06
一路下來,我們的1CMPSU4Y\總算在這裡加上了一次.'\'是5c,大於5a,'\'+6='b',
:0001.057D 6A00                  push 0000
:0001.057F 8B860EFF              mov ax, [bp+FF0E]
:0001.0583 8B9610FF              mov dx, [bp+FF10]
:0001.0587 050500                add ax, 0005
:0001.058A 83D200                adc dx, 0000
:0001.058D 52                    push dx
:0001.058E 50                    push ax
:0001.058F FF7684                push word ptr [bp-7C]
:0001.0592 9ABA715F04            call 0001.71BA
:0001.0597 83C408                add sp, 0008
:0001.059A C786F0FE0000          mov word ptr [bp-0110], 0000
:0001.05A0 EB11                  jmp 05B3

:0001.05A2 8B86F0FE              mov ax, [bp+FEF0]
:0001.05A6 8D9EF2FE              lea bx, [bp+FEF2]
:0001.05AA 03D8                  add bx, ax
:0001.05AC 803786                xor byte ptr [bx], 86
:0001.05AF FF86F0FE              inc word ptr [bp+FEF0]

:0001.05B3 83BEF0FE09            cmp word ptr [bp+FEF0], 0009
:0001.05B8 7CE8                  jl 05A2

這個迴圈是把註冊碼1CMPSU4Yb xor 86,變成了b7,c5,cb,d6,d5,d3,b2,df,e4.
還記得38c0的迴圈吧.
下面應該開始寫檔案了吧.是的.
:0001.05C7 9A06749505            call 0001.7406
把與註冊碼相關的b7,c5,cb,d6,d5,d3,b2,df,e4.寫入Multfont.dll檔案.
:0001.05F9 9A0674E705            call 0001.7406
:0001.060E 9A0674FC05            call 0001.7406
:0001.0623 9A06741106            call 0001.7406
:0001.0638 9A06742606            call 0001.7406
分四次把與序列號相關也是與程式第一次執行時間相關的02,15,16,3a寫入Multfont.dll檔案.

現在整個完整演算法都出來了.
啊.我要睡覺了.


                                      2000年9月6日.

相關文章