完美世界封包加密代码(原文)
完美世界封包加密代码
10002FBE 55 push ebp
10002FBF 8BEC mov ebp,esp
10002FC1 53 push ebx
10002FC2 56 push esi
10002FC3 57 push edi
10002FC4 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
10002FC7 8B55 0C mov edx,dword ptr ss:[ebp+C]
10002FCA 837D 10 00 cmp dword ptr ss:[ebp+10],0
10002FCE 76 6B jbe short 1000303B
10002FD0 8A99 00010000 mov bl,byte ptr ds:[ecx+100]
10002FD6 FEC3 inc bl
10002FD8 8899 00010000 mov byte ptr ds:[ecx+100],bl
10002FDE 81E3 FF000000 and ebx,0FF
10002FE4 8A040B mov al,byte ptr ds:[ebx+ecx]
10002FE7 8D340B lea esi,dword ptr ds:[ebx+ecx]
10002FEA 8A99 01010000 mov bl,byte ptr ds:[ecx+101]
10002FF0 02D8 add bl,al
10002FF2 8899 01010000 mov byte ptr ds:[ecx+101],bl
10002FF8 81E3 FF000000 and ebx,0FF
10002FFE 8A040B mov al,byte ptr ds:[ebx+ecx]
10003001 8D3C0B lea edi,dword ptr ds:[ebx+ecx]
10003004 8A1E mov bl,byte ptr ds:[esi]
10003006 8806 mov byte ptr ds:[esi],al
10003008 33C0 xor eax,eax
1000300A 881F mov byte ptr ds:[edi],bl
1000300C 8A81 01010000 mov al,byte ptr ds:[ecx+101]
10003012 33DB xor ebx,ebx
10003014 8A99 00010000 mov bl,byte ptr ds:[ecx+100]
1000301A 8A0408 mov al,byte ptr ds:[eax+ecx]
1000301D 02040B add al,byte ptr ds:[ebx+ecx]
10003020 8A1A mov bl,byte ptr ds:[edx]
10003022 25 FF000000 and eax,0FF
10003027 8A0408 mov al,byte ptr ds:[eax+ecx]
1000302A 32D8 xor bl,al
1000302C 8B45 10 mov eax,dword ptr ss:[ebp+10]
1000302F 881A mov byte ptr ds:[edx],bl
10003031 42 inc edx
10003032 8BDA mov ebx,edx
10003034 2B5D 0C sub ebx,dword ptr ss:[ebp+C]
10003037 3BD8 cmp ebx,eax //EAX为总字符,EBX为已经加密了多少
10003039 ^ 72 95 jb short 10002FD0
1000303B 5F pop edi
1000303C 5E pop esi
1000303D 5B pop ebx
1000303E C9 leave
1000303F C2 0C00 retn 0C
是汇编的,有能力的翻译一下吧
Re:完美世界封包加密代码
这个算法相当简单
arg4:[ebp+8]//加密码表,长度0x100[0..$FF], 100,101存放临时结果
arg8:[ebp+C]]//Buffer,要加密的数据;每次加密一个字节,简单的xor,add,和码表运算
argc:[ebp+10]//BufferSize,加密的数据字节数
自己好好看看,不难还原成高级语言的
Re:完美世界封包加密代码
typedef struct { //这里把一个未命名结构直接取了一个叫arg1的别名,
unsigned char table[256];
unsigned char a;
unsigned char b;
} arg1;
void encrypt(arg1* handle, unsigned char *data, int len)
{
register unsigned char *ptr = data;
register unsigned char m;
if( len <= 0 ) return;
do {
handle->a++;
m = handle->table[handle->a];
handle->b += m;
handle->table[handle->a] = handle->table[handle->b];
handle->table[handle->b] = m;
*(ptr) = handle->table[*(ptr)] ^ handle->table[m+handle->table[handle->a]];
ptr++;
} while(ptr-data < len);
}
没有评论:
发表评论