【文章标题】: 黄河Flash播放器V7.63的算法分析+注册机源码
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 注册码
【编写语言】: dephi
【使用工具】: OD
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  有一些Flash文件需要看一看,手头没有合适的播放器,于是上网下载了一个,顺便破解了一下。注册码计算过程如下:
  004B9FF4  |.  0FB630        movzx   esi, byte ptr [eax]              ;  识别号的第1个字符入ESI
  004B9FF7  |.  66:6BC6 64    imul    ax, si, 64                       ;  SI*64,设结果为A
  004B9FFB  |.  66:8945 F8    mov     word ptr [ebp-8], ax
  004B9FFF  |.  8BC6          mov     eax, esi
  004BA001  |.  C1E0 09       shl     eax, 9                           ;  识别号的第1个字符左移9位,设结果为B
  004BA004  |.  66:8945 F6    mov     word ptr [ebp-A], ax
  004BA008  |.  B3 01         mov     bl, 1                            ;  1入BL
  004BA00A  |>  8B45 FC       /mov     eax, dword ptr [ebp-4]
  004BA00D  |.  E8 92ABF4FF   |call    00404BA4                        ;  十六进制数D入EAX
  004BA012  |.  50            |push    eax
  004BA013  |.  33C0          |xor     eax, eax
  004BA015  |.  8AC3          |mov     al, bl
  004BA017  |.  5A            |pop     edx
  004BA018  |.  8BCA          |mov     ecx, edx
  004BA01A  |.  99            |cdq
  004BA01B  |.  F7F9          |idiv    ecx
  004BA01D  |.  8B45 FC       |mov     eax, dword ptr [ebp-4]          ;  识别号入EAX(识别号最后加一个0x1)
  004BA020  |.  8A0410        |mov     al, byte ptr [eax+edx]          ;  识别号依次入AL(从第2个开始)
  004BA023  |.  0FB7D6        |movzx   edx, si
  004BA026  |.  C1EA 08       |shr     edx, 8
  004BA029  |.  32C2          |xor     al, dl
  004BA02B  |.  33D2          |xor     edx, edx
  004BA02D  |.  8AD3          |mov     dl, bl
  004BA02F  |.  B9 DCA04B00   |mov     ecx, 004BA0DC                   ;  qwert yuiop asdfg hjkl zxcvbnm
  004BA034  |.  324411 FF     |xor     al, byte ptr [ecx+edx-1]        ;  上面字符串中相对应的字符与AL异或(第几次循环就取第几个)
  004BA038  |.  50            |push    eax                             ;  压栈
  004BA039  |.  8B45 FC       |mov     eax, dword ptr [ebp-4]
  004BA03C  |.  E8 63ABF4FF   |call    00404BA4                        ;  十六进制数D入EAX
  004BA041  |.  5A            |pop     edx                             ;  出栈
  004BA042  |.  02D0          |add     dl, al                          ;  DL+AL
  004BA044  |.  8855 FB       |mov     byte ptr [ebp-5], dl            ;  保存
  004BA047  |.  33C0          |xor     eax, eax
  004BA049  |.  8A45 FB       |mov     al, byte ptr [ebp-5]            ;  取出
  004BA04C  |.  B9 3E000000   |mov     ecx, 3E                         ;  3E入ECX
  004BA051  |.  99            |cdq
  004BA052  |.  F7F9          |idiv    ecx                             ;  EAX/ECX
  004BA054  |.  42            |inc     edx                             ;  余数+1
  004BA055  |.  8855 FB       |mov     byte ptr [ebp-5], dl            ;  保存
  004BA058  |.  8D45 F0       |lea     eax, dword ptr [ebp-10]
  004BA05B  |.  33D2          |xor     edx, edx
  004BA05D  |.  8A55 FB       |mov     dl, byte ptr [ebp-5]
  004BA060  |.  B9 04A14B00   |mov     ecx, 004BA104                   ;  0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  004BA065  |.  8A5411 FF     |mov     dl, byte ptr [ecx+edx-1]        ;  查表得出注册号的一个字符
  004BA069  |.  E8 5EAAF4FF   |call    00404ACC
  004BA06E  |.  8B55 F0       |mov     edx, dword ptr [ebp-10]
  004BA071  |.  8BC7          |mov     eax, edi
  004BA073  |.  E8 34ABF4FF   |call    00404BAC
  004BA078  |.  33C0          |xor     eax, eax
  004BA07A  |.  8AC3          |mov     al, bl
  004BA07C  |.  8B17          |mov     edx, dword ptr [edi]
  004BA07E  |.  0FB64402 FF   |movzx   eax, byte ptr [edx+eax-1]
  004BA083  |.  66:03F0       |add     si, ax                          ;  si+此次循环得出的注册码中的一个字符
  004BA086  |.  66:0FAF75 F8  |imul    si, word ptr [ebp-8]            ;  SI*A
  004BA08B  |.  66:0375 F6    |add     si, word ptr [ebp-A]            ;  SI+B
  004BA08F  |.  43            |inc     ebx
  004BA090  |.  80FB 1F       |cmp     bl, 1F
  004BA093  |.^ 0F85 71FFFFFF \jnz     004BA00A                        ;  循环30次
  
  如我的识别号为:ID2954489354
  注册码为:Yhg826B66S0h44bmIb3OMLIblDuKWB

  注册机源码如下:
  #include<iostream.h>
  int main()
  {
    char cShibiehao[14];
    unsigned char  cShi;  //cShi为识别号在循环体中的暂存字符
    char cSerial[31];          //存放注册码
    char table1[]={"Qwert yuiop asdfg hjkl zxcvbnm"};
    char table2[]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"};
    int tempA,tempB,i;
    int temp;                      //ESI循环初值
    cout<<"请输入识别号:";
    cin>>cShibiehao;
    cShibiehao[12]=1;cShibiehao[13]=0;
    tempA=cShibiehao[0]*0x64;
    tempB=cShibiehao[0]<<9;
    temp=cShibiehao[0];         //赋初值,识别号的第1个字符
    for(i=0;i<30;i++)
    {
      cShi=cShibiehao[(i+1)%13];
      cShi^=(temp>>8);
      cShi^=table1[i];         //与表1异或
      cShi+=0xD;
      cShi=cShi%0x3E;
      cSerial[i]=table2[cShi]; //查表得出注册码
      temp=(temp+cSerial[i])*tempA+tempB;
      temp&=0xFFFF;
    }
    cSerial[30]=0;
    cout<<endl<<"serial:"<<cSerial<<endl;
    return 0;
  }
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年11月25日 下午 07:54:36