一直对封包加密感到比较困惑,最近为了学习方法,特意跟了下某游戏的封包加密方式
游戏封包是经过一级加密,二级加密的方式,一级还没去研究,二级基本上原理上已还原出来
OD跟到的如下
Push eax 一级加密后的长度
Push ebx 一级加密后封包地址
Mov ecx,esi
Call xxxx 加密CALL
CALL内部加密部分
00437035 mov eax,dword ptr ss:[esp+34] //一级加密后保存地址
00437039 mov bl,byte ptr ds:[eax+ebp] //得到2字节需加密字节
0043703c xor bl,0eb //先和0eb进行异或运算
0043703f cmp edi,6 //首次edi=2,每次加2,当等于6时执行第二种加密,小于6时执行第一种加密,也就是说取前2次为第一种加密,第三次时为第二种加密,
第二种加密过后edi重置为2,也就是说重新第一种加密
00437042 jnz short woool.00437075
/******第二种加密开始********/
//计算两次保存两次
//首次
00437044 movzx ecx,bl
00437047 and cl,3f //与运算
0043704a add cl,3b //结果+3b
0043704d push ecx
0043704e push 1
00437050 mov ecx,esi
00437052 call woool.00402cf0 //保存加密结果
//再次
00437057 shr bl,2 //先右移
0043705a and bl,30 //与运算
0043705d or bl,byte ptr ss:[esp+16] //和第一种加密保存下的结果进行或运算
00437061 mov ecx,esi
00437063 add bl,3b //结果+3b
00437066 push ebx
00437067 push 1
00437069 call woool.00402cf0 //保存加密结果
0043706e mov byte ptr ss:[esp+16],0
00437073 jmp short woool.004370a6
/******第二种加密方式结束******/
/******第一种加密方式*****/
00437075 movzx eax,bl
00437078 shr al,2 先右移2位
0043707b mov byte ptr ss:[esp+17],al
0043707f and al,3c 与运算
00437081 and bl,3 与运算
00437084 or al,bl 或运算
00437086 add al,3b 结果+3b
00437088 mov ecx,esi
0043708a push eax
0043708b push 1
0043708d call woool.00402cf0 //保存加密结果
00437092 mov dl,byte ptr ss:[esp+16]
00437096 mov al,byte ptr ss:[esp+17]
0043709a add dl,dl
0043709c and al,3
0043709e add dl,dl
004370a0 or al,dl
004370a2 mov byte ptr ss:[esp+16],al
/******第一种加密方式结束*******/
004370a6 mov eax,2aaaaaab
004370ab imul edi
004370ad mov eax,edx
004370af shr eax,1f
004370b2 add eax,edx
004370b4 lea eax,dword ptr ds:[eax+eax*2]
004370b7 add eax,eax
004370b9 mov ecx,2
004370be sub ecx,eax
004370c0 add ebp,1
004370c3 add edi,ecx
004370c5 cmp ebp,dword ptr ss:[esp+38]
004370c9 jl woool.00437035 //如没达到长度跳回继续加密
还原加密思路如下:
di=02;
al=0;
bl=0;
for(int cd=0;cd<=length;cd++)
{
bl=char(cd);//这里不是实际代码,意思每次取2字节数据,实际还要修改
bl^=0xeb;//异或运算
if(6-di!=0)//第一种加密方式
{
al=bl
al>>=2 //先右移2位
al&=0x3c; //与运算
bl&=0x3; //与运算
al|=bl; //或运算
al+=0x3b; //结果+3b
//写入al;
di+=2;
}
else//第二种加密方式
{
//首次
cl=bl;
cl&=0x3f;//与运算
cl+=0x3b;//结果+3b;
//写入cl;
//再次
bl>>=2;//右移2位
bl&=0x30;//与运算
bl|=esp+16;//或运算
bl+=0x3b;//结果+3b
//写入bl
di=0;//重置edi
}
dl=?;
dl=dl+dl;
and dl,3;
dl=dl+dl;
or al,dl;
//esp+16=al;这里写入了
di=di+2;
}
刚到论坛 很想和大家成为朋友 一起讨论问题 刚接触免杀这块 发个文章大家分享下
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)