admin 发表于 2009-11-27 23:33:01

游戏中加密解密算法分析常用方法

游戏中的加密解密算法,在脱机中是必不可少的,可有的朋友不知道怎么去找它。并且,想写出真正功能完善的辅助,不了解游戏的数据结构和协议,是不可能实现的,即使你用超强的算法利用找到的CALL去实现一个辅助,那意味着你的更新工作会很大。
  而游戏的加解密算法一般是很少会去改动的,所以,辅助,使用封包去实现,意义很多。
  另外,想写脱机的你,不通过封包,是写不成的(有些功能可以调用游戏DLL里的东西)。
  好了,我来说说找算法的原理和方法吧。
  首先,我们还是要了解游戏是怎么来操作数据的:
  最基本的大家应该知道,就是:

  客户端生成明文包-->调用加密函数加密->交给SEND函数去发给服务器。

  而复杂的话可能就是:

  客户端生成明文包-->调用加密函数一加密->交调用加密函数二加密->给SEND函数去发给服务器。
  
  再复杂的可能是:

  游戏启动是接服务器发来一个密钥-->客户端生成明文包-->调用加密函数一(利用密钥)加密-->调用加密函数二->给SEND函数去发给服务器。

  基本上就是那样,当然更复杂和变态的可能还有:服务器发来密钥后,客户端对密钥进行一次加密,然后才可以用,不管怎么说这要看游戏编写者想怎么来保护数据了。
  
  不过,最其码你知道了这些方法,那就你就有个思路去跟踪了。

  另外,大家要了解的就是,发包和接包函数:

  有的游戏是用SEND、RECV,有的是用WSASEND、WSARRECV,也可能混用,这你可要找对了。(小方法:可以用WPE拦截看一下,包括游戏启动时。)

  上MSDN查看资料后,我们了解到:
  SEND有个参数BUF,它是用来存将要发送数据的缓冲区。
  RECV也有这么个参数,它是用来接收的缓冲区。
  WSASEND有个参数是lpBuffers,它是一个指向WSABUF结构数组的指针。记住,是指针!
  WSARECV也一样。

  然后,进入游戏,开OD,我这里就先不找例子了,光给大家说说原理和方法,这是我发这个主题的原因(你会了方法,哪个游戏都一样,正所谓那个什么什么鱼,不如什么什么渔来着,忘了!)

  以下是跟踪数据的方法(就是看数据SEND.BUF中的数据是从哪里来的,其中SEND的断不要取消,同时要多看数据区的数据变化):
  1、开OD,下断:BP SEND,游戏里说句话。断下后,在OD的数据区里看一下BUF里的东西和BUF的地址。
  2、然后,给BUF下硬件写入WORD断点。F9运行一下。再说一句话,这时就能断下是谁给这个BUF写了数据。
  3、你可能看到是:REP MOVS ,,对了,这里ESI就是数据的来源,而EDI就是数据要存放的地方,也就是它的下一级SEND.BUF。
  4、这时注意数据区EDI的数据。取消硬件断点,F9一下会断到SEND,看一下EDI也就是这时指向的SEND.BUF中的数据是否有变化,如果有,那么调用这个REP MOVS指令的CALL就是加密CALL。
  5、如过没有,再对ESI指向的空间下硬件写入WORD断,运行游戏,再说一句话。断下另一个地方的REP MOVS,然后和第4步一样,注意数据区的数据变化。

  整个过程就是4-5步这样的。你也可以一次就追下所有的REP MOVS,原理都一样!

  提示:整个过程都要注意看数据区的数据变化。

  而对于WSASEND,它的参数是一个指向WSABUF结构数组的指针。大家上MSDN看一下它的参数。和找SEND的方法一样。

  另外大多数游戏的加密和解密都是用的都是同一个,而跟踪的方法都一样,不同的是一个是往回找,所以叫逆向,一个是往下找。找到任意一个就行了。

  自我感觉跟接包的方法要方便一些,因为它接包后才要调用解密,这样往下找感觉要比往上找好,呵呵,再提示一下,要是跟RECV,断下RECV后一定要注意先F8一下,要让这条指令执行了,它的BUF中的数据才是服务器发来的数据。

  好了,这次就说这么多吧,也不知道说清楚了没有,高手看了不要笑,如果我说的有不对的地方,请指证,我怕误人子弟,呵!

xiebing 发表于 2010-4-8 11:45:34

我试了一下,没找到,总是自动断下来!

xiebing 发表于 2010-4-8 11:46:05

老大给个实例就好了!

topzhp 发表于 2010-4-17 18:31:49

多谢老大,有空试下!
页: [1]
查看完整版本: 游戏中加密解密算法分析常用方法