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;
}