• 标 题:亿特代理服务器简易版破解手记 (15千字)
  • 作 者:sunrix
  • 时 间:2002-9-19 10:46:42
  • 链 接:http://bbs.pediy.com

软件:亿特代理服务器简易版,版本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