2007年4月2日星期一

完美世界封包加密代码(原文)

完美世界封包加密代码(原文)
完美世界封包加密代码
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);
}

没有评论: