现在大部分游戏的封包都采用了加密,异或加密方式,封包加密方式,但是真正要分析出他到底怎么加的密还是挺麻烦的,而且对于那些数据感觉特头痛。。。。。。。。。
既然封包加密,那么必然会有加密的处理程序,那么如果我们在数据加密之前把明文读出来那么加了密的数据对于我们来说就不算是密了。。。。。
下面我用一个找棋牌游戏的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 把返回的数据再自己想办法发送就行了