【文章标题】: 生活小管家 算法分析
【文章作者】: KAN-LI
【作者邮箱】: TOM8147@HOTMAIL.COM
【软件名称】: 生活小管家 1。0
【软件大小】: 960 KB
【下载地址】: http://www.softreg.com.cn/shareware_view.aspx?id=/9DB89468-EB62-452B-B415-FE5718DFA291/
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: 0D PEID
【操作平台】: WINXP SP2
【作者声明】: 只是感兴趣,没有其他目的
--------------------------------------------------------------------------------
【详细过程】
  昨天在其他论坛,看有人发布这个软件的破解,闲着没事,下载来看看,原来是内存注册机,我们学习破解的人当然想看看它的算法是如何生成
  的,于是就用 OD 跟了一下,难度不高,但走的路有点长,第一次发破文,很多不到的地方,大家见谅
    —————————————————————————————————————————————
  
  OD 载入用万能断点很容易跑道算法的地方:先 F9 启动软件 随意输入 16 个字符,然后在插件里找到 ApiBreak - API 断点-万能断点
  把里面的勾打上,从新到注册框 点击 确定,中断 ALT+F9 返回用户代码,F8 跑,当返回系统领空时 也用 ALT + F9 返回,很快到下面
  
  0040EA5E   .  E8 02130200   CALL 生活小管.0042FD65                            ;这里下断点 
  0040EA63   .  8B46 74       MOV EAX,DWORD PTR DS:[ESI+74]            ;  假码
  0040EA66   .  8378 F4 10    CMP DWORD PTR DS:[EAX-C],10              ;  注册码必须要 16 个数字
  0040EA6A   .  8D7E 74       LEA EDI,DWORD PTR DS:[ESI+74]
  0040EA6D   .  74 24         JE SHORT 生活小管.0040EA93
  0040EA6F   .  6A 00         PUSH 0
  0040EA71   .  68 C8F64300   PUSH 生活小管.0043F6C8
  0040EA76   .  68 FC104400   PUSH 生活小管.004410FC
  0040EA7B   .  8BCE          MOV ECX,ESI
  0040EA7D   .  E8 85120200   CALL 生活小管.0042FD07                       ;  错误
  0040EA82   .  5F            POP EDI
  0040EA83   .  5E            POP ESI
  0040EA84   .  8B4C24 0C     MOV ECX,DWORD PTR SS:[ESP+C]
  0040EA88   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
  0040EA8F   .  83C4 18       ADD ESP,18
  0040EA92   .  C3            RETN
  0040EA93   >  55            PUSH EBP
  0040EA94   .  E8 75030200   CALL 生活小管.0042EE0E
  0040EA99   .  8B10          MOV EDX,DWORD PTR DS:[EAX]
  0040EA9B   .  8BC8          MOV ECX,EAX
  0040EA9D   .  FF52 0C       CALL DWORD PTR DS:[EDX+C]
  0040EAA0   .  83C0 10       ADD EAX,10
  0040EAA3   .  894424 10     MOV DWORD PTR SS:[ESP+10],EAX
  0040EAA7   .  8D4424 10     LEA EAX,DWORD PTR SS:[ESP+10]
  0040EAAB   .  50            PUSH EAX
  0040EAAC   .  8D6E 70       LEA EBP,DWORD PTR DS:[ESI+70]
  0040EAAF   .  55            PUSH EBP
  0040EAB0   .  8D4C24 1C     LEA ECX,DWORD PTR SS:[ESP+1C]
  0040EAB4   .  C74424 28 000>MOV DWORD PTR SS:[ESP+28],0
  
  0040EABC   .  E8 0F77FFFF   CALL 生活小管.004061D0                   ;  关键 CALL ,F7 跟进
  0040EAC1   .  8B07          MOV EAX,DWORD PTR DS:[EDI]               ;  假码
  0040EAC3   .  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]            ;  注册码
  0040EAC7   .  50            PUSH EAX
  0040EAC8   .  51            PUSH ECX
  0040EAC9   .  E8 9CE90000   CALL 生活小管.0041D46A
  0040EACE   .  83C4 08       ADD ESP,8
  0040EAD1   .  85C0          TEST EAX,EAX
  0040EAD3   .  74 4B         JE SHORT 生活小管.0040EB20
  0040EAD5   .  6A 00         PUSH 0
  0040EAD7   .  68 C8F64300   PUSH 生活小管.0043F6C8
  0040EADC   .  68 FC104400   PUSH 生活小管.004410FC                       ;  注册码不正确,请检查重试!
  0040EAE1   .  8BCE          MOV ECX,ESI
  0040EAE3   .  E8 1F120200   CALL 生活小管.0042FD07
  0040EAE8   .  6A 00         PUSH 0
  0040EAEA   .  68 F8FA4300   PUSH 生活小管.0043FAF8
  0040EAEF   .  8BCF          MOV ECX,EDI
  0040EAF1   .  E8 3A2FFFFF   CALL 生活小管.00401A30
  0040EAF6   .  6A 00         PUSH 0
  0040EAF8   .  8BCE          MOV ECX,ESI
  0040EAFA   .  E8 66120200   CALL 生活小管.0042FD65
  0040EAFF   .  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
  0040EB03   .  83C0 F0       ADD EAX,-10
  0040EB06   .  C74424 20 FFF>MOV DWORD PTR SS:[ESP+20],-1
  0040EB0E   .  8D50 0C       LEA EDX,DWORD PTR DS:[EAX+C]
  0040EB11   .  83C9 FF       OR ECX,FFFFFFFF
  0040EB14   .  F0:0FC10A     LOCK XADD DWORD PTR DS:[EDX],ECX         ;  锁定前缀
  0040EB18   .  49            DEC ECX
  0040EB19   .  85C9          TEST ECX,ECX
  0040EB1B   .  E9 F5000000   JMP 生活小管.0040EC15
  0040EB20   >  E8 E9020200   CALL 生活小管.0042EE0E
  0040EB25   .  8B10          MOV EDX,DWORD PTR DS:[EAX]
  0040EB27   .  8BC8          MOV ECX,EAX
  0040EB29   .  FF52 0C       CALL DWORD PTR DS:[EDX+C]
  0040EB2C   .  83C0 10       ADD EAX,10
  0040EB2F   .  894424 0C     MOV DWORD PTR SS:[ESP+C],EAX
  0040EB33   .  68 F0F84300   PUSH 生活小管.0043F8F0                       ;  sys_Authorise#
  0040EB38   .  8D4424 10     LEA EAX,DWORD PTR SS:[ESP+10]
  0040EB3C   .  68 E8104400   PUSH 生活小管.004410E8                       ;  delete * from %s
  0040EB41   .  50            PUSH EAX
  0040EB42   .  C64424 2C 01  MOV BYTE PTR SS:[ESP+2C],1
  0040EB47   .  E8 3435FFFF   CALL 生活小管.00402080
  0040EB4C   .  83C4 0C       ADD ESP,0C
  0040EB4F   .  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
  0040EB53   .  51            PUSH ECX
  0040EB54   .  B9 80234500   MOV ECX,生活小管.00452380
  0040EB59   .  E8 7253FFFF   CALL 生活小管.00403ED0
  0040EB5E   .  8B17          MOV EDX,DWORD PTR DS:[EDI]
  0040EB60   .  8B45 00       MOV EAX,DWORD PTR SS:[EBP]
  0040EB63   .  52            PUSH EDX
  0040EB64   .  50            PUSH EAX
  0040EB65   .  68 F0F84300   PUSH 生活小管.0043F8F0                       ;  sys_Authorise#
  0040EB6A   .  8D4C24 18     LEA ECX,DWORD PTR SS:[ESP+18]
  0040EB6E   .  68 0CF84300   PUSH 生活小管.0043F80C                       ;  insert into %s values('%s','%s')
  0040EB73   .  51            PUSH ECX
  0040EB74   .  E8 0735FFFF   CALL 生活小管.00402080
  0040EB79   .  83C4 14       ADD ESP,14
  0040EB7C   .  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
  0040EB80   .  52            PUSH EDX
  0040EB81   .  B9 80234500   MOV ECX,生活小管.00452380
  0040EB86   .  E8 4553FFFF   CALL 生活小管.00403ED0
  0040EB8B   .  84C0          TEST AL,AL
  0040EB8D   .  8BCE          MOV ECX,ESI
  0040EB8F   .  6A 00         PUSH 0
  0040EB91   .  75 26         JNZ SHORT 生活小管.0040EBB9
  0040EB93   .  68 C8F64300   PUSH 生活小管.0043F6C8                       ;  错误
  0040EB98   .  68 C8104400   PUSH 生活小管.004410C8                       ;  注册信息写入失败,请检查重试!
  0040EB9D   .  E8 65110200   CALL 生活小管.0042FD07
  0040EBA2   .  68 F8FA4300   PUSH 生活小管.0043FAF8
  0040EBA7   .  8BCF          MOV ECX,EDI
  0040EBA9   .  E8 023DFFFF   CALL 生活小管.004028B0
  0040EBAE   .  6A 00         PUSH 0
  0040EBB0   .  8BCE          MOV ECX,ESI
  0040EBB2   .  E8 AE110200   CALL 生活小管.0042FD65
  0040EBB7   .  EB 1D         JMP SHORT 生活小管.0040EBD6
  0040EBB9   >  68 CCFE4300   PUSH 生活小管.0043FECC                       ;  提示
  0040EBBE   .  68 98104400   PUSH 生活小管.00441098                       ;  恭喜您,注册已成功!祝你使用愉快,开开心心每一天!
  
  ___________________________________________________________________________
  
  F7 跟进 0040EABC 后,省略 N 多代码来到下面
  
  00406231   .  8B03          MOV EAX,DWORD PTR DS:[EBX]               ;  机器码
  00406233   .  55            PUSH EBP
  00406234   .  50            PUSH EAX
  00406235   .  56            PUSH ESI
  00406236   .  E8 15800100   CALL 生活小管.0041E250
  0040623B   .  83C4 10       ADD ESP,10
  0040623E   .  33C9          XOR ECX,ECX
  00406240   .  85ED          TEST EBP,EBP
  00406242   .  7E 1C         JLE SHORT 生活小管.00406260
  
  00406244   >  8A0431        MOV AL,BYTE PTR DS:[ECX+ESI]  ;第一段 算法 开始 取机器码字符
  00406247   .  02C1          ADD AL,CL                     ;CL 是循环次数
  00406249   .  8AD1          MOV DL,CL                     ;循环次数送入 DL
  0040624B   .  FEC0          INC AL                        ;AL + 1
  0040624D   .  C0E2 02       SHL DL,2                      ;DL * 4
  00406250   .  32C2          XOR AL,DL                    ;AL 和 DL 做异或 运算,结果如 AL
  00406252   .  3C 30         CMP AL,30                    ;比较 AL 的结果是否 30
  00406254   .  75 02         JNZ SHORT 生活小管.00406258
  00406256   .  B0 65         MOV AL,65                    ;是就给 AL 赋值为 65
  00406258   >  880431        MOV BYTE PTR DS:[ECX+ESI],AL ;把结果送入内存
  0040625B   .  41            INC ECX                      ;cx + 1 用做循环
  0040625C   .  3BCD          CMP ECX,EBP
  0040625E   .^ 7C E4         JL SHORT 生活小管.00406244  ;跳回上面从新开始计算下一个机器码
  
                                                          ;以上结果保存下来,留做下一轮计算
  00406260   > \56            PUSH ESI
  00406261   .  8D4C24 2C     LEA ECX,DWORD PTR SS:[ESP+2C]
  00406265   .  E8 96C8FFFF   CALL 生活小管.00402B00
  0040626A   .  8D4424 28     LEA EAX,DWORD PTR SS:[ESP+28]
  0040626E   .  50            PUSH EAX
  0040626F   .  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]
  00406273   .  51            PUSH ECX
  00406274   .  8B4C24 1C     MOV ECX,DWORD PTR SS:[ESP+1C]
  00406278   .  C74424 28 000>MOV DWORD PTR SS:[ESP+28],0
  00406280   .  E8 BBFBFFFF   CALL 生活小管.00405E40               ;  产生注册码 F7 跟进
  
  ————————————————————————————————————————————
  F7 跟入 00406280 后,省略 N 多代码来到下面 (按 F8 键一直走)
  来到这个 CALL ,郁闷啊 跑完一个有一个 的 CALL 
  00405F34   .  E8 A7FBFFFF   CALL 生活小管.00405AE0                       ;  跟进
  
  ————————————————————————————————————————————
  进入后 (00405F34),代码长啊,又 省略 部分代码
  
  00405B72  |> /75 0F         /JNZ SHORT 生活小管.00405B83                 ;  可疑
  00405B74  |. |8B4424 10     |MOV EAX,DWORD PTR SS:[ESP+10]
  00405B78  |. |99            |CDQ
  00405B79  |. |83E2 03       |AND EDX,3
  00405B7C  |. |03C2          |ADD EAX,EDX
  00405B7E  |. |8BE8          |MOV EBP,EAX
  00405B80  |. |C1FD 02       |SAR EBP,2
  00405B83  |> |85ED          |TEST EBP,EBP
  00405B85  |. |7E 6B         |JLE SHORT 生活小管.00405BF2
  00405B87  |. |8BD5          |MOV EDX,EBP
  00405B89  |. |8DA424 000000>|LEA ESP,DWORD PTR SS:[ESP]
  00405B90  |> |0FB60E        |/MOVZX ECX,BYTE PTR DS:[ESI]            ;  算法开始,第一个字符送入 ECX
  00405B93  |. |0FB646 01     ||MOVZX EAX,BYTE PTR DS:[ESI+1]          ;  第二个字符入 EAX
  00405B97  |. |C1E1 08       ||SHL ECX,8                              ;  CX * 256
  00405B9A  |. |0BC8          ||OR ECX,EAX                             ;  逻辑 或 运算,结果入 ECX
  00405B9C  |. |46            ||INC ESI                                ;  SI + 1
  00405B9D  |. |0FB646 01     ||MOVZX EAX,BYTE PTR DS:[ESI+1]          ;  第三个字符入 EAX
  00405BA1  |. |C1E1 08       ||SHL ECX,8                              ;  CX * 256
  00405BA4  |. |0BC8          ||OR ECX,EAX                             ;  逻辑 或 运算 ,结果入 ECX
  00405BA6  |. |46            ||INC ESI                                ;  SI + 1
  00405BA7  |. |C1E1 08       ||SHL ECX,8                              ;  CX * 256
  00405BAA  |. |8BC1          ||MOV EAX,ECX                            ;  把上面计算结果入  EAX
  00405BAC  |. |C1E8 1A       ||SHR EAX,1A                             ;  除以 47108864
  00405BAF  |. |8A80 98FA4300 ||MOV AL,BYTE PTR DS:[EAX+43FA98]        ;  又一个查表,把上面 AX结果+43FA98(地址)
  00405BB5  |. |8807          ||MOV BYTE PTR DS:[EDI],AL               ;  产生第一个真码字符
  00405BB7  |. |C1E1 06       ||SHL ECX,6                              ;  CX*64
  00405BBA  |. |8BC1          ||MOV EAX,ECX                            ;  CX 的值入 AX
  00405BBC  |. |C1E8 1A       ||SHR EAX,1A                             ;  AX 逻辑右移 1A
  00405BBF  |. |8A80 98FA4300 ||MOV AL,BYTE PTR DS:[EAX+43FA98]        ;  从 AX + 地址 43FA98 取出第二个真码入 AL
  00405BC5  |. |8847 01       ||MOV BYTE PTR DS:[EDI+1],AL             ;  把第二个真码送入指定内存
  00405BC8  |. |46            ||INC ESI                                ;  SI + 1
  00405BC9  |. |C1E1 06       ||SHL ECX,6                              ;  CX 左移 6 次
  00405BCC  |. |47            ||INC EDI                                ;  EDI=(ASCII "Tl")
  00405BCD  |. |8BC1          ||MOV EAX,ECX                            ;  CX 结果 入 AX
  00405BCF  |. |C1E8 1A       ||SHR EAX,1A                             ;  ax 右移 1A
  00405BD2  |. |8A80 98FA4300 ||MOV AL,BYTE PTR DS:[EAX+43FA98]        ;  第三个真码 取出
  00405BD8  |. |C1E9 14       ||SHR ECX,14                             ;  CX 右移 14(十进制 20 )
  00405BDB  |. |47            ||INC EDI
  00405BDC  |. |8807          ||MOV BYTE PTR DS:[EDI],AL               ;  第三个真码送入内存
  00405BDE  |. |83E1 3F       ||AND ECX,3F                             ;  CX 跟 0X3F 做逻辑‘与’运算
  00405BE1  |. |8A89 98FA4300 ||MOV CL,BYTE PTR DS:[ECX+43FA98]        ;  第四个真码产生
  00405BE7  |. |47            ||INC EDI
  00405BE8  |. |880F          ||MOV BYTE PTR DS:[EDI],CL               ;  第四个真码产生
  00405BEA  |. |47            ||INC EDI
  00405BEB  |. |4A            ||DEC EDX
  00405BEC  |.^|75 A2         |\JNZ SHORT 生活小管.00405B90
  
--------------------------------------------------------------------------------
【经验总结】
  到此全部计算完毕,但要注意的是上面这个循环有毛病,可能是作者的问题(故意捣乱),它会循环5次,第五次的结果是多余的
  
  如 我的机器码是  :MTNKNzZCMT80PkRG
  循环 5 次后结果是:TlJZQ0OUeVd2emsQbU1Zaw==
  很明显           :TlJZQ0OUeVd2emsQ                bU1Zaw==  这一段是多出来的,也是第五轮循环产生的废物,总结完毕
  
  学了几个月的破解,搞定的软件十来个,算法分析出来的只有 4 个,其他的不是爆破就是 内存注册机,汗。。。。。。。。。。
  不过觉的第一次写破文比搞顶这个软件还辛苦,完。
  
  
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年08月14日 11:40:36