【破文作者】   血草[DFCG]
【文章题目】   光驱伴侣算法
【软件名称】   光驱伴侣V1.2
【下载地址】   http://www.skycn.com/soft/13453.html
【破解工具】   PEID,OD  
【破解平台】   Win9x/NT/2000/XP/XP SP2
【文章简介】

一个小小的软件,算法也简单,很适合入门。

----------------------------------------------------------------------------------------------
【破解过程】

1 首先运行软件,弹出注册框 ,任意输入用户名和密码后按注册,没有任何提示,
   想想需要的API: GetDlgItemTextA, GetWindowsTextA ,LstrLenA.EndDialog.
2 启动PIED,测壳。显示Microsoft Visual C++ 6.0   ^_^可以偷懒了,最怕脱壳;
3  OD载入软件,插件查看字符串 ,无有用字符串;
4  OD右键->查找->当前模块中的名称  发现有 LstrLenA  右键->在每个参考上设置断点
    F9运行。。

00403B80  /$  83EC 18       SUB ESP,18
00403B83  |.  8D4424 00     LEA EAX,DWORD PTR SS:[ESP]
00403B87  |.  53            PUSH EBX
00403B88  |.  55            PUSH EBP
00403B89  |.  56            PUSH ESI
00403B8A  |.  57            PUSH EDI
00403B8B  |.  50            PUSH EAX
00403B8C  |.  E8 2FFFFFFF   CALL cdpartne.00403AC0
00403B91  |.  8B7C24 2C     MOV EDI,DWORD PTR SS:[ESP+2C]
00403B95  |.  57            PUSH EDI                                  ; /String
00403B96  |.  FF15 64604000 CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>]  ; \lstrlenA    拦截到这里
00403B9C  |.  83F8 14       CMP EAX,14                                ;  比较注册码是否为20位
00403B9F  |.  0F85 AB000000 JNZ cdpartne.00403C50                     ;  不相等那就去试用吧^_^
00403BA5  |.  8A07          MOV AL,BYTE PTR DS:[EDI]                  ;  取注册码第一位去EAX的低位字节AL
00403BA7  |.  3C 44         CMP AL,44
00403BA9  |.  75 04         JNZ SHORT cdpartne.00403BAF               ;  比较第一位是否是D,不是就跳
00403BAB  |.  33ED          XOR EBP,EBP                               ;  是D则EBP为0 这个后面有用
00403BAD  |.  EB 23         JMP SHORT cdpartne.00403BD2
00403BAF  |>  3C 39         CMP AL,39                                 ;  是9吗?不是下去
00403BB1  |.  75 07         JNZ SHORT cdpartne.00403BBA
00403BB3  |.  BD 01000000   MOV EBP,1                                 ;  ebp为1
00403BB8  |.  EB 18         JMP SHORT cdpartne.00403BD2
00403BBA  |>  3C 41         CMP AL,41                                 ;  A同理就不解释了^_^
00403BBC  |.  75 07         JNZ SHORT cdpartne.00403BC5
00403BBE  |.  BD 02000000   MOV EBP,2                                 ;  ebp为2
00403BC3  |.  EB 0D         JMP SHORT cdpartne.00403BD2
00403BC5  |>  3C 35         CMP AL,35                                 ;  5
00403BC7  |.  0F85 83000000 JNZ cdpartne.00403C50                     ;  还不清醒啊 咳。
00403BCD  |.  BD 03000000   MOV EBP,3                                 ;  ebp为3
00403BD2  |>  33DB          XOR EBX,EBX
00403BD4  |.  BE 01000000   MOV ESI,1                                 ;  计数器=1
00403BD9  |>  8A143E        /MOV DL,BYTE PTR DS:[ESI+EDI]             ;  每次取1位到DL
00403BDC  |.  33C9          |XOR ECX,ECX                              ;  清0开始工作
00403BDE  |>  3891 EC914000 |/CMP BYTE PTR DS:[ECX+4091EC],DL         ;  从16H内查询有没有跟你输入一样的
00403BE4  |.  74 06         ||JE SHORT cdpartne.00403BEC              ;  第一不是那就移动呗
00403BE6  |.  41            ||INC ECX                                 ;  就16位注意速度哦^_^
00403BE7  |.  83F9 10       ||CMP ECX,10
00403BEA  |.^ 7C F2         |\JL SHORT cdpartne.00403BDE              ;  循环找16次
00403BEC  |>  83F9 10       |CMP ECX,10
00403BEF  |.  74 5F         |JE SHORT cdpartne.00403C50               ;  刚只想到小于再看看等于16位不
00403BF1  |.  8D04EB        |LEA EAX,DWORD PTR DS:[EBX+EBP*8]         ;  刚起头不一样时候的EBP有用了
00403BF4  |.  3B3485 6C9140>|CMP ESI,DWORD PTR DS:[EAX*4+40916C]      ;  根据(EBX+EBP*8)*4+40916C来决定比较那位
00403BFB  |.  75 29         |JNZ SHORT cdpartne.00403C26              ;  不相等就下去
00403BFD  |.  8A543E FF     |MOV DL,BYTE PTR DS:[ESI+EDI-1]           ;  后退一位的值交给DL
00403C01  |.  33C0          |XOR EAX,EAX
00403C03  |>  3890 EC914000 |/CMP BYTE PTR DS:[EAX+4091EC],DL
00403C09  |.  74 06         ||JE SHORT cdpartne.00403C11
00403C0B  |.  40            ||INC EAX
00403C0C  |.  83F8 10       ||CMP EAX,10
00403C0F  |.^ 7C F2         |\JL SHORT cdpartne.00403C03
00403C11  |>  03C6          |ADD EAX,ESI                              ;  EAX=此次数+总循环的次数
00403C13  |.  25 0F000080   |AND EAX,8000000F                         ;  做与运算
00403C18  |.  79 05         |JNS SHORT cdpartne.00403C1F
00403C1A  |.  48            |DEC EAX
00403C1B  |.  83C8 F0       |OR EAX,FFFFFFF0
00403C1E  |.  40            |INC EAX
00403C1F  |>  3BC8          |CMP ECX,EAX                              ;  比较
00403C21  |.  75 2D         |JNZ SHORT cdpartne.00403C50
00403C23  |.  43            |INC EBX
00403C24  |.  EB 15         |JMP SHORT cdpartne.00403C3B
00403C26  |>  33C0          |XOR EAX,EAX                              ;  清空
00403C28  |>  3890 EC914000 |/CMP BYTE PTR DS:[EAX+4091EC],DL
00403C2E  |.  74 06         ||JE SHORT cdpartne.00403C36
00403C30  |.  40            ||INC EAX
00403C31  |.  83F8 10       ||CMP EAX,10
00403C34  |.^ 7C F2         |\JL SHORT cdpartne.00403C28              ;  
00403C36  |>  83F8 10       |CMP EAX,10
00403C39  |.  74 15         |JE SHORT cdpartne.00403C50
00403C3B  |>  46            |INC ESI                                  ;  加1次
00403C3C  |.  83FE 14       |CMP ESI,14                               ;  到20了没。没有继续
00403C3F  |.^ 7C 98         \JL SHORT cdpartne.00403BD9
00403C41  |.  5F            POP EDI
00403C42  |.  5E            POP ESI
00403C43  |.  5D            POP EBP
00403C44  |.  B8 01000000   MOV EAX,1    标志位为1
00403C49  |.  5B            POP EBX
00403C4A  |.  83C4 18       ADD ESP,18
00403C4D  |.  C2 0400       RETN 4
00403C50  |>  5F            POP EDI
00403C51  |.  5E            POP ESI
00403C52  |.  5D            POP EBP
00403C53  |.  33C0          XOR EAX,EAX
00403C55  |.  5B            POP EBX
00403C56  |.  83C4 18       ADD ESP,18
00403C59  \.  C2 0400       RETN 4
 
00402A40  /$  56            PUSH ESI
00402A41  |.  8BF1          MOV ESI,ECX
00402A43  |.  57            PUSH EDI
00402A44  |.  8D86 68010000 LEA EAX,DWORD PTR DS:[ESI+168]
00402A4A  |.  8DBE 78020000 LEA EDI,DWORD PTR DS:[ESI+278]
00402A50  |.  50            PUSH EAX                                 ; /IniFileName
00402A51  |.  6A 15         PUSH 15                                  ; |BufSize = 15 (21.)
00402A53  |.  57            PUSH EDI                                 ; |ReturnBuffer
00402A54  |.  68 10944000   PUSH cdpartne.00409410                   ; |Default = ""
00402A59  |.  68 28914000   PUSH cdpartne.00409128                   ; |licensecode
00402A5E  |.  68 20914000   PUSH cdpartne.00409120                   ; |license
00402A63  |.  FF15 54604000 CALL DWORD PTR DS:[<&KERNEL32.GetPrivate>; \GetPrivateProfileStringA
00402A69  |.  57            PUSH EDI                                 ; /Arg1 = 0012F88C
00402A6A  |.  8D8E 6C020000 LEA ECX,DWORD PTR DS:[ESI+26C]           ; |
00402A70  |.  E8 0B110000   CALL cdpartne.00403B80                   ; \cdpartne.00403B80    返回到这里
00402A75  |.  85C0          TEST EAX,EAX    标志为测试
00402A77  |.  75 09         JNZ SHORT cdpartne.00402A82      不为零则后面写入INI文件,提示注册成功。
00402A79  |.  8986 74020000 MOV DWORD PTR DS:[ESI+274],EAX
00402A7F  |.  5F            POP EDI
00402A80  |.  5E            POP ESI
00402A81  |.  C3            RETN




----------------------------------------------------------------------------------------------
【破解心得】

   软件根据第一位来选定需要比较的注册码位置  需要比较的注册码=前一位+此位-1
   比如:我第一位输入的是 5 ,则判断 第 6,7,10,13,16,17,19,20位。
   第6位=第5位的数字+6-1。


----------------------------------------------------------------------------------------------
【破解声明】   算法千变万化,但汇编代码只有那些。

【版权声明】   本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 
----------------------------------------------------------------------------------------------