这个是河南网通客户端使用的一段用户名加密算法,有很多的朋友一直询问,想知道这个东西是怎么实现的。今天就献丑贴出来,希望对需要的朋友有所帮助。
先贴一段汇编源码:
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下载