我正在尝试为特定的MMORPG(完美世界)制作游戏服务器模拟器。我知道游戏网络的工作原理和某些数据包的结构,但是除了登录数据包中的用户名以外,其他所有数据包都是经过加密的。从客户端发送到服务器的数据包的crypt函数,以了解游戏如何加密数据,我需要帮助来找到crypt函数。我在调试过程中拍摄了Olly的一些屏幕截图,并评论了我在代码中分析的内容。



现在,那是我找到调用send的函数的时候,以及该函数每一行的转储,直到send调用为止:



我对其他行有更多转储的屏幕快照,但是我不敢每次发布两个以上的链接,因此如果有人需要,我会稍后发布其他链接。

我的问题是,crypt函数在哪里?以及它如何在C ++之类的语言中工作?

#1 楼

首先,我将对应用程序(例如Findcrypt或ProtectID和PEID的Kanal插件)进行一些静态分析,以扫描各种加密算法中使用的已知静态值。如果找到了某些内容,请检查哪个函数通过交叉引用(IDA中的X,olly中的CTRL + r)访问它们,您将使用加密函数,或者至少要靠近它们。

如果该方法失败,则可以开始在动态调试器(例如olly)中进行跟踪。您找到了send函数,就可以开始在调用堆栈上进行追溯。选择堆栈的顶部,然后在反汇编程序中单击“跟随”,这将使您进入调用send函数的函数。在该函数的顶部放置一个断点。重复多次,返回调用树,观察调用该函数的变量,直到看到要加密的数据为止。

在第二张图片中,显示了调用send的函数()与加密的数据。您应该返回更多级别以接近加密方法。

在二进制文件(IDA中的Shift + F12)中搜索相关的字符串,例如:“ key”,“ crypt”,“ password” ,并进行交叉引用以找出使用哪个函数。
还要确认应用程序是否使用了静态密钥,您可以在其他计算机上使用其他帐户为游戏设置新的环境,并查看加密后的数据是否已加密为与您使用的相同字节如图1所示。如果相同,则加密使用静态密钥。

关于ragezone和elitepvpers的一些关于该游戏的文章,如果其他所有失败,它们也许可以为您提供帮助:)

评论


感谢您的帮助,但是findcript什么也没找到。我选择了调用send的函数的顶部,并在该顶部放置了一个断点,但无法再次使用。我找到东西的唯一方法是,在要加密的数据上设置内存/硬件断点时,我要去一段代码,看起来像是一个循环函数,减去了聊天消息,例如“ hello”,“ ello”,“ llo”等,但是我找不到该函数代码上的任何逻辑

–雷南·莫拉(Renan Moura)
15年5月16日在11:43



您尝试了所有检测工具还是仅使用findcrypt?他们绝对没有检测到任何东西,但是仍然有一些东西。 “但又不能正常工作”是什么意思?当您看到循环时,可能是将数据复制到另一个缓冲区,您应该观察将数据复制到的位置,并在其上放置硬件断点。稍后可能会用于加密。请尽可能详细地编辑您的进度问题。

–多米尼克·安塔尔(Dominik Antal)
15年5月18日在13:15