Powercmd2.1是一个CMD管理平台,可以同时打开多个CMD窗口,并且有输入路径和文件名提示选择,省去了长路径和文件名的输入时间,也可以实时查看和设置系统变量……
破解过程如下:
1 载入程序,运行,打开注册对话框,用ollyice的窗口查看,可以得到相关信息,但是无法设置ok按钮的消息中断。
2 另找突破口,打开关于对话框,有未注册提示。用字串查找确定被引用的位置:
005FC8E0 |> 68 D4126900 PUSH PowerCmd.006912D4 ; unregistered, trial user!
向上走到:
005FC8AB |. 0FB605 14A170>MOVZX EAX,BYTE PTR DS:[70A114]
005FC8B2 |. 85C0 TEST EAX,EAX
005FC8B4 |. 74 2A JE SHORT PowerCmd.005FC8E0
在005FC8AB行从70A114读入数据到EAX,在005FC8B2检查是否注册成功标志赋值,在005FC8B4行如果值为0,跳到未注册信息。这说明70a114非常重要,那么在代码中有哪些地方对这个地址进行了读写呢?
3 用w32dasm打开程序,查找14a170十六进制代码,找到有三个地方,其中只有这个地方是我们需要的:
005FAE9E
4 回到ollyice ,找到地址005FAE9E,向上翻到下列地址:
005FA880 /$ 55 PUSH EBP ; 从此处开始分析
…
005FA8B8 |. 83F8 17 CMP EAX,17 ; 密码长度必须为23个字符长
…
005FA9E8 |. 83F8 05 CMP EAX,5 ;和往下的三句都是检查注册码的长度是否为5字节,注册码分为4段,中间用 - 分开,共23个字符长。
…
从下句005FAA4D 开始进行运算,到005FAB24 。运算内容为:
设如以下注册码:PCMDA-66985-AA859-D69NN
先将P和第二段第一个6相加,保存值,将C和第二段的第二个6相加,保存值,将M和第二段的9相加,保存值,将D和第二段的8相加,保存值,将A和第二段的5相加,保存值,将四个保存的值相加。
再将第三段的第一个A和第四段的D相加,保存值,将第三段的第二个A和第四段的6相加,保存值,将第三段的8和第四段9相加,保存值,将第三段的5和第四段的第一个N相加,保存值,将第三段的9和第四段的第二个N相加,保存值,将四个保存的值相加。
最后第一二段的总和与第三四段的总和比较,如果相等,继续运行到:
005FAC0D |. 3B85 4CFFFFFF CMP EAX,DWORD PTR SS:[EBP-B4]
005FAC13 |. 75 04 JNZ SHORT PowerCmd.005FAC19
005FAC15 |. C645 F3 01 MOV BYTE PTR SS:[EBP-D],1 ; 这句很重要!!!
005FAC19 |> 6A 00 PUSH 0
向下:
005FAC29 |. 83F9 50 CMP ECX,50 ; 第一个字符为P
…
005FAC3E |. 83FA 43 CMP EDX,43 ; 第二个字符为C
…
从下句005FAB2A 开始进行第二次运算,到005FAC07 。
005FAC47 |> \6A 00 PUSH 0
…
005FAE01 |. 8B85 40FFFFFF MOV EAX,DWORD PTR SS:[EBP-C0]
运算内容为:
先将P和第三段第一个A相加,保存值,将C和第二段的第二个A相加,保存值,将M和第二段的8相加,保存值,将D和第二段的5相加,保存值,将A和第二段的9相加,保存值,将四个保存的值相加。
再将第三段的第一个6和第四段的D相加,保存值,将第三段的第二个6和第四段的6相加,保存值,将第三段的9和第四段9相加,保存值,将第三段的8和第四段的第一个N相加,保存值,将第三段的5和第四段的第二个N相加,保存值,将四个保存的值相加。
最后第一三段的总和与第二四段的总和比较。
005FAE07 |. 3B85 4CFFFFFF CMP EAX,DWORD PTR SS:[EBP-B4]
005FAE0D |. 7D 04 JGE SHORT PowerCmd.005FAE13 ; 如果大于或等于,继续运行
005FAE0F |. C645 F3 00 MOV BYTE PTR SS:[EBP-D],0 ;否则置0
005FAE13 |> 6A 02 PUSH 2
005FAE15 |. 8D8D 70FFFFFF LEA ECX,DWORD PTR SS:[EBP-90]
005FAE1B |. E8 70D9E0FF CALL PowerCmd.00408790
005FAE20 |. 0FB708 MOVZX ECX,WORD PTR DS:[EAX]
005FAE23 |. 83F9 4D CMP ECX,4D ;第三个字符为M
005FAE26 |. 75 2A JNZ SHORT PowerCmd.005FAE52
005FAE28 |. 6A 03 PUSH 3
005FAE2A |. 8D8D 70FFFFFF LEA ECX,DWORD PTR SS:[EBP-90]
005FAE30 |. E8 5BD9E0FF CALL PowerCmd.00408790
005FAE35 |. 0FB710 MOVZX EDX,WORD PTR DS:[EAX]
005FAE38 |. 83FA 44 CMP EDX,44 ;第四个字符为D
005FAE3B |. 75 15 JNZ SHORT PowerCmd.005FAE52
005FAE3D |. 6A 04 PUSH 4
005FAE3F |. 8D8D 70FFFFFF LEA ECX,DWORD PTR SS:[EBP-90]
005FAE45 |. E8 46D9E0FF CALL PowerCmd.00408790
005FAE4A |. 0FB700 MOVZX EAX,WORD PTR DS:[EAX]
005FAE4D |. 83F8 41 CMP EAX,41 ;第五个字符为A
005FAE50 |. 74 04 JE SHORT PowerCmd.005FAE56
005FAE52 |> C645 F3 00 MOV BYTE PTR SS:[EBP-D],0
005FAE56 |> C645 FC 03 MOV BYTE PTR SS:[EBP-4],3
005FAE5A |. 8D4D A8 LEA ECX,DWORD PTR SS:[EBP-58]
005FAE5D |. E8 DE7CE0FF CALL PowerCmd.00402B40
005FAE62 |. C645 FC 02 MOV BYTE PTR SS:[EBP-4],2
005FAE66 |. 8D8D 54FFFFFF LEA ECX,DWORD PTR SS:[EBP-AC]
005FAE6C |. E8 CF7CE0FF CALL PowerCmd.00402B40
005FAE71 |. C645 FC 01 MOV BYTE PTR SS:[EBP-4],1
005FAE75 |. 8D4D 8C LEA ECX,DWORD PTR SS:[EBP-74]
005FAE78 |. E8 C37CE0FF CALL PowerCmd.00402B40
005FAE7D |. C645 FC 00 MOV BYTE PTR SS:[EBP-4],0
005FAE81 |. 8D8D 70FFFFFF LEA ECX,DWORD PTR SS:[EBP-90]
005FAE87 |. E8 B47CE0FF CALL PowerCmd.00402B40
005FAE8C |> C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
005FAE93 |. 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
005FAE96 |. E8 A57CE0FF CALL PowerCmd.00402B40
005FAE9B |> 8A4D F3 MOV CL,BYTE PTR SS:[EBP-D]
005FAE9E |. 880D 14A17000 MOV BYTE PTR DS:[70A114],CL
005FAEA4 |. 8A45 F3 MOV AL,BYTE PTR SS:[EBP-D]
005FAEA7 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
005FAEAA |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX
005FAEB1 |. 59 POP ECX
005FAEB2 |. 5E POP ESI
005FAEB3 |. 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
005FAEB6 |. 33CD XOR ECX,EBP
005FAEB8 |. E8 FF27E2FF CALL PowerCmd.0041D6BC
005FAEBD |. 8BE5 MOV ESP,EBP
005FAEBF |. 5D POP EBP
005FAEC0 \. C3 RETN
5 根据以上注册码检查运算过程编写的注册码生成算法:
#include “windows.h”
int _tmain(int argc, _TCHAR* argv[])
{
char one[]={'P','C','M','D','A'};//第一段固定字符
char two[5],three[5],four[5];
char code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
bool ok=false;
do
{
for(int i=0;i<5;i++)//生成第二段
{
for(;;)
{
int t=rand();
if(t>=0 && t<36)
{
two[i]=code[t];
break;
}
}
}
for(int i=0;i<5;i++)//生成第三段
{
for(;;)
{
int t=rand();
if(t>=0 && t<36)
{
three[i]=code[t];
break;
}
}
}
for(int i=0;i<5;i++)//生成第四段
{
for(;;)
{
int t=rand();
if(t>=0 && t<36)
{
four[i]=code[t];
break;
}
}
}
int t1=0,t2=0,t3=0,t4=0;
for(int k=0;k<5;k++)
{
t1=t1+one[k]+two[k];
t2=t2+three[k]+four[k];
t3=t3+one[k]+three[k];
t4=t4+two[k]+four[k];
}
if(t1==t2 && t3>=t4)
ok=true;
}while(ok==false);
printf("生成的注册码为: PCMDA-%c%c%c%c%c-%c%c%c%c%c-%c%c%c%c%c \n",two[0], two[1], two[2], two[3],two[4],three[0],three[1],three[2],three[3],three[4],four[0],four[1],four[2],four[3],four[4]);
return 0;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!