在OllyDbg中,有没有一种方法可以在调试期间进行跟踪,以便在用户输入后立即找到该函数?用户输入是转换为char数组的字符串,然后将其在可执行文件中加密。在这种情况下,这意味着将数据包发送到游戏客户端,然后游戏客户端将数据包解密。
#1 楼
显然没有足够的信息来为您提供确切的答案。但是,我将尽力说明发生的情况背后的逻辑。这样可能会给您一个想法,如何找到加密功能。我将假定您正在使用Windows,因为没有另外说明。普通的主要逻辑(当我说普通时,我的意思是没有故意混淆或掩盖正常的执行流)服务器/客户端TCP / IP网络应用程序归结为以下内容:显而易见,在客户端和服务器端的
Send
和Receive
都是所有交换发生的地方。通常,数据将通过一侧(客户端或服务器)进行加密。此后不久,它将被传输到另一侧。另一端将接收数据并对其解密:发送后,返回查看哪些函数设置(创建/修改)该特定缓冲区位置。 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)的可逆教程。任何软件。有建设性地使用它。
评论
“在用户输入后立即找到功能”是什么意思?输入在哪一侧-客户端还是服务器端?之后,您是说直接在输入之后的功能,在将数据包发送到服务器之前对输入进行加密的功能,还是对客户端收到的数据包进行解密的功能?请在您的问题本身中进行澄清(即不在评论中)。另外,请进一步说明所有操作方式。您可以访问服务器和客户端二进制文件吗?