【破文作者】lnn1123
【作者主页】http://blog.csdn.net/lnn1123
【 E-mail 】lnn11231123@163.com
【文章题目】My Notes Keeper V1.4注册算法分析
【软件名称】My Notes Keeper V1.4
【下载地址】天空软件
【加密方式】注册码
【加壳方式】 aspack
【破解工具】PEID,OLLYDBG
【破解平台】WIN200 AND WINXP
=======================================================================================================
【软件简介】
My Notes Keeper 是一款功能强大、简单易用的树状标签结构个人数据库管理软件,能进行个人信息管理和文字、表格处理,有密码保护功能。你可以通过它管理你的通讯簿、网址收藏和安排日程表等,甚至可以用它来制作电子书。软件的操作方式跟 Word 几乎没有多大区别,推荐使用!
=======================================================================================================
【文章简介】
要过年了,在看雪也混了一年了,没学到什么技术惭愧!,写一篇文章安慰一下自己
=======================================================================================================
【解密过程】
PEID发现是ASPACK,不想脱直接调试了,找到user32.dll的messageboxa函数并下断,很容易到达这里.
00703207 68 66337000 PUSH MyNotesK.00703366
0070320C 64:FF30 PUSH DWORD PTR FS:[EAX]
0070320F 64:8920 MOV DWORD PTR FS:[EAX],ESP
00703212 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00703215 8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300]
0070321B E8 A473D7FF CALL MyNotesK.0047A5C4 ; 取注册名,长度返回在EAX
00703220 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 ; 是否输入
00703224 74 14 JE SHORT MyNotesK.0070323A ; 不输入就死
00703226 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00703229 8B83 04030000 MOV EAX,DWORD PTR DS:[EBX+304]
0070322F E8 9073D7FF CALL MyNotesK.0047A5C4 ; 取注册码,长度返回在EAX
00703234 837D F8 00 CMP DWORD PTR SS:[EBP-8],0 ; 是否输入
00703238 75 5B JNZ SHORT MyNotesK.00703295 ; 输入就跳了
0070323A 6A 10 PUSH 10
0070323C 68 74337000 PUSH MyNotesK.00703374 ; ASCII "My Notes Keeper"
00703241 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00703244 50 PUSH EAX
00703245 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
00703248 A1 B8997700 MOV EAX,DWORD PTR DS:[7799B8]
0070324D E8 DE3BD0FF CALL MyNotesK.00406E30
00703252 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
00703255 B9 8C337000 MOV ECX,MyNotesK.0070338C ; ASCII "Reg"
0070325A B8 98337000 MOV EAX,MyNotesK.00703398 ; ASCII "strBothNameCode"
0070325F E8 1CCFF1FF CALL MyNotesK.00620180
00703264 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00703267 E8 EC1BD0FF CALL MyNotesK.00404E58
0070326C 50 PUSH EAX
0070326D 8BC3 MOV EAX,EBX
0070326F E8 70DBD7FF CALL MyNotesK.00480DE4
00703274 50 PUSH EAX
00703275 E8 024DD0FF CALL MyNotesK.00407F7C ; JMP to user32.MessageBoxA
0070327A 8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300]
00703280 8B10 MOV EDX,DWORD PTR DS:[EAX]
00703282 FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
00703288 33C0 XOR EAX,EAX
0070328A 8983 4C020000 MOV DWORD PTR DS:[EBX+24C],EAX
00703290 E9 8F000000 JMP MyNotesK.00703324
00703295 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
00703298 8B83 04030000 MOV EAX,DWORD PTR DS:[EBX+304]
0070329E E8 2173D7FF CALL MyNotesK.0047A5C4
007032A3 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] ; 注册码
007032A6 50 PUSH EAX ; PUSH 注册码
007032A7 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
007032AA 8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300]
007032B0 E8 0F73D7FF CALL MyNotesK.0047A5C4
007032B5 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18] ; 注册名
007032B8 5A POP EDX
007032B9 E8 5ED7F1FF CALL MyNotesK.00620A1C ; 注册验证函数
007032BE 84C0 TEST AL,AL ; AL位返回值,不为0就注册成功
007032C0 74 0C JE SHORT MyNotesK.007032CE
007032C2 C783 4C020000 01>MOV DWORD PTR DS:[EBX+24C],1
007032CC EB 56 JMP SHORT MyNotesK.00703324
007032CE 6A 10 PUSH 10
007032D0 68 74337000 PUSH MyNotesK.00703374 ; ASCII "My Notes Keeper"
007032D5 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
007032D8 50 PUSH EAX
007032D9 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
007032DC A1 A89E7700 MOV EAX,DWORD PTR DS:[779EA8]
007032E1 E8 4A3BD0FF CALL MyNotesK.00406E30
007032E6 8B55 E0 MOV EDX,DWORD PTR SS:[EBP-20]
007032E9 B9 8C337000 MOV ECX,MyNotesK.0070338C ; ASCII "Reg"
007032EE B8 B0337000 MOV EAX,MyNotesK.007033B0 ; ASCII "strInvalidNameCode"
007032F3 E8 88CEF1FF CALL MyNotesK.00620180
007032F8 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
007032FB E8 581BD0FF CALL MyNotesK.00404E58
00703300 50 PUSH EAX
00703301 8BC3 MOV EAX,EBX
00703303 E8 DCDAD7FF CALL MyNotesK.00480DE4
00703308 50 PUSH EAX
00703309 E8 6E4CD0FF CALL MyNotesK.00407F7C ; JMP to user32.MessageBoxA
0070330E 8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300]
==================================CALL MyNotesK.00620A1C===================================
00620A1C 55 PUSH EBP
00620A1D 8BEC MOV EBP,ESP
00620A1F 83C4 F4 ADD ESP,-0C
00620A22 53 PUSH EBX
00620A23 56 PUSH ESI
00620A24 33C9 XOR ECX,ECX
00620A26 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00620A29 8BF2 MOV ESI,EDX
00620A2B 8BD8 MOV EBX,EAX
00620A2D 33C0 XOR EAX,EAX
00620A2F 55 PUSH EBP
00620A30 68 A60A6200 PUSH MyNotesK.00620AA6
00620A35 64:FF30 PUSH DWORD PTR FS:[EAX]
00620A38 64:8920 MOV DWORD PTR FS:[EAX],ESP
00620A3B 66:B9 1F00 MOV CX,1F ; 常数填充CX
00620A3F 66:BA 0C00 MOV DX,0C ; 常数填充DX
00620A43 66:B8 0F27 MOV AX,270F ; 常数填充AX
00620A47 E8 D4B9DEFF CALL MyNotesK.0040C420 ; 进行运算得到一个值,不过跟注册没关系
00620A4C 83C4 F8 ADD ESP,-8
00620A4F DD1C24 FSTP QWORD PTR SS:[ESP] ; 浮点数
00620A52 9B WAIT
00620A53 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
00620A56 B8 80987600 MOV EAX,MyNotesK.00769880
00620A5B 8BD3 MOV EDX,EBX
00620A5D E8 5A92F2FF CALL MyNotesK.00549CBC ; 关键CALL,注册码产生就在这里
00620A62 8D4D FC LEA ECX,DWORD PTR SS:[EBP-4]
00620A65 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00620A68 BA 08000000 MOV EDX,8
00620A6D E8 DE73F2FF CALL MyNotesK.00547E50
00620A72 8BD6 MOV EDX,ESI ; 假码
00620A74 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 真码
00620A77 E8 908CDEFF CALL MyNotesK.0040970C ; 比较注册码
00620A7C 85C0 TEST EAX,EAX ; EAX是否为0
00620A7E 75 08 JNZ SHORT MyNotesK.00620A88
00620A80 85DB TEST EBX,EBX
00620A82 74 04 JE SHORT MyNotesK.00620A88
00620A84 85F6 TEST ESI,ESI
00620A86 75 04 JNZ SHORT MyNotesK.00620A8C
00620A88 33C0 XOR EAX,EAX
00620A8A EB 02 JMP SHORT MyNotesK.00620A8E
00620A8C B0 01 MOV AL,1 ; 如果注册成功,AL填充1
00620A8E 8BD8 MOV EBX,EAX
00620A90 33C0 XOR EAX,EAX
00620A92 5A POP EDX
00620A93 59 POP ECX
00620A94 59 POP ECX
00620A95 64:8910 MOV DWORD PTR FS:[EAX],EDX
00620A98 68 AD0A6200 PUSH MyNotesK.00620AAD
00620A9D 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00620AA0 E8 F33EDEFF CALL MyNotesK.00404998
00620AA5 C3 RETN
==============================CALL MyNotesK.00549CBC========================
00549CBC 55 PUSH EBP
00549CBD 8BEC MOV EBP,ESP
00549CBF 6A 00 PUSH 0
00549CC1 6A 00 PUSH 0
00549CC3 53 PUSH EBX
00549CC4 56 PUSH ESI
00549CC5 57 PUSH EDI
00549CC6 8BF1 MOV ESI,ECX
00549CC8 8BDA MOV EBX,EDX
00549CCA 8BF8 MOV EDI,EAX
00549CCC 33C0 XOR EAX,EAX
00549CCE 55 PUSH EBP
00549CCF 68 629D5400 PUSH MyNotesK.00549D62
00549CD4 64:FF30 PUSH DWORD PTR FS:[EAX]
00549CD7 64:8920 MOV DWORD PTR FS:[EAX],ESP
00549CDA 66:C706 F6D9 MOV WORD PTR DS:[ESI],0D9F6
00549CDF FF75 0C PUSH DWORD PTR SS:[EBP+C]
00549CE2 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00549CE5 E8 32FDFFFF CALL MyNotesK.00549A1C
00549CEA 66:8946 02 MOV WORD PTR DS:[ESI+2],AX
00549CEE 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00549CF1 8BD3 MOV EDX,EBX ; 注册名
00549CF3 E8 38ADEBFF CALL MyNotesK.00404A30
00549CF8 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00549CFB E8 58AFEBFF CALL MyNotesK.00404C58
00549D00 8BD8 MOV EBX,EAX
00549D02 83FB 01 CMP EBX,1
00549D05 7C 1F JL SHORT MyNotesK.00549D26
00549D07 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; EAX指向注册名
00549D0A 8A4418 FF MOV AL,BYTE PTR DS:[EAX+EBX-1] ; 倒取注册名一个字节
00549D0E 3C 7F CMP AL,7F ; 与0X7F比较,是否大于ASCII表达字符
00549D10 76 0F JBE SHORT MyNotesK.00549D21
00549D12 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00549D15 B9 01000000 MOV ECX,1
00549D1A 8BD3 MOV EDX,EBX
00549D1C E8 D7B1EBFF CALL MyNotesK.00404EF8
00549D21 4B DEC EBX ; 计数器--
00549D22 85DB TEST EBX,EBX
00549D24 ^75 E1 JNZ SHORT MyNotesK.00549D07
00549D26 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00549D29 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00549D2C E8 53FAEBFF CALL MyNotesK.00409784 ; 把注册名中小写字符转化为大写
00549D31 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; EAX指向转化后的字符
00549D34 E8 DBF5FFFF CALL MyNotesK.00549314 ; 运算得到注册中间值
00549D39 8946 04 MOV DWORD PTR DS:[ESI+4],EAX
00549D3C 8BD6 MOV EDX,ESI
00549D3E 8BC7 MOV EAX,EDI
00549D40 B1 01 MOV CL,1
00549D42 E8 A5F4FFFF CALL MyNotesK.005491EC ; 重要运算子过程
00549D47 33C0 XOR EAX,EAX
00549D49 5A POP EDX
00549D4A 59 POP ECX
00549D4B 59 POP ECX
00549D4C 64:8910 MOV DWORD PTR FS:[EAX],EDX
00549D4F 68 699D5400 PUSH MyNotesK.00549D69
00549D54 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00549D57 BA 02000000 MOV EDX,2
00549D5C E8 5BACEBFF CALL MyNotesK.004049BC
============================CALL MyNotesK.00549314==============================
00549314 53 PUSH EBX
00549315 8BD8 MOV EBX,EAX
00549317 8BC3 MOV EAX,EBX
00549319 E8 3AB9EBFF CALL MyNotesK.00404C58
0054931E 50 PUSH EAX
0054931F 8BC3 MOV EAX,EBX
00549321 E8 32BBEBFF CALL MyNotesK.00404E58
00549326 5A POP EDX
00549327 E8 B0FFFFFF CALL MyNotesK.005492DC
{
005492DC 53 PUSH EBX
005492DD 56 PUSH ESI
005492DE 33C9 XOR ECX,ECX ; 清0
005492E0 8BDA MOV EBX,EDX
005492E2 4B DEC EBX
005492E3 85DB TEST EBX,EBX
005492E5 7C 25 JL SHORT MyNotesK.0054930C
005492E7 43 INC EBX
005492E8 C1E1 04 SHL ECX,4 ; ECX左移4位
005492EB 33D2 XOR EDX,EDX
005492ED 8A10 MOV DL,BYTE PTR DS:[EAX] ; 取变换后注册名的一个字节
005492EF 03CA ADD ECX,EDX ; ECX=ECX+EDX
005492F1 8BD1 MOV EDX,ECX ; EDX《=ECX
005492F3 81E2 000000F0 AND EDX,F0000000 ; EDX=EDX AND 0XF0000000
005492F9 85D2 TEST EDX,EDX ; 是否为0
005492FB 74 07 JE SHORT MyNotesK.00549304
005492FD 8BF2 MOV ESI,EDX ; ESI〈=EDX
005492FF C1EE 18 SHR ESI,18 ; 右移0X18位
00549302 33CE XOR ECX,ESI ; ECX=ECX XOR ESI
00549304 F7D2 NOT EDX ; 取反
00549306 23CA AND ECX,EDX ; ECX=ECX AND EDX
00549308 40 INC EAX ; 指向下一个字符
00549309 4B DEC EBX ; 计数器--
0054930A ^75 DC JNZ SHORT MyNotesK.005492E8
0054930C 8BC1 MOV EAX,ECX
0054930E 5E POP ESI
0054930F 5B POP EBX
00549310 C3 RETN
}
逆向C函数代码如下:
unsigned long reg(char name[])
{
int len;
unsigned long ecx,edx,esi,c;
len=strlen(name);
ecx=0;
edx=0;
esi=0;
for(int b=0;b<len;b++)
{
c=name[b];
if(c>=97 && c<=122)
{c=c-32; //把注册名中小写的转化为大写
name[b]=c;}
}
for(int a=0;a<len;a++) //对转化后的注册名进行运算
{
ecx=ecx << 4;
edx=name[a];
ecx=ecx + edx;
edx=ecx;
edx=edx & 0xf0000000;
if(edx==0)
{edx=~edx;
ecx=ecx & edx;}
else
{esi=edx;
esi=esi >> 0x18;
ecx=ecx ^ esi;
edx=~edx;
ecx=ecx & edx;}
}
return ecx; //返回运算值
}
0054932C 5B POP EBX
0054932D C3 RETN
=============================CALL MyNotesK.005491EC===========================
005491EC 53 PUSH EBX
005491ED 56 PUSH ESI
005491EE 57 PUSH EDI
005491EF 83C4 E8 ADD ESP,-18
005491F2 884C24 08 MOV BYTE PTR SS:[ESP+8],CL ; 填充1
005491F6 895424 04 MOV DWORD PTR SS:[ESP+4],EDX
005491FA 890424 MOV DWORD PTR SS:[ESP],EAX
005491FD 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
00549201 8B00 MOV EAX,DWORD PTR DS:[EAX]
00549203 894424 0C MOV DWORD PTR SS:[ESP+C],EAX ; 填充0XD9F6
00549207 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
0054920B 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
0054920E 894424 10 MOV DWORD PTR SS:[ESP+10],EAX ; 填充值
00549212 C74424 14 040000>MOV DWORD PTR SS:[ESP+14],4 ; 计数器为4
0054921A BE 00D07500 MOV ESI,MyNotesK.0075D000
0054921F 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C] ; EDX〈=0XD9F6
00549223 33C0 XOR EAX,EAX ; 清0
00549225 8A4424 08 MOV AL,BYTE PTR SS:[ESP+8] ; 取刚才填充的一个字节
00549229 8BD8 MOV EBX,EAX ; EBX〈=EAX
0054922B 03DB ADD EBX,EBX ; EBX=EBX+EBX
0054922D 8D1C5B LEA EBX,DWORD PTR DS:[EBX+EBX*2] ; EBX=EBX*3
00549230 8B04DE MOV EAX,DWORD PTR DS:[ESI+EBX*8] ; 查表
表是这样的{0,3,1,2,1,3,1,0,2,3,2,0,3,2,0,1,0,2,2,1,3,0,3,1}
00549233 8B0C24 MOV ECX,DWORD PTR SS:[ESP]
00549236 8B0C81 MOV ECX,DWORD PTR DS:[ECX+EAX*4] ; 又是查表(不同的数组)
这里的表是{0x55147626,0x8d0bf107,0xF9492A40,0x2874514A}
00549239 8B44DE 04 MOV EAX,DWORD PTR DS:[ESI+EBX*8+4] ; 查表
0054923D 8B3C24 MOV EDI,DWORD PTR SS:[ESP]
00549240 8B0487 MOV EAX,DWORD PTR DS:[EDI+EAX*4] ; 查表
00549243 8B5CDE 08 MOV EBX,DWORD PTR DS:[ESI+EBX*8+8] ; 查表
00549247 8B3C24 MOV EDI,DWORD PTR SS:[ESP]
0054924A 8B1C9F MOV EBX,DWORD PTR DS:[EDI+EBX*4] ; 查表
0054924D 03D3 ADD EDX,EBX ; EDX=EDX+EBX
0054924F 03DA ADD EBX,EDX ; EBX=EBX+EDX
00549251 8BFA MOV EDI,EDX ; EDI〈=EDX
00549253 C1EF 07 SHR EDI,7 ; EDI右移7位
00549256 33D7 XOR EDX,EDI ; EDX=EDX XOR EDI
00549258 03CA ADD ECX,EDX ; ECX=ECX+EDX
0054925A 03D1 ADD EDX,ECX ; EDX=EDX+ECX
0054925C 8BF9 MOV EDI,ECX ; EDI〈=ECX
0054925E C1E7 0D SHL EDI,0D ; 左移0XD位
00549261 33CF XOR ECX,EDI ; ECX=ECX XOR EDI
00549263 03C1 ADD EAX,ECX ; EAX=EAX+ECX
00549265 03C8 ADD ECX,EAX ; ECX=ECX+EAX
00549267 8BF8 MOV EDI,EAX ; EDI〈=EAX
00549269 C1EF 11 SHR EDI,11 ; EDI右移0X11位
0054926C 33C7 XOR EAX,EDI ; EAX=EAX XOR EDI
0054926E 03D8 ADD EBX,EAX ; EBX=EBX+EAX
00549270 03C3 ADD EAX,EBX ; EAX=EAX+EBX
00549272 8BFB MOV EDI,EBX ; EDI〈=EBX
00549274 C1E7 09 SHL EDI,9 ; EDI左移9位
00549277 33DF XOR EBX,EDI ; EBX=EBX XOR EDI
00549279 03D3 ADD EDX,EBX ; EDX=EDX+EBX
0054927B 03DA ADD EBX,EDX ; EBX=EBX+EDX
0054927D 8BFA MOV EDI,EDX ; EDI〈=EDX
0054927F C1EF 03 SHR EDI,3 ; EDI右移3位
00549282 33D7 XOR EDX,EDI ; EDX=EDX XOR EDI
00549284 03CA ADD ECX,EDX ; ECX=ECX+EDX
00549286 8BD1 MOV EDX,ECX ; EDX〈=ECX
00549288 C1E2 07 SHL EDX,7 ; EDX左移7位
0054928B 33CA XOR ECX,EDX ; ECX=ECX XOR EDX
0054928D 03C1 ADD EAX,ECX ; EAX=EAX+ECX
0054928F 8BD3 MOV EDX,EBX ; EDX〈=EBX
00549291 C1EA 0F SHR EDX,0F ; 右移0XF位
00549294 33C2 XOR EAX,EDX ; EAX=EAX XOR EDX
00549296 03D8 ADD EBX,EAX ; EBX=EBX+EAX
00549298 8BC3 MOV EAX,EBX ; EAX〈=EBX
0054929A C1E0 0B SHL EAX,0B ; 左移0XB位
0054929D 33D8 XOR EBX,EAX ; EBX=EBX XOR EAX
0054929F 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] ; 取4个字节到EAX
005492A3 33C3 XOR EAX,EBX ; EAX=EAX XOR EBX
005492A5 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C] ; 取4个字节到EDX
005492A9 895424 10 MOV DWORD PTR SS:[ESP+10],EDX ; 填充
005492AD 894424 0C MOV DWORD PTR SS:[ESP+C],EAX ; 填充
005492B1 83C6 0C ADD ESI,0C ; ESI=ESI+0XC(这个是把数组初始地址加高)
005492B4 FF4C24 14 DEC DWORD PTR SS:[ESP+14] ; 计数器--
005492B8 ^0F85 61FFFFFF JNZ MyNotesK.0054921F
005492BE 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
005492C2 8B5424 10 MOV EDX,DWORD PTR SS:[ESP+10]
005492C6 8910 MOV DWORD PTR DS:[EAX],EDX ; 填充
005492C8 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
005492CC 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]
005492D0 8950 04 MOV DWORD PTR DS:[EAX+4],EDX ; 填充
005492D3 83C4 18 ADD ESP,18
005492D6 5F POP EDI
005492D7 5E POP ESI
005492D8 5B POP EBX
005492D9 C3 RETN
这里的运算,我认为就是变换数组里的值,第一次填充的是常数(0XD9F6,注册中间值),然后进行复杂运算,变换数组里的值,里面
还用到了2个表第一个是{0,3,1,2,1,3,1,0,2,3,2,0,3,2,0,1,0,2,2,1,3,0,3,1},第2个是{0x55147626,0x8d0bf107,0xF9492A40,0x2874514A}
不知道为什么复杂的运算后是明码比较,悲。
算法小结:
先运算得到注册中间值,然后根据(注册中间值,和常数0XD9F6),进行运算,得到最后的注册码。
KeyGen 代码如下(C语言)
//为了省事没有对中文注册名进行处理,所以只能输入英文注册名
#include <stdio.h>
#include <math.h>
#include <string.h>
unsigned long temp[8];
int regcode[8];
unsigned long reg(char name[]) //根据注册名运算得到一个注册中间值,后面运算将用到
{
int len;
unsigned long ecx,edx,esi,c;
len=strlen(name);
ecx=0;
edx=0;
esi=0;
for(int b=0;b<len;b++)
{
c=name[b];
if(c>=97 && c<=122)
{c=c-32; //把注册名中小写的转化为大写
name[b]=c;}
}
for(int a=0;a<len;a++) //对转化后的注册名进行运算
{
ecx=ecx << 4;
edx=name[a];
ecx=ecx + edx;
edx=ecx;
edx=edx & 0xf0000000;
if(edx==0)
{edx=~edx;
ecx=ecx & edx;}
else
{esi=edx;
esi=esi >> 0x18;
ecx=ecx ^ esi;
edx=~edx;
ecx=ecx & edx;}
}
return ecx; //返回运算值
}
void DecToHex(unsigned long t) //dectohex后变换一下字符并输出
{
unsigned long a;
long c;
int i=0;
int p;
do
{
c=t%16;
temp[ i]=c;
i++;
}while((t/=16)!=0);
for(i--;i>=0;i--)
{
if(temp[ i]>=10&&temp[ i]<=15)//是字母?
temp[i]=(temp[ i]+55); //转化为ascii
}
for (int w=0;w<8;w++)
{
if(w%2==0) //根据情况变换
regcode[w]=temp[w+1];
else
regcode[w]=temp[w-1];
}
for(int o=0;o<=7;o++)
{
if(regcode[o]>=10) //是字母?
printf("%c",regcode[o]);
else
printf("%d",regcode[o]);
}
}
main()
{
char name[100];
unsigned long a,eax,ebx,edi,ecx,edx;
unsigned long cs[4]={0x55147626,0x8d0bf107,0xF9492A40,0x2874514A};
//程序内定16进制值
unsigned long hh[4]={0x1,0xd9f6,0x0,0x4};
//自己根据汇编代码定义的数组,第2个元素待填充(先设为0)
unsigned long zz[]={0,3,1,2,1,3,1,0,2,3,2,0,3,2,0,1,0,2,2,1,3,0,3,1};
//程序中定义的表
int b,pp;
printf("/t/t***************************************************/n");
printf("/t/t* KeyGen For MyNotesKeeper V1.4 */n");
printf("/t/t* Coded By lnn1123 */n");
printf("/t/t***************************************************/n");
printf("Please input your name:/n");
gets(name);
a=reg(name);
b=1;
hh[2]=a;
pp=4;
edx=0xd9f6;
int t=0;
for(int s=0;s<4;s++) //循环4次
{
edx=hh[1];
eax=hh[0];
ebx=eax;
ebx=ebx+ebx;
ebx=ebx*3;
if(t==0) //根据t值对数组访问,可能效率比较低
eax=zz[ebx*2];
if(t==3)
eax=zz[ebx*2+3];
if(t==6)
eax=zz[ebx*2+6];
if(t==9)
eax=zz[ebx*2+9];
ecx=cs[eax];
if(t==0) //根据t值对数组访问,可能效率比较低
eax=zz[ebx*2+1];
if(t==3)
eax=zz[ebx*2+3+1];
if(t==6)
eax=zz[ebx*2+6+1];
if(t==9)
eax=zz[ebx*2+9+1];
eax=cs[eax];
if(t==0) //根据t值对数组访问,可能效率比较低
ebx=zz[ebx*2+2];
if(t==3)
ebx=zz[ebx*2+3+2];
if(t==6)
ebx=zz[ebx*2+6+2];
if(t==9)
ebx=zz[ebx*2+9+2];
ebx=cs[ebx]; //下面是是进行运算
edx=edx+ebx;
ebx=ebx+edx;
edi=edx;
edi=edi >> 7;
edx=edx ^ edi;
ecx=ecx+edx;
edx=edx+ecx;
edi=ecx;
edi=edi << 0xd;
ecx=ecx ^ edi;
eax=eax+ecx;
ecx=ecx+eax;
edi=eax;
edi=edi >> 0x11;
eax=eax ^ edi;
ebx=ebx+eax;
eax=eax+ebx;
edi=ebx;
edi=edi << 0x9;
ebx=ebx ^ edi;
edx=edx+ebx;
ebx=ebx+edx;
edi=edx;
edi=edi >> 0x3;
edx=edx ^ edi;
ecx=ecx +edx;
edx=ecx;
edx=edx << 0x7;
ecx=ecx ^ edx;
eax=eax+ecx;
edx=ebx;
edx=edx >> 0xf;
eax=eax ^ edx;
ebx=ebx+eax;
eax=ebx;
eax=eax << 0xb;
ebx=ebx ^ eax;
eax=hh[2];
eax=eax ^ ebx;
edx=hh[1];
hh[2]=edx;
hh[1]=eax;
t=t+3;
}
printf("Your Regcode is :/n");
DecToHex(hh[2]);
DecToHex(hh[1]);
getchar();
}
特别感谢:
Phoenix,爱情诗人和所有帮助过我的人。^_^
=======================================================================================================
【破解声明】我是一个小小菜虫子,文章如有错误,请高手指正!
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
=======================================================================================================
文章完成于2005-12-22 18:08:46