億特代理伺服器簡易版破解手記 (15千字)

看雪資料發表於2002-09-19

軟體:億特代理伺服器簡易版,版本1.5 build0626
工具:ollydbg,w32dasm,peditor

OK,開工。首先習慣性地看看程式有沒有加殼(現在釋出的程式還有不加殼的麼:))
上網找了一個叫peidentifier的外殼檢測程式,檢測之後報告億特
加的外殼是pecompact1.66-1.67。上網看看有沒有專門的pccompact脫殼
工具,真還找著了,叫UnPECompact 1.32。它脫殼的時間好長,可能
有幾分鐘吧,脫出來的程式我一執行就出錯。我是XP下脫的,可能是XP的
原因,於是我切換到98下重新脫殼,經過了同樣漫長時間的等待後,
脫出來的程式執行OK。

再用FI看看程式是用什麼編的,噢,是Delphi。好辦了:)。
執行殼後的程式,進入註冊對話方塊,可是找不到輸入註冊碼的地方,
估計可能是採用註冊檔案的方法來註冊。沒有輸入註冊碼,一時還沒有
合適的切入點,只好追蹤<註冊>選單項的處理函式。對於,Delphi
這比較好辦。在億特的程式檔案yitproxy.exe中搜尋字串“註冊”,
發現<註冊>選單項的ID是Submenu4Item5,那麼可知點選這個選單呼叫
的處理函式是Submenu4Item5Click。在yitproxy.exe中搜尋"Submenu4Item5Click"
,在找到的地方往前移5個位元組,那裡的4個位元組就是函式的地址:5B9E40

在這個地址上下斷點跟蹤,程式碼分析附後。作者使用了blowfish演算法生成註冊資料,
blowfish演算法部分採用了網上可下載的公開原始碼的 Delphi Encryption Compendium
( DEC Part I)。我寫序號產生器的時候,同樣用了Delphi Encryption Compendium V3.0
,可是我加密過資料在億特程式裡解密時得到的明文與原來的不一樣,不知道
到底是作者改動了Blowfish演算法還是版本的原因。有沒有大蝦能分析一下它的blowfish
演算法:)
沒有辦法,我最後只好在脫殼後的yitproxy.exe裡附加程式碼,利用裡面的blowfish程式碼,
作出了序號產生器,呵呵。

破了簡易版,標準版和完全版是類似的,依葫蘆畫瓢,輕鬆搞定。

0167:005B9E40  PUSH    EBP
0167:005B9E41  MOV      EBP,ESP
             
              分配區域性變數空間,區域性變數初始化為0,這段程式碼有些意思

0167:005B9E43  MOV      ECX,0A
0167:005B9E48  PUSH    BYTE +00
0167:005B9E4A  PUSH    BYTE +00
0167:005B9E4C  DEC      ECX
0167:005B9E4D  JNZ      005B9E48

0167:005B9E4F  MOV      [EBP-04],EAX

0167:005B9E52  XOR      EAX,EAX
0167:005B9E54  PUSH    EBP
0167:005B9E55  PUSH    DWORD 005BA28D
0167:005B9E5A  PUSH    DWORD [FS:EAX]
0167:005B9E5D  MOV      [FS:EAX],ESP

              建立註冊對話方塊物件,不重要,不管它
             
0167:005B9E60  MOV      ECX,[EBP-04]
0167:005B9E63  MOV      DL,01
0167:005B9E65  MOV      EAX,[005B0A50]
0167:005B9E6A  CALL    0044F654
0167:005B9E6F  MOV      [EBP-2C],EAX    ;註冊對話方塊物件指標

0167:005B9E72  XOR      EAX,EAX
0167:005B9E74  PUSH    EBP
0167:005B9E75  PUSH    DWORD 005BA25E
0167:005B9E7A  PUSH    DWORD [FS:EAX]
0167:005B9E7D  MOV      [FS:EAX],ESP

              yitproxy的作者還是蠻仁慈的,馬上就直奔主題,開始計算驗證註冊必須的機器碼了
              不象有些軟體,裡面亂CALL一氣,搞得你暈頭轉向:)
             
              作者使用了blowfish加密演算法來加密註冊資訊,使用的程式碼是網上可以得到的自由的
              Delhpi Encrypt Compendium I。
             
              作者將blowfish演算法需要的資料按一個個位元組拆開放在程式資料段裡,使用的時候
              再拼裝起來。下面的這段程式碼就是拼裝資料
             
0167:005B9E80  LEA      EAX,[EBP-08]
0167:005B9E83  MOV      EDX,005BA2A0
0167:005B9E88  CALL    00403E18
0167:005B9E8D  LEA      EAX,[EBP-08]
0167:005B9E90  MOV      EDX,005BA2AC
0167:005B9E95  CALL    00404008
0167:005B9E9A  LEA      EAX,[EBP-08]
0167:005B9E9D  MOV      EDX,005BA2B8
0167:005B9EA2  CALL    00404008
0167:005B9EA7  LEA      EAX,[EBP-08]
0167:005B9EAA  MOV      EDX,005BA2C4
0167:005B9EAF  CALL    00404008
0167:005B9EB4  LEA      EAX,[EBP-08]
0167:005B9EB7  MOV      EDX,005BA2D0
0167:005B9EBC  CALL    00404008
0167:005B9EC1  LEA      EAX,[EBP-08]
0167:005B9EC4  MOV      EDX,005BA2DC
0167:005B9EC9  CALL    00404008
0167:005B9ECE  LEA      EAX,[EBP-08]
0167:005B9ED1  MOV      EDX,005BA2E8
0167:005B9ED6  CALL    00404008
0167:005B9EDB  LEA      EAX,[EBP-08]
0167:005B9EDE  MOV      EDX,005BA2F4
0167:005B9EE3  CALL    00404008
0167:005B9EE8  LEA      EAX,[EBP-08]
0167:005B9EEB  MOV      EDX,005BA300
0167:005B9EF0  CALL    00404008
0167:005B9EF5  LEA      EAX,[EBP-08]
0167:005B9EF8  MOV      EDX,005BA2A0
0167:005B9EFD  CALL    00404008

              自此,得到一個長度是10個位元組的string,用十六進位制表示是:
              15 0f 79 c7 06 36 12 1c 4d 15
              記為Data1
             
              然後開始根據所在的機器的硬體資訊計算與機器有關的機器碼。
              yitproxy的硬體資訊包括了網路卡MAC地址,還有其它硬體資訊,
              沒仔細跟,無所謂
             
0167:005B9F02  LEA      EAX,[EBP-0C]
0167:005B9F05  CALL    005B2D40        ;取網路卡MAC地址

0167:005B9F0A  CMP      DWORD [EBP-0C],BYTE +00 ;取到MAC地址?
0167:005B9F0E  JNZ      005B9F18
0167:005B9F10  LEA      EAX,[EBP-0C]
0167:005B9F13  CALL    005B2A2C        ;再用另外一個演算法得到硬體資料
0167:005B9F18  LEA      EAX,[EBP-38]
0167:005B9F1B  CALL    005B2EFC        ;兩處資料合併到一起?
0167:005B9F20  MOV      EDX,[EBP-38]
0167:005B9F23  LEA      EAX,[EBP-0C]
0167:005B9F26  CALL    00404008
0167:005B9F2B  CMP      DWORD [EBP-0C],BYTE +00
0167:005B9F2F  JZ      005B9FAF
             
              用BlowFish演算法加密以硬體相關資料為金鑰加密Data1

0167:005B9F31  MOV      DL,01              ;建立TCipher_Blowfish物件
0167:005B9F33  MOV      EAX,[004BCC4C]      ;TCipher_Blowfish
0167:005B9F38  CALL    004BCF14
0167:005B9F3D  MOV      [EBP-30],EAX        ;新建立的TCipher_Blowfish物件指標

0167:005B9F40  XOR      EAX,EAX
0167:005B9F42  PUSH    EBP
0167:005B9F43  PUSH    DWORD 005B9FA8
0167:005B9F48  PUSH    DWORD [FS:EAX]
0167:005B9F4B  MOV      [FS:EAX],ESP
0167:005B9F4E  MOV      EAX,[EBP-30]
0167:005B9F51  MOV      BYTE [EAX+04],00
0167:005B9F55  XOR      ECX,ECX            ;nil,不附加使用其它加密演算法
0167:005B9F57  MOV      EDX,[EBP-0C]      ;硬體相關資料作為演算法金鑰
0167:005B9F5A  MOV      EAX,[EBP-30]
0167:005B9F5D  CALL    004BD000          ;設定金鑰
             
              加密Data1,[ebp-10]->加密後的字串
             
0167:005B9F62  LEA      ECX,[EBP-10]
0167:005B9F65  MOV      EDX,[EBP-08]        ;-->Data1
0167:005B9F68  MOV      EAX,[EBP-30]
0167:005B9F6B  CALL    004BD5D4            ;加密字串EncodeString方法
             
              再用一個函式將加密後的資料變換得到機器碼
             
0167:005B9F70  MOV      EAX,[EBP-10]        ;加密後的字串
0167:005B9F73  CALL    00404000            ;length,長度
0167:005B9F78  PUSH    EAX
0167:005B9F79  MOV      EAX,[EBP-10]
0167:005B9F7C  CALL    004041C4            ;pchar()
0167:005B9F81  LEA      ECX,[EBP-14]
0167:005B9F84  POP      EDX
0167:005B9F85  CALL    004B860C            ;變換函式
             
              刪除Tcipher_BlowFish物件

0167:005B9F8A  MOV      EAX,[EBP-30]
0167:005B9F8D  MOV      EDX,[EAX]
0167:005B9F8F  CALL    NEAR [EDX+28]
0167:005B9F92  XOR      EAX,EAX
0167:005B9F94  POP      EDX
0167:005B9F95  POP      ECX
0167:005B9F96  POP      ECX
0167:005B9F97  MOV      [FS:EAX],EDX
0167:005B9F9A  PUSH    DWORD 005B9FAF
0167:005B9F9F  MOV      EAX,[EBP-30]
0167:005B9FA2  CALL    00403034
0167:005B9FA7  RET   
0167:005B9FA8  JMP      00403794
0167:005B9FAD  JMP      SHORT 005B9F9F
             
              下面對對話方塊物件操作,包括把剛剛算到的機器碼傳給裡面的控制元件
             
0167:005B9FAF  MOV      EAX,[EBP-2C]
0167:005B9FB2  MOV      EAX,[EAX+02D8]
0167:005B9FB8  MOV      EDX,[EBP-14]
0167:005B9FBB  CALL    004CFD78
0167:005B9FC0  LEA      EDX,[EBP-3C]
0167:005B9FC3  MOV      EAX,[EBP-04]
0167:005B9FC6  MOV      EAX,[EAX+0348]
0167:005B9FCC  CALL    004CFCE4
0167:005B9FD1  MOV      EAX,[EBP-3C]
0167:005B9FD4  XOR      EDX,EDX
0167:005B9FD6  CALL    00409BB0
0167:005B9FDB  TEST    EAX,EAX
0167:005B9FDD  JNG      005BA035
0167:005B9FDF  LEA      EDX,[EBP-40]
0167:005B9FE2  MOV      EAX,[EBP-04]
0167:005B9FE5  MOV      EAX,[EAX+0348]
0167:005B9FEB  CALL    004CFCE4
0167:005B9FF0  MOV      EAX,[EBP-40]
0167:005B9FF3  XOR      EDX,EDX
0167:005B9FF5  CALL    00409BB0
0167:005B9FFA  MOV      EDX,EAX
0167:005B9FFC  MOV      EAX,[EBP-2C]
0167:005B9FFF  MOV      EAX,[EAX+02D0]
0167:005BA005  CALL    004ADE74
0167:005BA00A  LEA      EDX,[EBP-44]
0167:005BA00D  MOV      EAX,[EBP-04]
0167:005BA010  MOV      EAX,[EAX+034C]
0167:005BA016  CALL    004CFCE4
0167:005BA01B  MOV      EAX,[EBP-44]
0167:005BA01E  XOR      EDX,EDX
0167:005BA020  CALL    00409BB0
0167:005BA025  MOV      EDX,EAX
0167:005BA027  MOV      EAX,[EBP-2C]
0167:005BA02A  MOV      EAX,[EAX+02D0]
0167:005BA030  CALL    004ADE80

              在記憶體中拼裝字串
             
0167:005BA035  LEA      EAX,[EBP-18]
0167:005BA038  MOV      EDX,005BA30C
0167:005BA03D  CALL    00403E18
0167:005BA042  LEA      EAX,[EBP-18]
0167:005BA045  MOV      EDX,005BA318
0167:005BA04A  CALL    00404008
0167:005BA04F  LEA      EAX,[EBP-18]
0167:005BA052  MOV      EDX,005BA324
0167:005BA057  CALL    00404008
0167:005BA05C  LEA      EAX,[EBP-18]
0167:005BA05F  MOV      EDX,005BA330
0167:005BA064  CALL    00404008
0167:005BA069  LEA      EAX,[EBP-18]
0167:005BA06C  MOV      EDX,005BA33C
0167:005BA071  CALL    00404008
0167:005BA076  LEA      EAX,[EBP-18]
0167:005BA079  MOV      EDX,005BA348
0167:005BA07E  CALL    00404008
0167:005BA083  LEA      EAX,[EBP-18]
0167:005BA086  MOV      EDX,005BA354
0167:005BA08B  CALL    00404008
0167:005BA090  LEA      EAX,[EBP-18]
0167:005BA093  MOV      EDX,005BA360
0167:005BA098  CALL    00404008
0167:005BA09D  LEA      EAX,[EBP-18]
0167:005BA0A0  MOV      EDX,005BA36C
0167:005BA0A5  CALL    00404008
0167:005BA0AA  LEA      EAX,[EBP-18]
0167:005BA0AD  MOV      EDX,005BA378
0167:005BA0B2  CALL    00404008

              得到的字串長度10位元組,用十六進位制表示為:
              7d 10 51 0b 18 b3 6f 62 d2 f4
              記為Data2


              再次計算機器碼,嗯?有必要嗎,不懂
              註釋就不寫了,參考上面
             
0167:005BA0B7  LEA      EAX,[EBP-08]
0167:005BA0BA  MOV      EDX,005BA2A0
0167:005BA0BF  CALL    00403E18
0167:005BA0C4  LEA      EAX,[EBP-08]
0167:005BA0C7  MOV      EDX,005BA2AC
0167:005BA0CC  CALL    00404008
0167:005BA0D1  LEA      EAX,[EBP-08]
0167:005BA0D4  MOV      EDX,005BA2B8
0167:005BA0D9  CALL    00404008
0167:005BA0DE  LEA      EAX,[EBP-08]
0167:005BA0E1  MOV      EDX,005BA2C4
0167:005BA0E6  CALL    00404008
0167:005BA0EB  LEA      EAX,[EBP-08]
0167:005BA0EE  MOV      EDX,005BA2D0
0167:005BA0F3  CALL    00404008
0167:005BA0F8  LEA      EAX,[EBP-08]
0167:005BA0FB  MOV      EDX,005BA2DC
0167:005BA100  CALL    00404008
0167:005BA105  LEA      EAX,[EBP-08]
0167:005BA108  MOV      EDX,005BA2E8
0167:005BA10D  CALL    00404008
0167:005BA112  LEA      EAX,[EBP-08]
0167:005BA115  MOV      EDX,005BA2F4
0167:005BA11A  CALL    00404008
0167:005BA11F  LEA      EAX,[EBP-08]
0167:005BA122  MOV      EDX,005BA300
0167:005BA127  CALL    00404008
0167:005BA12C  LEA      EAX,[EBP-08]
0167:005BA12F  MOV      EDX,005BA2A0
0167:005BA134  CALL    00404008

0167:005BA139  LEA      EAX,[EBP-0C]
0167:005BA13C  CALL    005B2D40
0167:005BA141  CMP      DWORD [EBP-0C],BYTE +00
0167:005BA145  JNZ      005BA14F
0167:005BA147  LEA      EAX,[EBP-0C]
0167:005BA14A  CALL    005B2A2C
0167:005BA14F  LEA      EAX,[EBP-48]
0167:005BA152  CALL    005B2EFC
0167:005BA157  MOV      EDX,[EBP-48]
0167:005BA15A  LEA      EAX,[EBP-0C]
0167:005BA15D  CALL    00404008
0167:005BA162  CMP      DWORD [EBP-0C],BYTE +00
0167:005BA166  JZ      NEAR 005BA222

0167:005BA16C  MOV      DL,01
0167:005BA16E  MOV      EAX,[004BCC4C]
0167:005BA173  CALL    004BCF14
0167:005BA178  MOV      [EBP-34],EAX
0167:005BA17B  XOR      EAX,EAX
0167:005BA17D  PUSH    EBP
0167:005BA17E  PUSH    DWORD 005BA1E3
0167:005BA183  PUSH    DWORD [FS:EAX]
0167:005BA186  MOV      [FS:EAX],ESP
0167:005BA189  MOV      EAX,[EBP-34]
0167:005BA18C  MOV      BYTE [EAX+04],00
0167:005BA190  XOR      ECX,ECX
0167:005BA192  MOV      EDX,[EBP-0C]
0167:005BA195  MOV      EAX,[EBP-34]
0167:005BA198  CALL    004BD000

0167:005BA19D  LEA      ECX,[EBP-10]
0167:005BA1A0  MOV      EDX,[EBP-08]
0167:005BA1A3  MOV      EAX,[EBP-34]
0167:005BA1A6  CALL    004BD5D4

0167:005BA1AB  MOV      EAX,[EBP-10]
0167:005BA1AE  CALL    00404000
0167:005BA1B3  PUSH    EAX
0167:005BA1B4  MOV      EAX,[EBP-10]
0167:005BA1B7  CALL    004041C4
0167:005BA1BC  LEA      ECX,[EBP-14]
0167:005BA1BF  POP      EDX
0167:005BA1C0  CALL    004B860C

0167:005BA1C5  MOV      EAX,[EBP-34]
0167:005BA1C8  MOV      EDX,[EAX]
0167:005BA1CA  CALL    NEAR [EDX+28]
0167:005BA1CD  XOR      EAX,EAX
0167:005BA1CF  POP      EDX
0167:005BA1D0  POP      ECX
0167:005BA1D1  POP      ECX
0167:005BA1D2  MOV      [FS:EAX],EDX
0167:005BA1D5  PUSH    DWORD 005BA1EA
0167:005BA1DA  MOV      EAX,[EBP-34]
0167:005BA1DD  CALL    00403034
0167:005BA1E2  RET   
0167:005BA1E3  JMP      00403794
0167:005BA1E8  JMP      SHORT 005BA1DA

              [ebp-14]->機器碼
             
0167:005BA1EA  LEA      EAX,[EBP-1C]
0167:005BA1ED  PUSH    EAX
0167:005BA1EE  LEA      EAX,[EBP-20]
0167:005BA1F1  PUSH    EAX
0167:005BA1F2  LEA      EAX,[EBP-24]
0167:005BA1F5  PUSH    EAX
0167:005BA1F6  LEA      EAX,[EBP-28]
0167:005BA1F9  PUSH    EAX
             
              取程式的全路徑和檔名
             
0167:005BA1FA  LEA      EDX,[EBP-50]
0167:005BA1FD  MOV      EAX,[005C24F4]
0167:005BA202  MOV      EAX,[EAX]
0167:005BA204  CALL    00456CC0

                得到yitproxy所在的路徑
               
0167:005BA209  MOV      EAX,[EBP-50]
0167:005BA20C  LEA      EDX,[EBP-4C]
0167:005BA20F  CALL    00409EBC

              註冊驗證,判斷使用者是否已經註冊
             
0167:005BA214  MOV      EAX,[EBP-4C]    -->yitproxy程式所在的路徑
0167:005BA217  MOV      ECX,[EBP-18]    -->data2
0167:005BA21A  MOV      EDX,[EBP-14]    -->機器碼
0167:005BA21D  CALL    0059C7D0        -->關鍵的CALL

0167:005BA222  MOV      EAX,[EBP-28]
0167:005BA225  SUB      EAX,BYTE +05    ;註冊型別5,客戶、連線數均無限制
0167:005BA228  JNZ      005BA23D

              修改對話方塊,顯示註冊成功資訊
             
0167:005BA22A  MOV      EAX,[EBP-2C]
0167:005BA22D  MOV      EAX,[EAX+02EC]
0167:005BA233  MOV      EDX,005BA384
0167:005BA238  CALL    0043739C
0167:005BA23D  MOV      EAX,[EBP-2C]
0167:005BA240  MOV      EDX,[EAX]
0167:005BA242  CALL    NEAR [EDX+D8]
0167:005BA248  XOR      EAX,EAX
0167:005BA24A  POP      EDX
0167:005BA24B  POP      ECX
0167:005BA24C  POP      ECX
0167:005BA24D  MOV      [FS:EAX],EDX
0167:005BA250  PUSH    DWORD 005BA265
0167:005BA255  MOV      EAX,[EBP-2C]
0167:005BA258  CALL    00403034
0167:005BA25D  RET   
0167:005BA25E  JMP      00403794
0167:005BA263  JMP      SHORT 005BA255
0167:005BA265  XOR      EAX,EAX
0167:005BA267  POP      EDX
0167:005BA268  POP      ECX
0167:005BA269  POP      ECX
0167:005BA26A  MOV      [FS:EAX],EDX
0167:005BA26D  PUSH    DWORD 005BA294
0167:005BA272  LEA      EAX,[EBP-50]
0167:005BA275  MOV      EDX,07
0167:005BA27A  CALL    00403DA4
0167:005BA27F  LEA      EAX,[EBP-18]
0167:005BA282  MOV      EDX,05
0167:005BA287  CALL    00403DA4
0167:005BA28C  RET   
0167:005BA28D  JMP      00403794
0167:005BA292  JMP      SHORT 005BA272
0167:005BA294  MOV      ESP,EBP
0167:005BA296  POP      EBP
0167:005BA297  RET   

              註冊驗證的關鍵函式!!!
             
             
0167:0059C7D0  PUSH    EBP
0167:0059C7D1  MOV      EBP,ESP
0167:0059C7D3  ADD      ESP,BYTE -48
0167:0059C7D6  PUSH    EBX
0167:0059C7D7  PUSH    ESI
0167:0059C7D8  PUSH    EDI

0167:0059C7D9  XOR      EBX,EBX
0167:0059C7DB  MOV      [EBP-48],EBX
0167:0059C7DE  MOV      [EBP-44],EBX
0167:0059C7E1  MOV      [EBP-24],EBX
0167:0059C7E4  MOV      [EBP-28],EBX
0167:0059C7E7  MOV      [EBP-2C],EBX
0167:0059C7EA  MOV      [EBP-30],EBX
0167:0059C7ED  MOV      [EBP-34],EBX

0167:0059C7F0  MOV      [EBP-0C],ECX        --> Data2
0167:0059C7F3  MOV      [EBP-08],EDX        --> 機器碼
0167:0059C7F6  MOV      [EBP-04],EAX        --> yitproxy路徑

0167:0059C7F9  MOV      EAX,[EBP-04]
0167:0059C7FC  CALL    004041B4
0167:0059C801  MOV      EAX,[EBP-08]
0167:0059C804  CALL    004041B4
0167:0059C809  MOV      EAX,[EBP-0C]
0167:0059C80C  CALL    004041B4
0167:0059C811  XOR      EAX,EAX
0167:0059C813  PUSH    EBP
0167:0059C814  PUSH    DWORD 0059CAFE
0167:0059C819  PUSH    DWORD [FS:EAX]
0167:0059C81C  MOV      [FS:EAX],ESP
             
              先填寫返回資訊,表示未註冊
             
0167:0059C81F  MOV      EAX,[EBP+14]
0167:0059C822  XOR      EDX,EDX
0167:0059C824  MOV      [EAX],EDX
0167:0059C826  MOV      EAX,[EBP+10]
0167:0059C829  XOR      EDX,EDX
0167:0059C82B  MOV      [EAX],EDX
0167:0059C82D  MOV      EAX,[EBP+0C]
0167:0059C830  XOR      EDX,EDX
0167:0059C832  MOV      [EAX],EDX
0167:0059C834  MOV      EAX,[EBP+08]
0167:0059C837  XOR      EDX,EDX
0167:0059C839  MOV      [EAX],EDX
             
              看看有沒有註冊檔案?
             
0167:0059C83B  LEA      EAX,[EBP-34]
0167:0059C83E  MOV      ECX,0059CB18    --> "yitproxy.exp",註冊檔名
0167:0059C843  MOV      EDX,[EBP-04]
0167:0059C846  CALL    0040404C

0167:0059C84B  MOV      EAX,[EBP-34]
0167:0059C84E  CALL    00409D80
0167:0059C853  TEST    AL,AL          ;註冊檔案不存在,註冊當然不成功
0167:0059C855  JZ      NEAR 0059CAC9
             
              用TMemoryStream來訪問註冊檔案
             
0167:0059C85B  MOV      DL,01
0167:0059C85D  MOV      EAX,[004113A8]  ;TMemoryStream
0167:0059C862  CALL    00403004        ;建立TMemoryStream物件
0167:0059C867  MOV      [EBP-10],EAX    ;新建立的TMemoryStream物件指標
0167:0059C86A  XOR      EDX,EDX
0167:0059C86C  PUSH    EBP
0167:0059C86D  PUSH    DWORD 0059CAC2
0167:0059C872  PUSH    DWORD [FS:EDX]
0167:0059C875  MOV      [FS:EDX],ESP

0167:0059C878  MOV      EDX,[EBP-34]    ;-->註冊檔案
0167:0059C87B  MOV      EAX,[EBP-10]    ;用TMemoryStream開啟註冊檔案 LoadFromFile()
0167:0059C87E  CALL    00415130
             
              用BlowFish演算法對註冊檔案的內容解密

0167:0059C883  MOV      DL,01          ;建立TCipher_BlowFish物件
0167:0059C885  MOV      EAX,[004BCC4C]  ;TCipher_BlowFish
0167:0059C88A  CALL    004BCF14
0167:0059C88F  MOV      [EBP-3C],EAX    ;新建立的TCipher_BlowFish物件指標
0167:0059C892  XOR      EAX,EAX
0167:0059C894  PUSH    EBP
0167:0059C895  PUSH    DWORD 0059C8E5
0167:0059C89A  PUSH    DWORD [FS:EAX]
0167:0059C89D  MOV      [FS:EAX],ESP
0167:0059C8A0  XOR      ECX,ECX
0167:0059C8A2  MOV      EDX,[EBP-0C]    ;Data2是金鑰
0167:0059C8A5  MOV      EAX,[EBP-3C]
0167:0059C8A8  CALL    004BD000

0167:0059C8AD  XOR      EDX,EDX
0167:0059C8AF  MOV      EAX,[EBP-10]    ;移動流指標到檔案頭
0167:0059C8B2  CALL    00414C88
             
              對註冊檔案解密
             
0167:0059C8B7  PUSH    BYTE -01
0167:0059C8B9  MOV      ECX,[EBP-10]
0167:0059C8BC  MOV      EDX,[EBP-10]  ;解密後的資料仍然放在原來的Stream中
0167:0059C8BF  MOV      EAX,[EBP-3C]
0167:0059C8C2  CALL    004BD5C0      ;DecodeStream()
             
              釋放TCipher_BlowFish物件
             
0167:0059C8C7  MOV      EAX,[EBP-3C]
0167:0059C8CA  MOV      EDX,[EAX]
0167:0059C8CC  CALL    NEAR [EDX+28]
0167:0059C8CF  XOR      EAX,EAX
0167:0059C8D1  POP      EDX
0167:0059C8D2  POP      ECX
0167:0059C8D3  POP      ECX
0167:0059C8D4  MOV      [FS:EAX],EDX
0167:0059C8D7  PUSH    DWORD 0059C8EC
0167:0059C8DC  MOV      EAX,[EBP-3C]
0167:0059C8DF  CALL    00403034
0167:0059C8E4  RET   
0167:0059C8E5  JMP      00403794
0167:0059C8EA  JMP      SHORT 0059C8DC
             
              判斷註冊檔案的長度是否合法,正常的註冊檔案長度應該>=1c00h
             
0167:0059C8EC  MOV      EAX,[EBP-10]
0167:0059C8EF  CALL    00414C94
0167:0059C8F4  MOV      [EBP-1C],EAX        ;註冊檔案長度
0167:0059C8F7  CMP      DWORD [EBP-1C],1C00 ;>=1c00h?
0167:0059C8FE  JNL      0059C912

0167:0059C900  MOV      EAX,[EBP-10]
0167:0059C903  CALL    00403034
0167:0059C908  CALL    0040386C
0167:0059C90D  JMP      0059CAC9

              流指標移到檔案頭
0167:0059C912  XOR      EDX,EDX
0167:0059C914  MOV      EAX,[EBP-10]
0167:0059C917  CALL    00414C88
             
              從註冊檔案中讀出10個位元組放到一個字串中 ,[ebp-30]->該字串

0167:0059C91C  LEA      EAX,[EBP-30]
0167:0059C91F  CALL    00403D80
0167:0059C924  MOV      EBX,0A              ;10

0167:0059C929  LEA      EDX,[EBP-35]
0167:0059C92C  MOV      ECX,01              ;讀1個位元組
0167:0059C931  MOV      EAX,[EBP-10]
0167:0059C934  MOV      ESI,[EAX]
0167:0059C936  CALL    NEAR [ESI+04]      ;read
0167:0059C939  LEA      EAX,[EBP-44]
0167:0059C93C  MOV      DL,[EBP-35]
0167:0059C93F  CALL    00403F28
0167:0059C944  MOV      EDX,[EBP-44]
0167:0059C947  LEA      EAX,[EBP-30]
0167:0059C94A  CALL    00404008         
0167:0059C94F  DEC      EBX
0167:0059C950  JNZ      0059C929
             
              [ebp-24] -> 機器碼

0167:0059C952  LEA      EAX,[EBP-24]
0167:0059C955  MOV      EDX,[EBP-08]
0167:0059C958  CALL    00403E18

0167:0059C95D  MOV      DWORD [EBP-18],01    ; 迴圈計數置初值1,註冊型別
0167:0059C964  LEA      EDX,[EBP-48]
0167:0059C967  MOV      EAX,[EBP-18]
0167:0059C96A  CALL    00409A90        ;IntToStr
0167:0059C96F  MOV      EDX,[EBP-48]
0167:0059C972  LEA      EAX,[EBP-08]
0167:0059C975  MOV      ECX,[EBP-24]
0167:0059C978  CALL    0040404C        ;[ebp-8] -> IntToStr([ebp-18]) + 機器碼

0167:0059C97D  MOV      DL,01
0167:0059C97F  MOV      EAX,[004BCC4C]  ;TCipher_BlowFish
0167:0059C984  CALL    004BCF14
0167:0059C989  MOV      [EBP-40],EAX
0167:0059C98C  XOR      EAX,EAX
0167:0059C98E  PUSH    EBP
0167:0059C98F  PUSH    DWORD 0059C9F4
0167:0059C994  PUSH    DWORD [FS:EAX]
0167:0059C997  MOV      [FS:EAX],ESP
0167:0059C99A  MOV      EAX,[EBP-40]
0167:0059C99D  MOV      BYTE [EAX+04],00
0167:0059C9A1  XOR      ECX,ECX
0167:0059C9A3  MOV      EDX,[EBP-08]    ; IntToStr([ebp-18]) + 機器碼 作為金鑰
0167:0059C9A6  MOV      EAX,[EBP-40]
0167:0059C9A9  CALL    004BD000

0167:0059C9AE  LEA      ECX,[EBP-28]
0167:0059C9B1  MOV      EDX,[EBP-30]    ;對檔案頭10個位元組加密
0167:0059C9B4  MOV      EAX,[EBP-40]
0167:0059C9B7  CALL    004BD5D4

              下面對加密後的10個位元組作變換,但是變換後的資料沒用到
              不知道為什麼?無論如何,這方便了序號產生器的編寫:)
             
0167:0059C9BC  MOV      EAX,[EBP-28]    ;加密後的資料
0167:0059C9BF  CALL    00404000        ;length
0167:0059C9C4  PUSH    EAX
0167:0059C9C5  MOV      EAX,[EBP-28]    ;pchar()
0167:0059C9C8  CALL    004041C4
0167:0059C9CD  LEA      ECX,[EBP-2C]    ;[ebp-2c]->變換後的資料,不過這些資料沒有用到
0167:0059C9D0  POP      EDX
0167:0059C9D1  CALL    004B860C        ;變換函式
             
              釋放TCipher_BlowFish物件
             
0167:0059C9D6  MOV      EAX,[EBP-40]
0167:0059C9D9  MOV      EDX,[EAX]
0167:0059C9DB  CALL    NEAR [EDX+28]
0167:0059C9DE  XOR      EAX,EAX
0167:0059C9E0  POP      EDX
0167:0059C9E1  POP      ECX
0167:0059C9E2  POP      ECX
0167:0059C9E3  MOV      [FS:EAX],EDX
0167:0059C9E6  PUSH    DWORD 0059C9FB
0167:0059C9EB  MOV      EAX,[EBP-40]
0167:0059C9EE  CALL    00403034
0167:0059C9F3  RET   
0167:0059C9F4  JMP      00403794
0167:0059C9F9  JMP      SHORT 0059C9EB

0167:0059C9FB  XOR      EAX,EAX
0167:0059C9FD  MOV      [EBP-20],EAX
0167:0059CA00  XOR      EAX,EAX
0167:0059CA02  MOV      [EBP-14],EAX

0167:0059CA05  MOV      EAX,[EBP-28]
0167:0059CA08  CALL    00404000
0167:0059CA0D  MOV      ESI,EAX
0167:0059CA0F  DEC      ESI
0167:0059CA10  TEST    ESI,ESI
0167:0059CA12  JL      0059CA5E
0167:0059CA14  INC      ESI
0167:0059CA15  XOR      EBX,EBX
0167:0059CA17  ADD      [EBP-20],EBX

              移動流指標
             
0167:0059CA1A  MOV      EDX,[EBP-1C]    ;檔案長度
0167:0059CA1D  SUB      EDX,[EBP-20]
0167:0059CA20  DEC      EDX
0167:0059CA21  MOV      EAX,[EBP-10]
0167:0059CA24  CALL    00414C88        ;seek
                                   
              讀入一個位元組
                                   
0167:0059CA29  LEA      EDX,[EBP-35]
0167:0059CA2C  MOV      ECX,01          ;1個位元組
0167:0059CA31  MOV      EAX,[EBP-10]
0167:0059CA34  MOV      EDI,[EAX]
0167:0059CA36  CALL    NEAR [EDI+04]  ;read

0167:0059CA39  MOV      EAX,[EBP-28]
0167:0059CA3C  CALL    004041C4
0167:0059CA41  MOV      AL,[EAX+EBX]
0167:0059CA44  CMP      AL,[EBP-35]    ;相等?
0167:0059CA47  JNZ      0059CA5E        ;不等,註冊不成功

0167:0059CA49  INC      DWORD [EBP-14]
0167:0059CA4C  MOV      EAX,[EBP-28]
0167:0059CA4F  CALL    00404000        ;length
0167:0059CA54  DEC      EAX
0167:0059CA55  CMP      EAX,[EBP-14]
0167:0059CA58  JZ      0059CA5E

0167:0059CA5A  INC      EBX
0167:0059CA5B  DEC      ESI
0167:0059CA5C  JNZ      0059CA17

0167:0059CA5E  MOV      EAX,[EBP-28]
0167:0059CA61  CALL    00404000
0167:0059CA66  DEC      EAX
0167:0059CA67  CMP      EAX,[EBP-14]
0167:0059CA6A  JNZ      0059CA7C
0167:0059CA6C  CMP      DWORD [EBP-14],BYTE +00
0167:0059CA70  JNG      0059CA7C

0167:0059CA72  MOV      EAX,[EBP+08]
0167:0059CA75  MOV      EDX,[EBP-18]
0167:0059CA78  MOV      [EAX],EDX    ;返回註冊型別
0167:0059CA7A  JMP      SHORT 0059CA89
0167:0059CA7C  INC      DWORD [EBP-18]
0167:0059CA7F  CMP      DWORD [EBP-18],BYTE +06
0167:0059CA83  JNZ      NEAR 0059C964

0167:0059CA89  MOV      EAX,[EBP+08]
0167:0059CA8C  CMP      DWORD [EAX],BYTE +00
0167:0059CA8F  JNG      0059CAAC

0167:0059CA91  MOV      EAX,[EBP+14]
0167:0059CA94  MOV      DWORD [EAX],33
0167:0059CA9A  MOV      EAX,[EBP+10]
0167:0059CA9D  MOV      DWORD [EAX],02
0167:0059CAA3  MOV      EAX,[EBP+0C]
0167:0059CAA6  MOV      DWORD [EAX],64
0167:0059CAAC  XOR      EAX,EAX
0167:0059CAAE  POP      EDX
0167:0059CAAF  POP      ECX
0167:0059CAB0  POP      ECX
0167:0059CAB1  MOV      [FS:EAX],EDX
0167:0059CAB4  PUSH    DWORD 0059CAC9
0167:0059CAB9  MOV      EAX,[EBP-10]
0167:0059CABC  CALL    00403034
0167:0059CAC1  RET   
0167:0059CAC2  JMP      00403794
0167:0059CAC7  JMP      SHORT 0059CAB9
0167:0059CAC9  XOR      EAX,EAX
0167:0059CACB  POP      EDX
0167:0059CACC  POP      ECX
0167:0059CACD  POP      ECX
0167:0059CACE  MOV      [FS:EAX],EDX
0167:0059CAD1  PUSH    DWORD 0059CB05
0167:0059CAD6  LEA      EAX,[EBP-48]
0167:0059CAD9  MOV      EDX,02
0167:0059CADE  CALL    00403DA4
0167:0059CAE3  LEA      EAX,[EBP-34]
0167:0059CAE6  MOV      EDX,05
0167:0059CAEB  CALL    00403DA4
0167:0059CAF0  LEA      EAX,[EBP-0C]
0167:0059CAF3  MOV      EDX,03
0167:0059CAF8  CALL    00403DA4
0167:0059CAFD  RET   
0167:0059CAFE  JMP      00403794
0167:0059CB03  JMP      SHORT 0059CAD6
0167:0059CB05  POP      EDI
0167:0059CB06  POP      ESI
0167:0059CB07  POP      EBX
0167:0059CB08  MOV      ESP,EBP
0167:0059CB0A  POP      EBP

相關文章