英语会话精灵 2.0
[Cracked on 11-25-2002 by youth]
平台:Windows 2000
Professional
工具:pe-scan 3.31 ollydbg 1.08 lordpe
1.4
1、脱壳
经pe-scan3.31检测,此软件用aspack 2.12加壳。
用ollydbg载入,停在壳的入口处,向下寻找popad指令,下断点,运行后在断点处中断,单步至oep。
运行lordpe,找到该程序的进程后[dump full],然后修改oep为正确的oep,再自动修复输入表。
至此,程序已经脱壳成功。
2、运行未注册的此程序,在注册时,输入不正确的注册码后,会提示注册失败。因此,可以通过拦截user32:ShowWindow 这一API函数。拦截成功并返回到程序的领空后,来到了这里:
0047A058 /. 55 PUSH EBP
、、、
0047A07A |. 6A 00 PUSH 0
0047A07C |. 6A 1B PUSH 1B
0047A07E
|. E8 5DFDFFFF CALL untopbar.00479DE0
0047A083 |. 2D 1F17F601
SUB EAX,1F6171F
;eax为16进制的用户编号 UserNo=UserNo-0x1f6171f
0047A088 |. 83DA 00 SBB EDX,0
0047A08B
|. E8 E0C4F8FF CALL untopbar.00406570
;UserNo=UserNo*0x1b
0047A090 |.
52 PUSH EDX
; /Arg2
0047A091 |. 50 PUSH
EAX
; |Arg1:UserNo
0047A092 |. 8D45
FC LEA EAX,DWORD PTR SS:[EBP-4]
; |
0047A095 |. E8 0EE9F8FF CALL
untopbar.004089A8
; \untopbar.004089A8 计算真正的注册码
0047A09A |. 8B45 FC
MOV EAX,DWORD PTR SS:[EBP-4]
0047A09D |. 50
PUSH EAX
0047A09E |. 8D55 F4
LEA EDX,DWORD PTR SS:[EBP-C]
0047A0A1 |. 8B86 E8020000
MOV EAX,DWORD PTR DS:[ESI+2E8]
0047A0A7 |. E8 E849FBFF
CALL untopbar.0042EA94
0047A0AC |. 8B45 F4
MOV EAX,DWORD PTR SS:[EBP-C]
0047A0AF |. 8D55 F8
LEA EDX,DWORD PTR SS:[EBP-8]
0047A0B2 |. E8 41E7F8FF
CALL untopbar.004087F8
0047A0B7 |. 8B55 F8
MOV EDX,DWORD PTR SS:[EBP-8]
0047A0BA |. 58
POP EAX
0047A0BB |. E8 E49DF8FF CALL untopbar.00403EA4
;和真正的注册码依次按位比较
0047A0C0
|. 0F85 3D010000 JNZ untopbar.0047A203
;不同则跳转,注册失败
0047A0C6 |. 68 40000400
PUSH 40040
0047A0CB |. B9 6CA24700 MOV ECX,untopbar.0047A26C
0047A0D0 |. BA 7CA24700 MOV EDX,untopbar.0047A27C
、、、
0047A201 |. EB 29 JMP SHORT untopbar.0047A22C
0047A203 |> 68 30000400 PUSH 40030
;/
0047A208 |. B9 6CA24700 MOV ECX,untopbar.0047A26C
;|
0047A20D |. BA D0A24700
MOV EDX,untopbar.0047A2D0
;|
0047A212 |. A1 E8794B00 MOV EAX,DWORD PTR DS:[4B79E8]
;|
0047A217 |. 8B00
MOV EAX,DWORD PTR DS:[EAX]
;|
0047A219 |. E8 462AFDFF CALL untopbar.0044CC64
;\显示“注册码无效”窗口
0047A21E
|. 8B86 E8020000 MOV EAX,DWORD PTR DS:[ESI+2E8]
0047A224 |. 8B10
MOV EDX,DWORD PTR DS:[EAX]
0047A226 |.
FF92 CC000000 CALL DWORD PTR DS:[EDX+CC]
0047A22C |> 33C0
XOR EAX,EAX
、、、
0047A25E \. C3
RETN
由0047A095处跟踪进出后,来到这里,也就是该软件根据用户编号算出注册码的核心过程:
0040916B |> 51 /PUSH ECX
0040916C |. 6A 00 |PUSH 0
0040916E
|. 51 |PUSH ECX
0040916F |.
8B03 |MOV EAX,DWORD PTR DS:[EBX]
;/初始值为:(UserNo-0x1f6171f)*0x1b,见0047A083-0047A08B
00409171
|. 8B53 04 |MOV EDX,DWORD PTR DS:[EBX+4]
;\
00409174 |. E8 DCD5FFFF |CALL untopbar.00406755
00409179 |. 59 |POP ECX
0040917A |. 92 |XCHG EAX,EDX
0040917B |. 80C2 30 |ADD DL,30
0040917E
|. 80FA 3A |CMP DL,3A
00409181 |.
72 03 |JB SHORT untopbar.00409186
00409183
|. 80C2 07 |ADD DL,7
00409186 |> 4E
|DEC ESI
00409187 |. 8816
|MOV BYTE PTR DS:[ESI],DL
00409189
|. 51 |PUSH ECX
0040918A |.
6A 00 |PUSH 0
0040918C |. 51
|PUSH ECX
0040918D |. 8B03
|MOV EAX,DWORD PTR DS:[EBX]
0040918F
|. 8B53 04 |MOV EDX,DWORD PTR DS:[EBX+4]
00409192
|. E8 C9D4FFFF |CALL untopbar.00406660
00409197 |. 59
|POP ECX
00409198 |. 8903
|MOV DWORD PTR DS:[EBX],EAX
0040919A |.
8953 04 |MOV DWORD PTR DS:[EBX+4],EDX
0040919D
|. 09D0 |OR EAX,EDX
0040919F |.^75
CA \JNZ SHORT untopbar.0040916B
=VV==<<由00409174调用>>==VV===============================================================
(此过程很简单,就是将16进制转化为10进制后输出)
00406755 /$ 55
PUSH EBP
00406756 |. 53
PUSH EBX
00406757 |. 56
PUSH ESI
00406758 |. 57
PUSH EDI
00406759 |. 8B5C24 14 MOV EBX,DWORD PTR
SS:[ESP+14]
0040675D |. 8B4C24 18 MOV ECX,DWORD
PTR SS:[ESP+18]
00406761 |. 0BC9
OR ECX,ECX
00406763 |. 75 08 JNZ
SHORT untopbar.0040676D
00406765 |. 0BD2
OR EDX,EDX
00406767 |. 74 33
JE SHORT untopbar.0040679C
00406769 |. 0BDB
OR EBX,EBX
0040676B |. 74 2F
JE SHORT untopbar.0040679C
0040676D |> 8BE9
MOV EBP,ECX
0040676F |. B9 40000000 MOV ECX,40
00406774 |. 33FF XOR EDI,EDI
00406776 |. 33F6 XOR ESI,ESI
00406778
|> D1E0 /SHL EAX,1
0040677A |. D1D2
|RCL EDX,1
0040677C |. D1D6
|RCL ESI,1
0040677E |. D1D7
|RCL EDI,1
00406780 |. 3BFD
|CMP EDI,EBP
00406782 |. 72 0B
|JB SHORT untopbar.0040678F
00406784 |. 77 04
|JA SHORT untopbar.0040678A
00406786 |. 3BF3
|CMP ESI,EBX
00406788 |. 72 05
|JB SHORT untopbar.0040678F
0040678A |> 2BF3
|SUB ESI,EBX
0040678C |. 1BFD
|SBB EDI,EBP
0040678E |. 40
|INC EAX
0040678F |>^E2 E7
\LOOPD SHORT untopbar.00406778
00406791 |. 8BC6
MOV EAX,ESI
00406793 |. 8BD7
MOV EDX,EDI
00406795 |> 5F
POP EDI
00406796 |. 5E
POP ESI
00406797 |. 5B POP
EBX
00406798 |. 5D POP EBP
00406799 |. C2 0800 RETN 8
0040679C
|> F7F3 DIV EBX
0040679E |. 92
XCHG EAX,EDX
0040679F |. 33D2
XOR EDX,EDX
004067A1 \.^EB F2
JMP SHORT untopbar.00406795
到这里,我们就弄清了此软件的算号方法。其实很简单(用calc即可算出,呵呵):
UserNo:软件给出的用户编号
RegCode:由(UserNo-0x1f6171f)*0x1b转化成10进制后得到
在前面注册成功后,通过拦截advapi32.RegSetValueExA,会到达这里把正确的注册码写入注册表:
00453130
/$ 53 PUSH EBX
00453131 |.
56 PUSH ESI
00453132 |. 57
PUSH EDI
00453133 |. 8BF1
MOV ESI,ECX
00453135 |. 8BFA
MOV EDI,EDX
00453137 |. 8BD8
MOV EBX,EAX
00453139 |. 8BC6
MOV EAX,ESI
0045313B |. E8 540CFBFF CALL untopbar.00403D94
00453140 |. 40 INC EAX
;注册码长度,由软件给出的注册码长度为0x0a
00453141 |. 50
PUSH EAX
00453142 |. 6A 01
PUSH 1
00453144 |. 8BC6
MOV EAX,ESI
00453146 |. E8 0D0EFBFF CALL
untopbar.00403F58
0045314B |. 8BC8
MOV ECX,EAX
; |注册码
0045314D |. 8BD7
MOV EDX,EDI
; |由软件计算出的注册码在[12f5e0],即[ebp-4]
0045314F |. 8BC3 MOV EAX,EBX
; |
00453151 |. E8 5E010000 CALL untopbar.004532B4
; \untopbar.004532B4
写入注册表
00453156 |. 5F POP EDI
00453157 |. 5E POP ESI
00453158 |. 5B POP EBX
00453159
\. C3 RETN
这里同时给出另外一种修改方法,输入任意注册码注册后,会把正确的注册码写入注册表:
(如果注册码很难计算出的话,就可以用这个对付了,不是吗)
47A0BB:E8E49DF8FF 0F853D010000 684000000400
909090909090
453139:8BD8 8BC6E8540CFBFF 40506A01 8BC6E80D0EFBFF
B80A0000009090 8B45FC90909090
[2002-11-25 中午]
- 标 题:英语会话精灵 2.0 --谨以此文献给初学破解的爱好者 (7千字)
- 作 者:youth[chat001]
- 时 间:2002-11-25
14:18:20
- 链 接:http://bbs.pediy.com