CNCDEC 源码

这个是河南网通客户端使用的一段用户名加密算法,有很多的朋友一直询问,想知道这个东西是怎么实现的。今天就献丑贴出来,希望对需要的朋友有所帮助。

先贴一段汇编源码:

00E107FD    C645 >mov     byte ptr [ebp-24], 11
00E10801    C645 >mov     byte ptr [ebp-23], 34
00E10805    C645 >mov     byte ptr [ebp-22], 0C9
00E10809    C645 >mov     byte ptr [ebp-21], 23
00E1080D    C645 >mov     byte ptr [ebp-20], 75
00E10811    C645 >mov     byte ptr [ebp-1F], 18
00E10815    C645 >mov     byte ptr [ebp-1E], 0D7
00E10819    C645 >mov     byte ptr [ebp-1D], 0E2
00E1081D    C645 >mov     byte ptr [ebp-1C], 12
00E10821    C645 >mov     byte ptr [ebp-1B], 35
00E10825    C645 >mov     byte ptr [ebp-1A], 29
00E10829    C645 >mov     byte ptr [ebp-19], 2B
00E1082D    C645 >mov     byte ptr [ebp-18], 0EC
00E10831    C645 >mov     byte ptr [ebp-17], 0B6
00E10835    C645 >mov     byte ptr [ebp-16], 23
00E10839    C645 >mov     byte ptr [ebp-15], 19

 

00E10854    8A040>mov     al, byte ptr [edx+ecx]
00E10857    75 50 jnz     short 00E108A9
00E10859    33FF  xor     edi, edi
00E1085B    3887 >cmp     byte ptr [edi+E1FED8], al
00E10861    74 08 je      short 00E1086B
00E10863    47    inc     edi
00E10864    83FF >cmp     edi, 3E                        //循环3E次,=59
00E10867  ^ 72 F2 jb      short 00E1085B

00E107F8    56              push    esi
00E107F9    6A 25           push    25
00E107FB    3BDF            cmp     ebx, edi
00E107FD    C645 DC 11      mov     byte ptr [ebp-24], 11
00E10801    C645 DD 34      mov     byte ptr [ebp-23], 34
00E10805    C645 DE C9      mov     byte ptr [ebp-22], 0C9
00E10809    C645 DF 23      mov     byte ptr [ebp-21], 23
00E1080D    C645 E0 75      mov     byte ptr [ebp-20], 75
00E10811    C645 E1 18      mov     byte ptr [ebp-1F], 18
00E10815    C645 E2 D7      mov     byte ptr [ebp-1E], 0D7
00E10819    C645 E3 E2      mov     byte ptr [ebp-1D], 0E2
00E1081D    C645 E4 12      mov     byte ptr [ebp-1C], 12
00E10821    C645 E5 35      mov     byte ptr [ebp-1B], 35
00E10825    C645 E6 29      mov     byte ptr [ebp-1A], 29
00E10829    C645 E7 2B      mov     byte ptr [ebp-19], 2B
00E1082D    C645 E8 EC      mov     byte ptr [ebp-18], 0EC
00E10831    C645 E9 B6      mov     byte ptr [ebp-17], 0B6
00E10835    C645 EA 23      mov     byte ptr [ebp-16], 23
00E10839    C645 EB 19      mov     byte ptr [ebp-15], 19
00E1083D    5E              pop     esi
00E1083E    897D F8         mov     dword ptr [ebp-8], edi
00E10841    7E 78           jle     short 00E108BB
00E10843    8B55 0C         mov     edx, dword ptr [ebp+C]
00E10846    8BC8            mov     ecx, eax
00E10848    2BD0            sub     edx, eax
00E1084A    897D F4         mov     dword ptr [ebp-C], edi
00E1084D    8955 0C         mov     dword ptr [ebp+C], edx
00E10850    807D FF 00      cmp     byte ptr [ebp-1], 0
00E10854    8A040A          mov     al, byte ptr [edx+ecx]
00E10857    75 50           jnz     short 00E108A9
00E10859    33FF            xor     edi, edi
00E1085B    3887 D8FEE100   cmp     byte ptr [edi+E1FED8], al
00E10861    74 08           je      short 00E1086B
00E10863    47              inc     edi
00E10864    83FF 3E         cmp     edi, 3E
00E10867  ^ 72 F2           jb      short 00E1085B
00E10869    EB 05           jmp     short 00E10870
00E1086B    83FF FF         cmp     edi, -1
00E1086E    75 06           jnz     short 00E10876
00E10870    C645 FF 01      mov     byte ptr [ebp-1], 1
00E10874    EB 33           jmp     short 00E108A9
00E10876    8B45 F8         mov     eax, dword ptr [ebp-8]
00E10879    6A 10           push    10
00E1087B    99              cdq
00E1087C    5B              pop     ebx
00E1087D    F7FB            idiv    ebx
00E1087F    6A 3E           push    3E
00E10881    8B5D F0         mov     ebx, dword ptr [ebp-10]
00E10884    0FB64415 DC     movzx   eax, byte ptr [ebp+edx-24]
00E10889    8D1476          lea     edx, dword ptr [esi+esi*2]
00E1088C    33C2            xor     eax, edx
00E1088E    33D2            xor     edx, edx
00E10890    3345 F4         xor     eax, dword ptr [ebp-C]
00E10893    03C7            add     eax, edi
00E10895    5F              pop     edi
00E10896    F7F7            div     edi
00E10898    8D82 D9240000   lea     eax, dword ptr [edx+24D9]
00E1089E    33F0            xor     esi, eax
00E108A0    8A82 D8FEE100   mov     al, byte ptr [edx+E1FED8]
00E108A6    8B55 0C         mov     edx, dword ptr [ebp+C]
00E108A9    FF45 F8         inc     dword ptr [ebp-8]
00E108AC    8345 F4 05      add     dword ptr [ebp-C], 5
00E108B0    8801            mov     byte ptr [ecx], al
00E108B2    41              inc     ecx
00E108B3    395D F8         cmp     dword ptr [ebp-8], ebx
00E108B6  ^ 7C 98           jl      short 00E10850
00E108B8    8B45 EC         mov     eax, dword ptr [ebp-14]
00E108BB    8B4D 10         mov     ecx, dword ptr [ebp+10]
00E108BE    802418 00       and     byte ptr [eax+ebx], 0
00E108C2    5E              pop     esi
00E108C3    8901            mov     dword ptr [ecx], eax
00E108C5    33C0            xor     eax, eax
00E108C7    5F              pop     edi
00E108C8    5B              pop     ebx
00E108C9    C9              leave
00E108CA    C2 0C00         retn    0C
00E108CD    55              push    ebp
00E108CE    8BEC            mov     ebp, esp
00E108D0    83EC 28         sub     esp, 28

00E10864    83FF 3E         cmp     edi, 3E
00E10867  ^ 72 F2           jb      short 00E1085B
00E10869    EB 05           jmp     short 00E10870
00E1086B    83FF FF         cmp     edi, -1
00E1086E    75 06           jnz     short 00E10876
00E10870    C645 FF 01      mov     byte ptr [ebp-1], 1
00E10874    EB 33           jmp     short 00E108A9
00E10876    8B45 F8         mov     eax, dword ptr [ebp-8]
00E10879    6A 10           push    10
00E1087B    99              cdq
00E1087C    5B              pop     ebx
00E1087D    F7FB            idiv    ebx
00E1087F    6A 3E           push    3E
00E10881    8B5D F0         mov     ebx, dword ptr [ebp-10]
00E10884    0FB64415 DC     movzx   eax, byte ptr [ebp+edx-24]
00E10889    8D1476          lea     edx, dword ptr [esi+esi*2]
00E1088C    33C2            xor     eax, edx
00E1088E    33D2            xor     edx, edx
00E10890    3345 F4         xor     eax, dword ptr [ebp-C]
00E10893    03C7            add     eax, edi
00E10895    5F              pop     edi
00E10896    F7F7            div     edi
00E10898    8D82 D9240000   lea     eax, dword ptr [edx+24D9]
00E1089E    33F0            xor     esi, eax
00E108A0    8A82 D8FEE100   mov     al, byte ptr [edx+E1FED8]       //得出

00E10850    807D FF 00      cmp     byte ptr [ebp-1], 0
00E10854    8A040A          mov     al, byte ptr [edx+ecx]
00E10857    75 50           jnz     short 00E108A9
00E10859    33FF            xor     edi, edi
00E1085B    3887 D8FEE100   cmp     byte ptr [edi+E1FED8], al
00E10861    74 08           je      short 00E1086B
00E10863    47              inc     edi
00E10864    83FF 3E         cmp     edi, 3E
00E10867  ^ 72 F2           jb      short 00E1085B
00E10869    EB 05           jmp     short 00E10870
00E1086B    83FF FF         cmp     edi, -1
00E1086E    75 06           jnz     short 00E10876
00E10870    C645 FF 01      mov     byte ptr [ebp-1], 1
00E10874    EB 33           jmp     short 00E108A9
00E10876    8B45 F8         mov     eax, dword ptr [ebp-8]
00E10879    6A 10           push    10
00E1087B    99              cdq
00E1087C    5B              pop     ebx
00E1087D    F7FB            idiv    ebx
00E1087F    6A 3E           push    3E
00E10881    8B5D F0         mov     ebx, dword ptr [ebp-10]
00E10884    0FB64415 DC     movzx   eax, byte ptr [ebp+edx-24]
00E10889    8D1476          lea     edx, dword ptr [esi+esi*2]
00E1088C    33C2            xor     eax, edx
00E1088E    33D2            xor     edx, edx
00E10890    3345 F4         xor     eax, dword ptr [ebp-C]
00E10893    03C7            add     eax, edi
00E10895    5F              pop     edi
00E10896    F7F7            div     edi
00E10898    8D82 D9240000   lea     eax, dword ptr [edx+24D9]
00E1089E    33F0            xor     esi, eax
00E108A0    8A82 D8FEE100   mov     al, byte ptr [edx+E1FED8]
00E108A6    8B55 0C         mov     edx, dword ptr [ebp+C]
00E108A9    FF45 F8         inc     dword ptr [ebp-8]
00E108AC    8345 F4 05      add     dword ptr [ebp-C], 5
00E108B0    8801            mov     byte ptr [ecx], al
00E108B2    41              inc     ecx
00E108B3    395D F8         cmp     dword ptr [ebp-8], ebx
00E108B6  ^ 7C 98           jl      short 00E10850
00E108B8    8B45 EC         mov     eax, dword ptr [ebp-14]
00E108BB    8B4D 10         mov     ecx, dword ptr [ebp+10]
00E108BE    802418 00       and     byte ptr [eax+ebx], 0
00E108C2    5E              pop     esi
00E108C3    8901            mov     dword ptr [ecx], eax
00E108C5    33C0            xor     eax, eax
00E108C7    5F              pop     edi
00E108C8    5B              pop     ebx
00E108C9    C9              leave

 

关键部分已经加上注释,应该很容易看出,这样我们把这段翻译成c或者c++就可以了

下面是c++ builder 语言源码

加密函数如下:

 

AnsiString __fastcall TForm1::EnCode(AnsiString string)
{
char cas_str[]="9012345678abcdeABCDEFGHIJKLMNfghijklmnUVWXYZxyzuvwopqrstOPQRST";
int cas_str_buffer[16];
int cas_esi = 37;
char src_str[128]="",dec_str[128]="";
int k=0;
int cas_eax,cas_edx;
div_t x;
unsigned int  i,j;
cas_str_buffer[15]=25;
cas_str_buffer[14]=35;
cas_str_buffer[13]=182;
cas_str_buffer[12]=236;
cas_str_buffer[11]=43;
cas_str_buffer[10]=41;
cas_str_buffer[9]=53;
cas_str_buffer[8]=18;
cas_str_buffer[7]=226;
cas_str_buffer[6]=215;
cas_str_buffer[5]=24;
cas_str_buffer[4]=117;
cas_str_buffer[3]=35;
cas_str_buffer[2]=201;
cas_str_buffer[1]=52;
cas_str_buffer[0]=17;
strcpy(src_str,string.c_str());
for ( i=0;i<strlen(src_str);i++)
{
     for(j=0;j<strlen(cas_str);j++)
       {

         if (src_str[i]==cas_str[j]){
             if(i<16)
             cas_eax=cas_str_buffer[i];
             else {
             x=div(i,16);
              cas_eax=cas_str_buffer[x.rem] ;
                  }
             cas_edx=cas_esi+cas_esi*2 ;
             cas_eax=cas_eax^cas_edx;
             cas_eax=cas_eax^k;
             cas_eax=cas_eax+j;
             x = div(cas_eax,62);
             dec_str[i]=cas_str[x.rem];
             cas_edx=x.rem ;
             cas_esi=cas_esi^(cas_edx+9433);
              break;
                            }
         }
      if( dec_str[i]==NULL)
          dec_str[i]=src_str[i];
    k=k+5;
}
  string=dec_str;
return string;
}

 

有很多朋友问他的逆向变换,就是解密过程,有了加密过程,解密就容易了

下面是函数:

AnsiString __fastcall TForm1::DeCode(AnsiString string)
{
char src_temp[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if(string.SubString(1,2)=="2:")string=string.SubString(3,string.Length()-2);
AnsiString TempString="";
AnsiString TempString1="";
for(int j=0;j<string.Length()+1;j++)
{
for(int i=0;i<62;i++)
{
TempString = TempString1 + AnsiString(src_temp[i]);
if(EnCode(TempString)== string.SubString(1,j))
{
TempString1=TempString;
break;
}
}
}
return TempString1;
}

需要完整源码的可以在http://download.csdn.net/source/2071711下载

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页