首页
社区
课程
招聘
[原创]游戏封包之封包解密——游戏call解密
发表于: 2011-6-28 22:12 45286

[原创]游戏封包之封包解密——游戏call解密

2011-6-28 22:12
45286
现在大部分游戏的封包都采用了加密,异或加密方式,封包加密方式,但是真正要分析出他到底怎么加的密还是挺麻烦的,而且对于那些数据感觉特头痛。。。。。。。。。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 210
活跃值: (221)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
现在大部分游戏的封包都采用了加密,异或加密方式,封包加密方式,但是真正要分析出他到底怎么加的密还是挺麻烦的,而且对于那些数据感觉特头痛。。。。。。。。。
  既然封包加密,那么必然会有加密的处理程序,那么如果我们在数据加密之前把明文读出来那么加了密的数据对于我们来说就不算是密了。。。。。
 下面我用一个找棋牌游戏的call 来向大家讲游戏是如何加密的。。。具体加密方法在这里我不分析(人太懒了)
  我找的是抢位置的call   大家都知道位置肯定有2个关键参数  一个是多少桌,一个是哪个位子

  首先我们用od 加载游戏  不用说找这种加密封包数据的call 下的是bp send  断点
  返回到上级call 

 好了,。。现在我们开始分析数据。。。。。。。。。。。。。。。。。。。。。
  当我wS_send32 这里下断点 断下来的时候   
   
 我们可以看到坐下方的数据  一大堆 不知道是什么。。。。也不关心  我强的位置是 19 桌 2 号
 在软件中应该是 18 ,1 这2个数据才对。。。。但是看了一下没看到,。。。没找到这2个相关的数据,。。。。算了 不找了。(这个是我之前写的一个软件 这里发帖也就没具体分析了)
  我换一个位置 向服务器发出的数据时改变了的   但是存放该数据的地址 都不变  在我这个游戏中是在 dd  edi 中。。。这个根据游戏而定了
 既然数据变了,但是地址没变。。直接下个内存断点。。。。在该地址下一个内存写入断点  ,断在了
 取消内存断点
026B369B    81FA 00200300   cmp edx,0x32000
026B36A1    7D 34           jge short BD_NetWi.026B36D7
026B36A3    8D7C18 04       lea edi,dword ptr ds:[eax+ebx+0x4]
026B36A7    8BC1            mov eax,ecx
026B36A9    C1E9 02         shr ecx,0x2
026B36AC    8D7424 1C       lea esi,dword ptr ss:[esp+0x1C]
026B36B0    F3:A5           rep movs dword ptr es:[edi],dword ptr ds:[esi]          ; 断在这里了
026B36B2    8BC8            mov ecx,eax
026B36B4    83E1 03         and ecx,0x3
026B36B7    F3:A4           rep movs byte ptr es:[edi],byte ptr ds:[esi]
026B36B9    8BB3 30400600   mov esi,dword ptr ds:[ebx+0x64030]
026B36BF    8B4C24 10       mov ecx,dword ptr ss:[esp+0x10]
026B36C3    8B93 78400600   mov edx,dword ptr ds:[ebx+0x64078]
026B36C9    53              push ebx
026B36CA    03F1            add esi,ecx
026B36CC    6A 03           push 0x3
026B36CE    89B3 30400600   mov dword ptr ds:[ebx+0x64030],esi

 rep movs dword ptr es:[edi],dword ptr ds:[esi]    
这句话就是把[esi] 中的数据复制到【edi】这个地址里面  
这里我们返回到调用这段代码的call 看看,,。。。应该上级call 就是加密的call 了(这个因程序而定)

 晕上级call 的代码成这个了。。。没关系 用od 分析一下代码应该就行了 od 分析了一下数据就恢复正常显示了
在这个call 下断点

我们看看堆中的数据,,,,我抢的位置是 25 ,1 十六进制应该是 19 ,1  



00115B84  00003D18
00115B88  00001900  ///桌号
00115B8C  00000400 // 第几号。。。。他是逆时针开始计数的 所以就该是 19 ,4  
00115B90  0000F823
00115B94  00000000
00115B98  00000000
00115B9C  00000000

这里就找到了游戏的加密call 了 既然加密的call 都找到了 那么下面加密的具体方式就自己去分析吧
由于我不需要解密 所以我直接调用这个call 吧参数传进去后就行了。。。那么这个call 的返回值就是加密后的数据了。。。放到哪个寄存器里指向的地址就自己分析吧,。。。。

我最近写一款456棋牌游戏的抢位置软件 由于我发现他在call  ws_send32 的时候存放发包的地址都不一样。。。。。。我就把包中的数据提出来。用ce 查找多过滤几次  就找到一个地址是存放发包的数据的。。。于是在那个地址下写入断点  然后向上找。。具体分析几下就能找到最初的加密call 了 有的时候会有几层加密所以要多向上找几次。。。。。。。。。

找到加密call 后那我们怎么才能利用它呢? 有2中可能。。。在这个call 里面就有发包函数。。。直接调用这个call 就行了。。。。
或者这个只是对数据进行加密。。。不发包。。那么我们调用这个call 把返回的数据再自己想办法发送就行了
上传的附件:
  • 5.jpg (141.52kb,1254次下载)
  • 6.jpg (53.68kb,1415次下载)
  • 7.jpg (131.10kb,1425次下载)
  • 8.jpg (194.84kb,1429次下载)
  • 9.jpg (115.63kb,1421次下载)
2011-6-28 22:45
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我以为是动画教程呢
2011-6-28 23:01
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你发重复了?
2011-6-28 23:02
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
膜拜
2011-6-28 23:16
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
真好,正适合我这样从没接触过挂的新手学习,谢谢
2011-6-29 00:47
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
重复了?...
2011-6-29 00:48
0
雪    币: 210
活跃值: (221)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
那个没写完就发表了,,,,确实抱歉。。。
2011-6-29 01:33
0
雪    币: 777
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢lz分享。
2011-6-29 11:44
0
雪    币: 334
活跃值: (78)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
你这种只需要用一个方法就可以秒杀
逻辑线程打包, 转给专门的发送线程去发送, 你断send看到的是个发送循环而已
2011-6-30 10:28
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我OD找SEND
然后IDA去看逻辑。。。。IDA有个反汇编成C语言的。便于掌握游戏的逻辑。
2011-6-30 12:07
0
游客
登录 | 注册 方可回帖
返回
//