• 标 题:英语会话精灵 2.0 --谨以此文献给初学破解的爱好者 (7千字)
  • 作 者:youth[chat001]
  • 时 间:2002-11-25 14:18:20
  • 链 接:http://bbs.pediy.com

英语会话精灵 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 中午]