软件:亿特代理服务器简易版,版本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
- 标 题:亿特代理服务器简易版破解手记 (15千字)
- 作 者:sunrix
- 时 间:2002-9-19 10:46:42
- 链 接:http://bbs.pediy.com