在玩弄指针之后,我试图获取游戏中特定函数的地址。此功能将玩家输入打印到屏幕上,并将其广播给所有在线玩家,因为它是一款多人游戏。可以说这是一场聊天。
我真的不知道如何找到地址,因为我没有真正的切入点。任何线索都非常感谢。
我的目标是在一个简单的 Dll 中调用这个聊天功能。
如果这很重要,我正在使用 OllyDbg。
在玩弄指针之后,我试图获取游戏中特定函数的地址。此功能将玩家输入打印到屏幕上,并将其广播给所有在线玩家,因为它是一款多人游戏。可以说这是一场聊天。
我真的不知道如何找到地址,因为我没有真正的切入点。任何线索都非常感谢。
我的目标是在一个简单的 Dll 中调用这个聊天功能。
如果这很重要,我正在使用 OllyDbg。
通常的做法是:
开始输入您想说的内容,但不要提交。使用 Cheat Engine 对您输入的字符串执行内存扫描。找到后,设置只读 HWBP,然后提交聊天。聊天功能应该读取保存聊天字符串的内存,从而触发 BP。
Hookstrcpy()
和相关函数,将参数与您将在聊天中输入的内容进行比较。这不太可能成功,因为聊天函数中的字符串复制代码很可能是内联的。
挂钩游戏用于将您的聊天实际发送到服务器/其他玩家的功能。这有可能是你的游戏可以发送聊天信息包的未加密的,在这种情况下,你可以简单地钩send()
/ sendto()
/WSAsend()
和strstr()
发送缓冲区。但是,如果游戏是 MMO,它肯定会加密所有数据包。在这种情况下,您需要在加密发生之前拦截所述数据包。一些游戏将实现一个相当简单的函数,其参数类似于send()
,它将简单地加密发送缓冲区并将所有内容传递给send()
。其他游戏可能有一个循环,它从一些内部缓冲区读取未加密的发送数据包,并在将它们传递到send()
. 你通常可以通过从send()
/回溯来找到这个发送函数/循环sendto()
/ WSAsend()
. 一旦你钩住了这个函数/循环,你就可以应用一种在游戏漏洞利用领域通常被称为“数据包编辑”的方法。只需滚动一个 GUI 来输出所有通过的数据包,并将您的聊天活动的时间与您在 GUI 中看到的数据包相匹配。一旦您确定哪些数据包与您的聊天相对应,您只需从对这些数据包的调用中回溯即可,最终您将使用聊天功能。
user3262342 给出了很好的答案;您还可以尝试在以下常见的文本绘制函数上设置断点,然后查看调用堆栈以查看程序中的哪个函数绘制了文本: