【文章标题】: Comic Book Manager 算法分析
【文章作者】: qifeon
【软件名称】: Comic Book Manager 1.12
【下载地址】: http://www.onlinedown.net/soft/18946.htm
【保护方式】: 注册码
【使用工具】: od ,peid
【操作平台】: winxp sp2
【软件介绍】: Comic Book Manager 是一个漫画图书管理软件!
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一、分析过程
1、PEID 查壳,显示无壳,编程语言为Borland Delphi 6.0 - 7.0;
2、运行软件,输入试炼码“qifeon,123456",有错误提示。“the registration code that you provided does not\nmatch the name entered.”;
3、OD载入,字符串插件查找“the registration code that you provided does not\nmatch the name entered.”
Ultra String Reference, 条目 5679
Address=006A68A6
Disassembly=mov eax, 006A6914
Text String=the registration code that you provided does not\nmatch the name entered
双击返回后向上找到段首
***********************************************************************************************************************************8
006A67C0 /. 55 push ebp ; 段首
006A67C1 |. 8BEC mov ebp, esp
006A67C3 |. 81C4 ECFEFFFF add esp, -114
006A67C9 |. 53 push ebx
006A67CA |. 33C9 xor ecx, ecx
006A67CC |. 898D ECFEFFFF mov dword ptr [ebp-114], ecx
006A67D2 |. 898D F4FEFFFF mov dword ptr [ebp-10C], ecx
006A67D8 |. 898D F0FEFFFF mov dword ptr [ebp-110], ecx
006A67DE |. 894D FC mov dword ptr [ebp-4], ecx
006A67E1 |. 894D F8 mov dword ptr [ebp-8], ecx
006A67E4 |. 8BD8 mov ebx, eax
006A67E6 |. 33C0 xor eax, eax
006A67E8 |. 55 push ebp
006A67E9 |. 68 F9686A00 push 006A68F9
006A67EE |. 64:FF30 push dword ptr fs:[eax]
006A67F1 |. 64:8920 mov dword ptr fs:[eax], esp
006A67F4 |. 8D55 F8 lea edx, dword ptr [ebp-8]
006A67F7 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
006A67FD |. E8 96CCFFFF call 006A3498
006A6802 |. 8B45 F8 mov eax, dword ptr [ebp-8] ; 用户名
006A6805 |. 8D55 FC lea edx, dword ptr [ebp-4]
006A6808 |. E8 D73AD6FF call 0040A2E4
006A680D |. 8B55 FC mov edx, dword ptr [ebp-4]
006A6810 |. A1 04A16B00 mov eax, dword ptr [6BA104]
006A6815 |. E8 32ECD5FF call 0040544C
006A681A |. 8D95 F0FEFFFF lea edx, dword ptr [ebp-110]
006A6820 |. 8B83 00030000 mov eax, dword ptr [ebx+300]
006A6826 |. E8 6DCCFFFF call 006A3498
006A682B |. 8B85 F0FEFFFF mov eax, dword ptr [ebp-110] ; 试炼码
006A6831 |. 8D95 F4FEFFFF lea edx, dword ptr [ebp-10C]
006A6837 |. E8 A83AD6FF call 0040A2E4
006A683C |. 8B95 F4FEFFFF mov edx, dword ptr [ebp-10C]
006A6842 |. 8D85 F8FEFFFF lea eax, dword ptr [ebp-108]
006A6848 |. B9 FF000000 mov ecx, 0FF
006A684D |. E8 42EED5FF call 00405694
006A6852 |. 8D95 F8FEFFFF lea edx, dword ptr [ebp-108]
006A6858 |. A1 809E6B00 mov eax, dword ptr [6B9E80]
006A685D |. B1 1E mov cl, 1E
006A685F |. E8 50CED5FF call 004036B4
006A6864 |. 6A 6B push 6B ; 参与计算常数6Bh入栈
006A6866 |. 8D85 ECFEFFFF lea eax, dword ptr [ebp-114]
006A686C |. 8B15 809E6B00 mov edx, dword ptr [6B9E80] ; cbm.006BE070
006A6872 |. E8 E5EDD5FF call 0040565C
006A6877 |. 8B8D ECFEFFFF mov ecx, dword ptr [ebp-114]
006A687D |. 8B15 04A16B00 mov edx, dword ptr [6BA104] ; cbm.006BE06C
006A6883 |. 8B12 mov edx, dword ptr [edx]
006A6885 |. A1 88A16B00 mov eax, dword ptr [6BA188]
006A688A |. 8B00 mov eax, dword ptr [eax]
006A688C |. 8B80 58030000 mov eax, dword ptr [eax+358]
006A6892 |. E8 1977ECFF call 0056DFB0 ; 关键CALL
006A6897 |. 84C0 test al, al
006A6899 |. 75 29 jnz short 006A68C4 ; 关键跳转
006A689B |. 6A 00 push 0
006A689D |. 66:8B0D 08696>mov cx, word ptr [6A6908]
006A68A4 |. B2 01 mov dl, 1
006A68A6 |. B8 14696A00 mov eax, 006A6914 ; the registration code that you provided does not\nmatch the name entered.
006A68AB |. E8 B868D9FF call 0043D168
006A68B0 |. 48 dec eax 返回处
006A68B1 |. 75 1B jnz short 006A68CE
006A68B3 |. A1 58E06B00 mov eax, dword ptr [6BE058]
006A68B8 |. C780 4C020000>mov dword ptr [eax+24C], 1
006A68C2 |. EB 0A jmp short 006A68CE
006A68C4 |> C783 4C020000>mov dword ptr [ebx+24C], 1
006A68CE |> 33C0 xor eax, eax
006A68D0 |. 5A pop edx
006A68D1 |. 59 pop ecx
006A68D2 |. 59 pop ecx
006A68D3 |. 64:8910 mov dword ptr fs:[eax], edx
006A68D6 |. 68 00696A00 push 006A6900
006A68DB |> 8D85 ECFEFFFF lea eax, dword ptr [ebp-114]
006A68E1 |. BA 03000000 mov edx, 3
006A68E6 |. E8 31EBD5FF call 0040541C
006A68EB |. 8D45 F8 lea eax, dword ptr [ebp-8]
006A68EE |. BA 02000000 mov edx, 2
006A68F3 |. E8 24EBD5FF call 0040541C
006A68F8 \. C3 retn
*****************************************************************************************************************************************
段首下断,重载,F9运行,输入试炼码““qifeon,123456"”,断下后单步,
006A6892 处进入 call 0056DFB0
**************************************************************************************************************************************
0056DFB0 /$ 55 push ebp
0056DFB1 |. 8BEC mov ebp, esp
0056DFB3 |. 83C4 F4 add esp, -0C
0056DFB6 |. 53 push ebx
0056DFB7 |. 56 push esi
0056DFB8 |. 57 push edi
0056DFB9 |. 33DB xor ebx, ebx
0056DFBB |. 895D F4 mov dword ptr [ebp-C], ebx
0056DFBE |. 894D F8 mov dword ptr [ebp-8], ecx ; 试炼码
0056DFC1 |. 8955 FC mov dword ptr [ebp-4], edx ; 用户名
0056DFC4 |. 8BF8 mov edi, eax
0056DFC6 |. 8B75 08 mov esi, dword ptr [ebp+8] ; 常数6Bh传入esi
0056DFC9 |. 8B45 FC mov eax, dword ptr [ebp-4]
0056DFCC |. E8 D778E9FF call 004058A8
0056DFD1 |. 8B45 F8 mov eax, dword ptr [ebp-8]
0056DFD4 |. E8 CF78E9FF call 004058A8
0056DFD9 |. 33C0 xor eax, eax
0056DFDB |. 55 push ebp
0056DFDC |. 68 2FE05600 push 0056E02F
0056DFE1 |. 64:FF30 push dword ptr fs:[eax]
0056DFE4 |. 64:8920 mov dword ptr fs:[eax], esp
0056DFE7 |. 33DB xor ebx, ebx
0056DFE9 |. 837D FC 00 cmp dword ptr [ebp-4], 0 ; 用户名是否为空?
0056DFED |. 74 25 je short 0056E014
0056DFEF |. 85F6 test esi, esi ; esi值是否为0?
0056DFF1 |. 74 21 je short 0056E014
0056DFF3 |. 8D45 F4 lea eax, dword ptr [ebp-C]
0056DFF6 |. 50 push eax
0056DFF7 |. 8BCE mov ecx, esi ; ecx=esi=6Bh
0056DFF9 |. 8B55 FC mov edx, dword ptr [ebp-4] ; 用户名
0056DFFC |. 8BC7 mov eax, edi
0056DFFE |. E8 8DFEFFFF call 0056DE90 ; 算法call
0056E003 |. 8B45 F4 mov eax, dword ptr [ebp-C] ; 真正注册码
0056E006 |. 8B55 F8 mov edx, dword ptr [ebp-8] ; 试炼码
0056E009 |. E8 92FBFFFF call 0056DBA0 ; 真假注册码比较
0056E00E |. 84C0 test al, al
0056E010 |. 74 02 je short 0056E014 ; 关键跳转
0056E012 |. B3 01 mov bl, 1
0056E014 |> 33C0 xor eax, eax
0056E016 |. 5A pop edx ; (initial cpu selection)
0056E017 |. 59 pop ecx
0056E018 |. 59 pop ecx
0056E019 |. 64:8910 mov dword ptr fs:[eax], edx
0056E01C |. 68 36E05600 push 0056E036
0056E021 |> 8D45 F4 lea eax, dword ptr [ebp-C]
0056E024 |. BA 03000000 mov edx, 3
0056E029 |. E8 EE73E9FF call 0040541C
0056E02E \. C3 retn
********************************************************************************************************************************
0056DFFE 处 进入 call 0056DE90
*******************************************************************************************************************************
0056DE90 /$ 55 push ebp
0056DE91 |. 8BEC mov ebp, esp
0056DE93 |. 6A 00 push 0
0056DE95 |. 6A 00 push 0
0056DE97 |. 6A 00 push 0
0056DE99 |. 6A 00 push 0
0056DE9B |. 6A 00 push 0
0056DE9D |. 53 push ebx
0056DE9E |. 56 push esi
0056DE9F |. 57 push edi
0056DEA0 |. 8BF1 mov esi, ecx
0056DEA2 |. 8955 FC mov dword ptr [ebp-4], edx
0056DEA5 |. 8B7D 08 mov edi, dword ptr [ebp+8]
0056DEA8 |. 8B45 FC mov eax, dword ptr [ebp-4]
0056DEAB |. E8 F879E9FF call 004058A8
0056DEB0 |. 33C0 xor eax, eax
0056DEB2 |. 55 push ebp
0056DEB3 |. 68 93DF5600 push 0056DF93
0056DEB8 |. 64:FF30 push dword ptr fs:[eax]
0056DEBB |. 64:8920 mov dword ptr fs:[eax], esp
0056DEBE |. 837D FC 00 cmp dword ptr [ebp-4], 0 ; 用户名是否为空?
0056DEC2 |. 74 04 je short 0056DEC8
0056DEC4 |. 85F6 test esi, esi ; ESI值是否为0?
0056DEC6 |. 75 0C jnz short 0056DED4
0056DEC8 |> 8BC7 mov eax, edi
0056DECA |. E8 2975E9FF call 004053F8
0056DECF |. E9 A4000000 jmp 0056DF78
0056DED4 |> 8D45 F8 lea eax, dword ptr [ebp-8]
0056DED7 |. E8 1C75E9FF call 004053F8
0056DEDC |. 8B45 FC mov eax, dword ptr [ebp-4]
0056DEDF |. E8 D477E9FF call 004056B8
0056DEE4 |. 8BD8 mov ebx, eax ; 用户名长度len
0056DEE6 |. 0FAFDE imul ebx, esi ; ebx 与esi相乘,乘积保存在 ebx
0056DEE9 |. 8B45 FC mov eax, dword ptr [ebp-4] ; 用户名
0056DEEC |. 0FB600 movzx eax, byte ptr [eax] ; 用户名首位扩展送入eax
0056DEEF |. 69C0 842F0100 imul eax, eax, 12F84 ; eax=eax * 12F84h
0056DEF5 |. 03D8 add ebx, eax ; ebx=ebx+eax
0056DEF7 |. 8D55 F4 lea edx, dword ptr [ebp-C]
0056DEFA |. 8BC3 mov eax, ebx ; eax=ebx
0056DEFC |. E8 7FC9E9FF call 0040A880 ; eax值16进制转化为10进制字符串,设为regcode1
0056DF01 |. 8B55 F4 mov edx, dword ptr [ebp-C]
0056DF04 |. 8D45 F8 lea eax, dword ptr [ebp-8] ; regcode1
0056DF07 |. B9 ACDF5600 mov ecx, 0056DFAC ; -
0056DF0C |. E8 F377E9FF call 00405704
0056DF11 |. 8B45 FC mov eax, dword ptr [ebp-4] ; 用户名
0056DF14 |. 0FB600 movzx eax, byte ptr [eax] ; 用户名首位扩展送入eax
0056DF17 |. F7EE imul esi ; eax=eax*esi
0056DF19 |. 69D8 C8010000 imul ebx, eax, 1C8 ; ebx=eax * 1C8h
0056DF1F |. FF75 F8 push dword ptr [ebp-8] ; regcode1入栈
0056DF22 |. 8D55 F0 lea edx, dword ptr [ebp-10]
0056DF25 |. 8BC3 mov eax, ebx ; eax=ebx
0056DF27 |. E8 54C9E9FF call 0040A880 ; eax值16进制转化为10进制字符串,设为regcode2
0056DF2C |. FF75 F0 push dword ptr [ebp-10] ; regcode2入栈
0056DF2F |. 68 ACDF5600 push 0056DFAC ; -
0056DF34 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0056DF37 |. BA 03000000 mov edx, 3
0056DF3C |. E8 3778E9FF call 00405778
0056DF41 |. 8B45 FC mov eax, dword ptr [ebp-4]
0056DF44 |. E8 6F77E9FF call 004056B8
0056DF49 |. 8B55 FC mov edx, dword ptr [ebp-4] ; eax=len,用户名地址传入edx
0056DF4C |. 0FB612 movzx edx, byte ptr [edx] ; 用户名首位扩展送入edx
0056DF4F |. F7EA imul edx ; eax=eax * edx
0056DF51 |. 69D8 2E160000 imul ebx, eax, 162E ; ebx=eax * 162Eh
0056DF57 |. 03DE add ebx, esi ; ebx=ebx+ esi
0056DF59 |. 8D55 EC lea edx, dword ptr [ebp-14]
0056DF5C |. 8BC3 mov eax, ebx ; eax=ebx
0056DF5E |. E8 1DC9E9FF call 0040A880 ; eax值16进制转化为10进制字符串,设为regcode2
0056DF63 |. 8B55 EC mov edx, dword ptr [ebp-14] ; regcode3地址送入 edx
0056DF66 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0056DF69 |. E8 5277E9FF call 004056C0 ; 三个字符串regcode1,regcode2,regcode3用"-"相连构成注册码
0056DF6E |. 8BC7 mov eax, edi
0056DF70 |. 8B55 F8 mov edx, dword ptr [ebp-8]
0056DF73 |. E8 D474E9FF call 0040544C
0056DF78 |> 33C0 xor eax, eax
0056DF7A |. 5A pop edx
0056DF7B |. 59 pop ecx
0056DF7C |. 59 pop ecx
0056DF7D |. 64:8910 mov dword ptr fs:[eax], edx
0056DF80 |. 68 9ADF5600 push 0056DF9A
0056DF85 |> 8D45 EC lea eax, dword ptr [ebp-14]
0056DF88 |. BA 05000000 mov edx, 5
0056DF8D |. E8 8A74E9FF call 0040541C
0056DF92 \. C3 retn
*****************************************************************************************************************************************
二、算法总结
注册码由三段用"-"相连组成:
1、 用户名长度len乘以常数0x6B然后加上 用户名首位ASCII值乘以常数0x12F84的值;
2、上面计算值转化为10进制字符串即为注册码第一段;
3、用户名首位ASCII值乘以常数0x6B,再乘以常数00x1C8;
4、上面计算值转化为10进制字符串即为注册码第二段;
5、用户名长度len乘以 用户名首位ASCII值,再乘以常数0x162,三者相乘后加上常数0x6B;
6、上面计算值转化为10进制字符串即为注册码第三段;
三、c 语言注册机源代码
#include "stdio.h"
#include "string.h"
void main()
{
int con=0x2D; /* 连字符'-'*/
int reg1,reg2,reg3,len;
char name[20];
char regcode1[20];
char regcode2[20];
char regcode3[20];
printf("%s","请输入用户名:");
scanf("%s",name);
len=strlen(name);
reg1=len*0x6B+name[0]*0x12F84;
reg2=name[0]*0x6B*0x1C8;
reg3=name[0]*len*0x162E+0x6B;
itoa(reg1, regcode1, 10);
itoa(reg2, regcode2, 10);
itoa(reg3, regcode3, 10);
printf("%s","注册码是:");
printf("%s",regcode1);
printf("%c",con);
printf("%s",regcode2);
printf("%c",con);
printf("%s\n",regcode3);
system("PAUSE");
}
--------------------------------------------------------------------------------
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!