麻辣江湖登录包的加密解密过程
游戏启动后首先从服务器接收一个 key ,然后对key加密mov esi,key
007A7B9D 8B56 11 mov edx,dword ptr ds:
007A7BA0 8B76 08 mov esi,dword ptr ds:
007A7BA3 8BCA mov ecx,edx
007A7BA5 8BDA mov ebx,edx
007A7BA7 81F1 CF236D00 xor ecx,0x6D23CF
007A7BAD 81E9 99236D00 sub ecx,game.006D2399
007A7BB3 83F2 CF xor edx,0xFFFFFFCF
007A7BB6 F7D1 not ecx
007A7BB8 83C2 67 add edx,0x67
007A7BBB 81F3 CF236D2E xor ebx,0x2E6D23CF
007A7BC1 81E1 00FFFF00 and ecx,0xFFFF00
007A7BC7 F7D2 not edx
007A7BC9 81EB 99236D2E sub ebx,0x2E6D2399
007A7BCF C1E2 18 shl edx,0x18
007A7BD2 F7D3 not ebx
007A7BD4 C1EB 18 shr ebx,0x18
007A7BD7 0BCB or ecx,ebx
007A7BD9 0BCA or ecx,edx
007A7BDB 55 push ebp
007A7BDC 51 push ecx//ecx的值,解密会用到
007A7BDD 8BD6 mov edx,esi
007A7BDF 8BCE mov ecx,esi
007A7BE1 81F2 CF236D00 xor edx,0x6D23CF
007A7BE7 81F1 CF236D2E xor ecx,0x2E6D23CF
007A7BED 81EA 99236D00 sub edx,game.006D2399
007A7BF3 81E9 99236D2E sub ecx,0x2E6D2399
007A7BF9 83F6 CF xor esi,0xFFFFFFCF
007A7BFC F7D2 not edx
007A7BFE F7D1 not ecx
007A7C00 83C6 67 add esi,0x67
007A7C03 81E2 00FFFF00 and edx,0xFFFF00
007A7C09 C1E9 18 shr ecx,0x18
007A7C0C 0BD1 or edx,ecx
007A7C0E F7D6 not esi
007A7C10 C1E6 18 shl esi,0x18
007A7C13 0BD6 or edx,esi
007A7C15 52 push edx//edx的值,加密会用到
007A7C16 57 push edi
007A7C17 8BC8 mov ecx,eax
登录时,会对密码进行MD5加密
004D5558 FF15 48398900 call dword ptr ds:[<&engine.?KG_EDStringToMD5String@@YAHQADQBD@Z>]
?KG_EDStringToMD5String@@YAHQADQBD@Z这个函数会生成一个登录封包
下面代码调用游戏目录里的engine.dll文件的?KG_EDStringToMD5String@@YAHQADQBD@Z函数
DWORD user_pwd_b;
DWORD *p_b=user_pwd_b;
DWORD user_pwd_m;
DWORD *addr_md5=user_pwd_m;
HINSTANCE hDllInst = LoadLibrary("engine.dll");
typedefDWORD * ( __cdecl *MYFUNC)(DWORD*,DWORD*);
MYFUNC EDStringToMD5String ;
EDStringToMD5String = (MYFUNC)GetProcAddress(hDllInst,"?KG_EDStringToMD5String@@YAHQADQBD@Z");
EDStringToMD5String(addr_md5,user_pwd_b);
DWORD pack_addr; //登录包
_asm
{
push eax
lea eax, //封包首地址,来自?KG_EDStringToMD5String@@YAHQADQBD@Z函数
mov pack_addr,eax
pop eax
}
首先得到的值,第一次加密会用到
errno_t mTime;
_asm
{
mov ebx, _time32
push 0
call ebx
mov ebx,0
mov mTime,eax
add esp,4
}
登录包第一次加密
005081A4 A1 7C4A9600 mov eax,dword ptr ds: //来自_time32函数
005081A9 8DA424 00000000 lea esp,dword ptr ss:
005081B0 69C0 F5B90300 imul eax,eax,0x3B9F5
005081B6 05 9D831700 add eax,0x17839D
005081BB 83E9 01 sub ecx,0x1
005081BE 8802 mov byte ptr ds:,al
005081C0 83C2 01 add edx,0x1
005081C3 85C9 test ecx,ecx
005081C5^\75 E9 jnz Xgame.005081B0
005081C7 A3 7C4A9600 mov dword ptr ds:,eax
_asm
{
push edx
mov edx,pack_addr
mov eax,mTime
mov ecx,0xe7
_lable1:
imul eax,eax,0x3B9F5
add eax,0x17839D
sub ecx,0x1
mov byte ptr ds:,al
add edx,0x1
test ecx,ecx
jnz _lable1
mov mTime,eax
pop edx
}
第二次加密
00508B56 8B8C24 04010000 mov ecx,dword ptr ss:
00508B5D 85C9 test ecx,ecx
00508B5F 0F84 56010000 je game.00508CBB
00508B65 8BB424 08010000 mov esi,dword ptr ss:
00508B6C 85F6 test esi,esi
00508B6E 0F84 47010000 je game.00508CBB
00508B74 8B8424 14010000 mov eax,dword ptr ss:
00508B7B C787 D8190000 0>mov dword ptr ds:,0x0
00508B85 8D7C24 17 lea edi,dword ptr ss:
00508B89 C64424 10 20 mov byte ptr ss:,0x20
00508B8E 66:C74424 11 EB>mov word ptr ss:,0xEB
00508B95 894424 13 mov dword ptr ss:,eax
。。。。。。。。还有一大堆代码
第三次加密
007AC100 53 push ebx
007AC101 55 push ebp
007AC102 8B6C24 14 mov ebp,dword ptr ss:
007AC106 8B4D 00 mov ecx,dword ptr ss:
007AC109 56 push esi
007AC10A 8B7424 10 mov esi,dword ptr ss:
007AC10E 8BDE mov ebx,esi
007AC110 83E3 03 and ebx,0x3
007AC113 C1EE 02 shr esi,0x2
007AC116 57 push edi
007AC117 8B7C24 18 mov edi,dword ptr ss:
007AC11B 74 28 je Xgame.007AC145
007AC11D 8D49 00 lea ecx,dword ptr ds: //ecx的值=key加密后edx的值
007AC120 83EE 01 sub esi,0x1
007AC123 8D0431 lea eax,dword ptr ds:
007AC126 33D2 xor edx,edx
007AC128 F735 24FC9200 div dword ptr ds: //值固定的
007AC12E 83C7 04 add edi,0x4
007AC131 8B0C95 68A39200 mov ecx,dword ptr ds:
//里面的值可以拷出来,放进自己定义的数组里面,这个数组有点大.
007AC138 81C1 C1236D2E add ecx,0x2E6D23C1
007AC13E 314F FC xor dword ptr ds:,ecx
省略一大堆代码.............
byte pack={0x7,0x0,0x25,0x0,0x0,0x0,0x0};
这个封包经过第二次加密函数加密,send出去就可以进入到选人物的界面了。
页:
[1]