qinyi75 发表于 2013-3-25 10:17:23

游戏封包之封包解密——游戏call解密

现在大部分游戏的封包都采用了加密,异或加密方式,封包加密方式,但是真正要分析出他到底怎么加的密还是挺麻烦的,而且对于那些数据感觉特头痛。。。。。。。。。
既然封包加密,那么必然会有加密的处理程序,那么如果我们在数据加密之前把明文读出来那么加了密的数据对于我们来说就不算是密了。。。。。
下面我用一个找棋牌游戏的call 来向大家讲游戏是如何加密的。。。具体加密方法在这里我不分析(人太懒了)
我找的是抢位置的call   大家都知道位置肯定有2个关键参数一个是多少桌,一个是哪个位子

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

好了,。。现在我们开始分析数据。。。。。。。。。。。。。。。。。。。。。
当我wS_send32 这里下断点 断下来的时候   

我们可以看到坐下方的数据一大堆 不知道是什么。。。。也不关心我强的位置是 19 桌 2 号
在软件中应该是 18 ,1 这2个数据才对。。。。但是看了一下没看到,。。。没找到这2个相关的数据,。。。。算了 不找了。(这个是我之前写的一个软件 这里发帖也就没具体分析了)
我换一个位置 向服务器发出的数据时改变了的   但是存放该数据的地址 都不变在我这个游戏中是在 ddedi 中。。。这个根据游戏而定了
既然数据变了,但是地址没变。。直接下个内存断点。。。。在该地址下一个内存写入断点,断在了
rep movs dword ptr es:,dword ptr ds:

取消内存断点
026B369B    81FA 00200300   cmp edx,0x32000
026B36A1    7D 34         jge short BD_NetWi.026B36D7
026B36A3    8D7C18 04       lea edi,dword ptr ds:
026B36A7    8BC1            mov eax,ecx
026B36A9    C1E9 02         shr ecx,0x2
026B36AC    8D7424 1C       lea esi,dword ptr ss:
026B36B0    F3:A5         rep movs dword ptr es:,dword ptr ds:          ; 断在这里了
026B36B2    8BC8            mov ecx,eax
026B36B4    83E1 03         and ecx,0x3
026B36B7    F3:A4         rep movs byte ptr es:,byte ptr ds:
026B36B9    8BB3 30400600   mov esi,dword ptr ds:
026B36BF    8B4C24 10       mov ecx,dword ptr ss:
026B36C3    8B93 78400600   mov edx,dword ptr ds:
026B36C9    53            push ebx
026B36CA    03F1            add esi,ecx
026B36CC    6A 03         push 0x3
026B36CE    89B3 30400600   mov dword ptr ds:,esi


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


晕上级call 的代码成这个了。。。没关系 用od 分析一下代码应该就行了
db 4e
db 04
db ff
db b5

od 分析了一下数据就恢复正常显示了
在这个call 下断点

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

00115B8400003D18
00115B8800001900///桌号
00115B8C00000400 // 第几号。。。。他是逆时针开始计数的 所以就该是 19 ,4
00115B900000F823
00115B9400000000
00115B9800000000
00115B9C00000000

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

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

找到加密call 后那我们怎么才能利用它呢? 有2中可能。。。在这个call 里面就有发包函数。。。直接调用这个call 就行了。。。。
或者这个只是对数据进行加密。。。不发包。。那么我们调用这个call 把返回的数据再自己想办法发送就行了

wwa12349 发表于 2013-4-2 21:25:04

看看来了.............................

wwa12349 发表于 2013-4-2 21:25:35

看看来了.............................

1476654 发表于 2014-5-9 13:23:18

顶一下。~学习
页: [1]
查看完整版本: 游戏封包之封包解密——游戏call解密