某游戏包加密函数的逆向工程

逆向工程 部件 加密
2021-06-09 08:14:20

我正在尝试为特定的 MMORPG(完美世界)制作游戏服务器模拟器。我知道游戏网络如何工作的基础知识以及一些数据包的结构,但它们都是加密的,除了登录数据包中的用户名。

我正在使用 Olly 尝试为从客户端发送到服务器的数据包找到 crypt 函数,以了解游戏如何加密数据,我需要帮助才能找到 crypt 函数。我在调试过程中截取了 Olly 的一些截图,并在代码中评论了我分析的内容。

这是在我找到要发送的呼叫之前,当我在游戏中发送聊天消息时,我看到以下内容:

乙

现在,我找到了调用 send 的函数,以及这个函数每一行的转储,直到 send 调用:

C

我有更多其他行的转储截图,但我没有每次发布两个以上链接的声誉,所以如果有人想要的话,我会稍后发布其他人。

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

1个回答

首先,我会对应用程序(例如FindcryptProtectIDPEID 的Kanal 插件)运行一些静态分析,以扫描各种加密算法中使用的已知静态值。如果你找到了一些东西,检查哪个函数通过交叉引用(IDA 中的 X,olly 中的 CTRL+r)来访问它们,你将到达加密函数或至少非常接近它们。

如果该方法失败,您可以在动态调试器(如 olly)中开始跟踪。您找到了 send 函数,您可以开始在调用堆栈上进行追溯。选择栈顶并在反汇编器中点击follow,这将带你到调用send函数的函数。在该函数的顶部放置一个断点。多次重复此操作,返回调用树,并观察调用函数时使用的变量,直到看到要加密的数据。

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

在二进制文件中搜索相关字符串(IDA 中的 Shift+F12),例如:“key”、“crypt”、“password”,并交叉引用以找出使用它的函数。

您还可以在您知道将在某个时候加密的数据上放置一个硬件断点,并检查它的访问位置。

还要确认应用程序是否使用静态密钥,您可以在不同的机器上使用不同的帐户为游戏设置一个新环境,并查看加密数据是否加密为您在图 1 中找到的相同字节. 如果相同,则加密使用静态密钥。

还有一些关于这个游戏的帖子在 ragezone 和elitepvpers 上,如果所有其他方法都失败了,他们可能会帮助你:)