【破文标题】美达通讯录算法分析
【破文作者】逍遥风[OCN][PYG]
【作者邮箱】tc-xb@163.COM
【破解工具】OD,peid
【破解平台】winXP
【软件名称】美达通讯录 1.30
【原版下载】http://www.meidasoft.com/ 
【软件简介】美达通讯录是一个小型简洁实用的通讯录管理程序,使用简单,界面美观大方。可以管理自己的亲朋好友、同学同事、业务客户等的通讯资料,能直接建立分类,如同学类、朋友类、同事类等任意的分类项目。启动时需要输入密码,使其它人不能看到你的通讯资料,让你的信息更安全。查询栏让你很快找到你的联系人。

------------------------------------------------------------------------
PEID检测:Borland Delphi 6.0 - 7.0 无壳
根据注册错误的信息,用OD直接来到如下代码处
005EA33E  |.  55            PUSH EBP
005EA33F  |.  68 30A45E00   PUSH Contacts.005EA430
005EA344  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
005EA347  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
005EA34A  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
005EA34D  |.  8B83 0C030000 MOV EAX,DWORD PTR DS:[EBX+30C]
005EA353  |.  E8 58C8E9FF   CALL Contacts.00486BB0                   ;  取注册名位数
005EA358  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  注册名进EAX
005EA35B  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
005EA35E  |.  E8 D9F5E1FF   CALL Contacts.0040993C
005EA363  |.  837D FC 00    CMP DWORD PTR SS:[EBP-4],0               ;  注册名位数与O进行比较
005EA367  |.  75 29         JNZ SHORT Contacts.005EA392              ;  等于0就出现提示
005EA369  |.  6A 40         PUSH 40
005EA36B  |.  68 3CA45E00   PUSH Contacts.005EA43C                   ;  warning
005EA370  |.  68 44A45E00   PUSH Contacts.005EA444                   ;  请输入注册名!
005EA375  |.  8BC3          MOV EAX,EBX
005EA377  |.  E8 0432EAFF   CALL Contacts.0048D580
005EA37C  |.  50            PUSH EAX                                 ; |hOwner
005EA37D  |.  E8 26DCE1FF   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
005EA382  |.  8B83 0C030000 MOV EAX,DWORD PTR DS:[EBX+30C]
005EA388  |.  8B10          MOV EDX,DWORD PTR DS:[EAX]
005EA38A  |.  FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
005EA390  |.  EB 70         JMP SHORT Contacts.005EA402
005EA392  |>  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
005EA395  |.  8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
005EA39B  |.  E8 10C8E9FF   CALL Contacts.00486BB0                   ;  取假码位数
005EA3A0  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]            ;  假码进EAX
005EA3A3  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
005EA3A6  |.  E8 91F5E1FF   CALL Contacts.0040993C
005EA3AB  |.  837D F4 00    CMP DWORD PTR SS:[EBP-C],0               ;  假码位数与0进行比较
005EA3AF  |.  75 29         JNZ SHORT Contacts.005EA3DA              ;  等于0就出现提示
005EA3B1  |.  6A 40         PUSH 40
005EA3B3  |.  68 3CA45E00   PUSH Contacts.005EA43C                   ;  warning
005EA3B8  |.  68 54A45E00   PUSH Contacts.005EA454                   ;  请输入注册码!
005EA3BD  |.  8BC3          MOV EAX,EBX
005EA3BF  |.  E8 BC31EAFF   CALL Contacts.0048D580
005EA3C4  |.  50            PUSH EAX                                 ; |hOwner
005EA3C5  |.  E8 DEDBE1FF   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
005EA3CA  |.  8B83 10030000 MOV EAX,DWORD PTR DS:[EBX+310]
005EA3D0  |.  8B10          MOV EDX,DWORD PTR DS:[EAX]
005EA3D2  |.  FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
005EA3D8  |.  EB 28         JMP SHORT Contacts.005EA402
005EA3DA  |>  8BC3          MOV EAX,EBX
005EA3DC  |.  E8 1FFDFFFF   CALL Contacts.005EA100                   ;  算法CALL,进
005EA3E1  |.  84C0          TEST AL,AL
005EA3E3  |.  74 13         JE SHORT Contacts.005EA3F8
005EA3E5  |.  B8 6CA45E00   MOV EAX,Contacts.005EA46C                ;  注册成功!
005EA3EA  |.  E8 3133E5FF   CALL Contacts.0043D720
005EA3EF  |.  8BC3          MOV EAX,EBX
005EA3F1  |.  E8 F2FAFFFF   CALL Contacts.005E9EE8
005EA3F6  |.  EB 0A         JMP SHORT Contacts.005EA402
005EA3F8  |>  B8 80A45E00   MOV EAX,Contacts.005EA480                ;  注册码错误!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入算法CALL。。。来到这里
005EA100  /$  55            PUSH EBP
005EA101  |.  8BEC          MOV EBP,ESP
省略一些代码。。。。。。
005EA125  |.  8B86 10030000 MOV EAX,DWORD PTR DS:[ESI+310]
005EA12B  |.  E8 80CAE9FF   CALL Contacts.00486BB0                   ;  取假码位数
005EA130  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  EBP-8=假码
005EA133  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
005EA136  |.  E8 01F8E1FF   CALL Contacts.0040993C
005EA13B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
005EA13E  |.  50            PUSH EAX
005EA13F  |.  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
005EA142  |.  8B86 0C030000 MOV EAX,DWORD PTR DS:[ESI+30C]
005EA148  |.  E8 63CAE9FF   CALL Contacts.00486BB0                   ;  取注册名位数
005EA14D  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
005EA150  |.  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
005EA153  |.  E8 E4F7E1FF   CALL Contacts.0040993C
005EA158  |.  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]
005EA15B  |.  8D4D F4       LEA ECX,DWORD PTR SS:[EBP-C]
005EA15E  |.  8BC6          MOV EAX,ESI
005EA160  |.  E8 8FFBFFFF   CALL Contacts.005E9CF4                   ;  关键CALL
005EA165  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
005EA168  |.  58            POP EAX
005EA169  |.  E8 76ACE1FF   CALL Contacts.00404DE4                   ;  比较CALL
005EA16E  |.  75 50         JNZ SHORT Contacts.005EA1C0              ;  相等就注册成功
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入关键CALL。来到这里。。。
005E9CF4  /$  55            PUSH EBP
005E9CF5  |.  8BEC          MOV EBP,ESP
省略一些代码
005E9D2D  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
005E9D30  |.  E8 63AFE1FF   CALL Contacts.00404C98                   ;  取注册名位数
005E9D35  |.  8BF0          MOV ESI,EAX                              ;  注册名位数给ESI
005E9D37  |.  85F6          TEST ESI,ESI
005E9D39  |.  7E 26         JLE SHORT Contacts.005E9D61
005E9D3B  |.  BB 01000000   MOV EBX,1
005E9D40  |>  8D4D EC       /LEA ECX,DWORD PTR SS:[EBP-14]
005E9D43  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
005E9D46  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]       ;  取注册名每一位的ASCII值
005E9D4B  |.  33D2          |XOR EDX,EDX
005E9D4D  |.  E8 0203E2FF   |CALL Contacts.0040A054
005E9D52  |.  8B55 EC       |MOV EDX,DWORD PTR SS:[EBP-14]
005E9D55  |.  8D45 F8       |LEA EAX,DWORD PTR SS:[EBP-8]
005E9D58  |.  E8 43AFE1FF   |CALL Contacts.00404CA0
005E9D5D  |.  43            |INC EBX
005E9D5E  |.  4E            |DEC ESI
005E9D5F  |.^ 75 DF         \JNZ SHORT Contacts.005E9D40
005E9D61  |>  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  注册名每一位的ASCII值连成一个字符串
005E9D64  |.  E8 2FAFE1FF   CALL Contacts.00404C98                   ;  取字符串的长度
005E9D69  |.  8BF0          MOV ESI,EAX
005E9D6B  |.  85F6          TEST ESI,ESI
005E9D6D  |.  7E 2C         JLE SHORT Contacts.005E9D9B
005E9D6F  |.  BB 01000000   MOV EBX,1
005E9D74  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]            ;  EBP-8=字符串长度
005E9D77  |.  E8 1CAFE1FF   |CALL Contacts.00404C98
005E9D7C  |.  2BC3          |SUB EAX,EBX                             ;  EAX=EAX-EBX,EBX=计算次数
005E9D7E  |.  8B55 F8       |MOV EDX,DWORD PTR SS:[EBP-8]
005E9D81  |.  8A1402        |MOV DL,BYTE PTR DS:[EDX+EAX]
005E9D84  |.  8D45 E8       |LEA EAX,DWORD PTR SS:[EBP-18]
005E9D87  |.  E8 34AEE1FF   |CALL Contacts.00404BC0
005E9D8C  |.  8B55 E8       |MOV EDX,DWORD PTR SS:[EBP-18]
005E9D8F  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
005E9D92  |.  E8 09AFE1FF   |CALL Contacts.00404CA0
005E9D97  |.  43            |INC EBX                                 ;  每计算一次EBX+1
005E9D98  |.  4E            |DEC ESI                                 ;  每计算一次ESI-1
005E9D99  |.^ 75 D9         \JNZ SHORT Contacts.005E9D74             ;  上面这个循环的作用就是把字符串倒序
005E9D9B  |>  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
005E9D9E  |.  50            PUSH EAX
005E9D9F  |.  B9 04000000   MOV ECX,4                                ;  使ECX=4
005E9DA4  |.  BA 01000000   MOV EDX,1                                ;  使EDX=1
005E9DA9  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  EBP-C=倒序后的字符串,设为字符串A
005E9DAC  |.  E8 47B1E1FF   CALL Contacts.00404EF8                   ;  取字符串A前4位
005E9DB1  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
005E9DB4  |.  50            PUSH EAX
005E9DB5  |.  B9 04000000   MOV ECX,4                                ;  使ECX=4
005E9DBA  |.  BA 05000000   MOV EDX,5                                ;  使EDX=5
005E9DBF  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  EBP-C=倒序后的字符串
005E9DC2  |.  E8 31B1E1FF   CALL Contacts.00404EF8                   ;  取字符串A的第5位到第八位
005E9DC7  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
005E9DCA  |.  E8 C9AEE1FF   CALL Contacts.00404C98
005E9DCF  |.  83F8 04       CMP EAX,4                                ;  比较所得新的字符串是否为4位
005E9DD2  |.  7D 2F         JGE SHORT Contacts.005E9E03              ;  大于四位就跳走直接进行运算
005E9DD4  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
005E9DD7  |.  E8 BCAEE1FF   CALL Contacts.00404C98
005E9DDC  |.  8BD8          MOV EBX,EAX
005E9DDE  |.  83FB 03       CMP EBX,3                                ;  比较新字符串是否为3位
005E9DE1  |.  7F 20         JG SHORT Contacts.005E9E03
005E9DE3  |>  8D4D E4       /LEA ECX,DWORD PTR SS:[EBP-1C]
005E9DE6  |.  8BC3          |MOV EAX,EBX                             ;  EBX=新字符串长度
005E9DE8  |.  C1E0 02       |SHL EAX,2                               ;  EAX=EBX乘以2的平方
005E9DEB  |.  33D2          |XOR EDX,EDX                             ;  EDX清零
005E9DED  |.  E8 6202E2FF   |CALL Contacts.0040A054
005E9DF2  |.  8B55 E4       |MOV EDX,DWORD PTR SS:[EBP-1C]
005E9DF5  |.  8D45 F8       |LEA EAX,DWORD PTR SS:[EBP-8]
005E9DF8  |.  E8 A3AEE1FF   |CALL Contacts.00404CA0
005E9DFD  |.  43            |INC EBX                                 ;  每计算一次EBX+1
005E9DFE  |.  83FB 04       |CMP EBX,4                               ;  比较EBX是否等于4
005E9E01  |.^ 75 E0         \JNZ SHORT Contacts.005E9DE3             ;  小于就继续计算
005E9E03  |>  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  字符串A与计算结果合并
005E9E06  |.  E8 8DAEE1FF   CALL Contacts.00404C98
005E9E0B  |.  83F8 04       CMP EAX,4
005E9E0E  |.  7D 2F         JGE SHORT <Contacts.输出计算结果>
005E9E10  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
005E9E13  |.  E8 80AEE1FF   CALL Contacts.00404C98
005E9E18  |.  8BD8          MOV EBX,EAX
005E9E1A  |.  83FB 03       CMP EBX,3
005E9E1D  |.  7F 20         JG SHORT <Contacts.输出计算结果>
005E9E1F  |>  8D4D E0       /LEA ECX,DWORD PTR SS:[EBP-20]
005E9E22  |.  8BC3          |MOV EAX,EBX                             ;  使EAX=EBX
005E9E24  |.  C1E0 02       |SHL EAX,2                               ;  EAX=EBX乘以2的平方
005E9E27  |.  33D2          |XOR EDX,EDX
005E9E29  |.  E8 2602E2FF   |CALL Contacts.0040A054
005E9E2E  |.  8B55 E0       |MOV EDX,DWORD PTR SS:[EBP-20]
005E9E31  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
005E9E34  |.  E8 67AEE1FF   |CALL Contacts.00404CA0
005E9E39  |.  43            |INC EBX                                 ;  每计算一次EBX+1
005E9E3A  |.  83FB 04       |CMP EBX,4                               ;  比较EBX是否等于4
005E9E3D  |.^ 75 E0         \JNZ SHORT Contacts.005E9E1F             ;  小于就继续计算
005E9E3F >|>  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]            ;  输出计算结果
005E9E42  |.  BA CC9E5E00   MOV EDX,Contacts.005E9ECC                ;  con62bsar698
005E9E47  |.  E8 24ACE1FF   CALL Contacts.00404A70                   ;  固定字符串Con62bsae698
005E9E4C  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
005E9E4F  |.  50            PUSH EAX
005E9E50  |.  B9 04000000   MOV ECX,4                                ;  使ECX=4
005E9E55  |.  BA 01000000   MOV EDX,1                                ;  EDX=1
005E9E5A  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
005E9E5D  |.  E8 96B0E1FF   CALL Contacts.00404EF8                   ;  取固定字符串的前四位
005E9E62  |.  FF75 DC       PUSH DWORD PTR SS:[EBP-24]
005E9E65  |.  68 E49E5E00   PUSH Contacts.005E9EE4                   ;  -
005E9E6A  |.  FF75 F8       PUSH DWORD PTR SS:[EBP-8]
005E9E6D  |.  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
005E9E70  |.  50            PUSH EAX
005E9E71  |.  B9 05000000   MOV ECX,5                                ;  使ECX=5
005E9E76  |.  BA 05000000   MOV EDX,5                                ;  使EDX=5
005E9E7B  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
005E9E7E  |.  E8 75B0E1FF   CALL Contacts.00404EF8
005E9E83  |.  FF75 D8       PUSH DWORD PTR SS:[EBP-28]               ;  取固定字符串的5到9位
005E9E86  |.  68 E49E5E00   PUSH Contacts.005E9EE4                   ;  -
省略一些代码。。。
005E9EBC   .  5F            POP EDI
005E9EBD   .  5E            POP ESI
005E9EBE   .  5B            POP EBX
005E9EBF   .  8BE5          MOV ESP,EBP
005E9EC1   .  5D            POP EBP                                  ;  合并注册码并出栈
005E9EC2   .  C3            RETN




------------------------------------------------------------------------
算法总结:
1)取注册名每一位的ASCII值联成一个字符串
2)把所得到的字符串到序
3)取字符串的前四位和5到8位,与固定字符串的con62bsar698的前四位和5到9位交叉组成注册码。
注意。如果注册名每一位的ASCII值联成的字符串小于4位或小于8位就会进一步处理
小于8位:0*2的平方。1*2的平方。2*2的平方。3*2的平方。得到一个的四位的字符串
小于4位(即输入的注册名只有一位):注册名的ASCII值倒序的结果与2*2的平方,3*2的平方所得的两给结果相合并,得到第一个四位字符串。再重复小于8位时的处理方法,得到第二个字符串。最后与固定字符串的con62bsar698
交叉得到注册码。
注册名:tcxb
注册码:Con6-26872bsar-3647