在调试期间跟踪函数?

逆向工程 ollydbg 加密
2021-06-28 09:58:47

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

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

4个回答

显然没有足够的信息来为您提供确切的答案。但是,我会尽力证明发生的事情背后的逻辑。这在某种程度上可能会让您了解如何定位加密功能。我假设您使用的是 Windows,因为没有另外说明。

普通(当我说普通,我的意思是没有故意混淆或隐藏正常执行流程)服务器/客户端TCP/IP网络应用的主要逻辑归结为以下几点:

在此处输入图片说明

很明显, SendReceive在客户端和服务器端是所有的交换发生的地方。通常,数据会被一侧(客户端或服务器)加密。此后不久,它将被传输到另一侧。另一方将接收数据并解密:

data -> encrypt -> send <----> receive -> decrypt -> data

为了找到执行加密的函数,您需要定位send()函数,确定正在发送的缓冲区的位置,返回并查看哪些函数设置(创建/修改)该特定缓冲区位置。

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

在此处输入图片说明

选择Search For -> All Intermodular Calls它将打开包含所有找到的调用的窗口。我们特别在寻找WS2_32.recv

在此处输入图片说明

通过按在函数上设置断点F2运行二进制文件。每当WS2_32.recv断点命中时,您都可以检查堆栈窗口并确定缓冲区的位置:

在此处输入图片说明

我们可以看到,我们的缓冲区位于缓冲区0x001CFBB0大小0x80为 128 字节的位置。让我们通过按Ctrl+G并输入 location来转到缓冲区位置。我们得到我们的缓冲区:

在此处输入图片说明

现在,您需要逐步了解该缓冲区和数据发生了什么。我假设下一个函数之一将尝试解密它。

发送东西的逻辑是相反的(加密-> 发送)。

祝你好运。

你的问题太宽泛了。你的用户输入是如何被接受的?尝试回答几个问题以缩小范围

GetWindowText() 
SendMessage(.....WM_GETTEXT...) LB_GETTEXT 
RichEdit 
WM_CHAR in a Loop 
scanf in a console ??
sscanf from a stram ??
Directx SendInput ??
opengl ??
touch recognition?? biometrics??  smart-card ?? voice commands

一旦你缩小到细节,你接下来应该专注于缩小消息处理循环的范围。它是一个经典的 while (TRUE) 循环,每个消息的开关案例(Windows 消息泵)等等等

一旦范围缩小到可管理的大小,就有几个选项可以跟踪它们。例如:

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

我希望你在窗户上。如果您在另一个操作系统上,那么 GDB 也有某些可用的跟踪功能。

如果数据曾经分配给寄存器,那么您可以尝试使用 OllyStepNSearch 来定位它。您可以在此处找到它和更多信息:http : //blog.didierstevens.com/programs/ollystepnsearch/

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

我建议您阅读 Lena 的倒车教程。

忠告:请不要用你的知识破解任何软件。建设性地使用它。