我正在尝试为游戏客户端找到一种加密算法,但是我需要先在客户端中找到实际的寄存器/堆栈,然后才能正确(在模拟服务器端)对数据包进行解密/加密。问题是我不知道如何找到该函数。

在OllyDbg中,有没有一种方法可以在调试期间进行跟踪,以便在用户输入后立即找到该函数?用户输入是转换为char数组的字符串,然后将其在可执行文件中加密。在这种情况下,这意味着将数据包发送到游戏客户端,然后游戏客户端将数据包解密。

评论

“在用户输入后立即找到功能”是什么意思?输入在哪一侧-客户端还是服务器端?之后,您是说直接在输入之后的功能,在将数据包发送到服务器之前对输入进行加密的功能,还是对客户端收到的数据包进行解密的功能?请在您的问题本身中进行澄清(即不在评论中)。另外,请进一步说明所有操作方式。

您可以访问服务器和客户端二进制文件吗?

#1 楼

显然没有足够的信息来为您提供确切的答案。但是,我将尽力说明发生的情况背后的逻辑。这样可能会给您一个想法,如何找到加密功能。我将假定您正在使用Windows,因为没有另外说明。

普通的主要逻辑(当我说普通时,我的意思是没有故意混淆或掩盖正常的执行流)服务器/客户端TCP / IP网络应用程序归结为以下内容:显而易见,在客户端和服务器端的SendReceive都是所有交换发生的地方。通常,数据将通过一侧(客户端或服务器)进行加密。此后不久,它将被传输到另一侧。另一端将接收数据并对其解密:发送后,返回查看哪些函数设置(创建/修改)该特定缓冲区位置。

OllyDbg具有一些在这种情况下特别有用的功能。首先,我们需要找到所有send()send()函数。我们将搜索模块间调用。在反汇编窗口中,右键单击某个地方以显示以下菜单:



选择receive()。它将打开找到所有呼叫的窗口。我们专门在寻找Search For -> All Intermodular Calls:通过按F2在功能上设置断点。运行二进制文件。只要遇到WS2_32.recv断点,就可以检查堆栈窗口并确定缓冲区的位置:



我们可以看到,缓冲区位于WS2_32.recv处,缓冲区的大小为0x001CFBB0,即128个字节。让我们通过按Ctrl + G并键入location转到缓冲区位置。我们得到了缓冲区:



现在,您需要逐步进行操作,看看该缓冲区和数据发生了什么。我假设下一个功能之一将尝试对其进行解密。

逻辑是相反的(加密->发送),用于将内容发送出去。

祝你好运。

#2 楼

您的问题太笼统了。
如何进行用户输入?尝试回答一些问题以缩小范围




一旦缩小范围,您接下来应该集中精力缩小消息处理循环。这是经典的while(TRUE)循环,其中每个消息都有切换用例(Windows Message Pump)等。

一旦将范围缩小到可管理的大小,就会存在几个跟踪它们的选项。 />例如:



您可以使用Windbg(wt watch and trace when you are on a function prologue),它将执行该功能并为您提供子功能列表。存在一些增强此功能的插件。对于ida,请查阅run trace feature or hit trace feature文档。

希望您在Windows上。如果您使用的是其他操作系统,则GDB还具有某些可用的跟踪功能。

评论


用户输入只是一个转换为char数组的字符串,然后在可执行文件中对其进行加密

–围嘴
13年8月2日在15:07

#3 楼

如果曾经将数据分配给寄存器,则可以尝试使用OllyStepNSearch进行查找。您可以在这里找到它和更多信息:http://blog.didierstevens.com/programs/ollystepnsearch/

#4 楼

有很多教程可以帮助您做到这一点。

我建议您阅读莉娜(Lena)的可逆教程。任何软件。有建设性地使用它。