我正在ollydbg中调试某些应用程序,因此我设置了这两个步骤来开始调试该应用程序。


我使用输入参数从文件菜单中加载exe
设置断点在msvcr71.printf函数上

经过这两个初始步骤后,当我按F9时,该应用程序将显示一些printf函数根据输入参数生成的消息(目前,我正在测试显示该应用程序的错误密码)有关密码错误的消息)。因此,现在我需要通过检查传递的好坏来跳转到保存逻辑的代码,即调用printf的代码。设置断点后如何完成?

谢谢

#1 楼

这是您返回呼叫者的一种方式。以下是一个用于演示的小C ++破解程序。


步骤1
现在照常将应用程序加载到OllyDBG中。现在假设我们对crackme的内部逻辑一无所知。因此,让我们在控制台上打印的功能上设置一个断点。因此最好的选择是搜索所有模间调用。


步骤2
因此您会看到它调用puts。此函数用于在控制台上显示字符串,并且从3个地方被调用。因此,让我们在函数本身上放置一个断点,以便我们可以从哪里知道它。
现在,函数在VA 0x75898D04处定义。因此,在此处放置一个断点。


步骤3
现在通过按F9直到遇到断点来运行应用程序。

现在看一下右下角的堆栈显示了执行后puts返回的位置以及传递给此函数的参数。
由于传递的此参数是要求输入密码的字符串,因此我们可以跳过它直到到达Badboy消息字符串。因此,继续按F9,直到到达传递的参数是坏男孩消息的地步。 (控制台同时要求输入密码并在其中输入内容)。
所以我们运行到这里。

步骤4

puts将返回VA 0x401C66和参数传递的是错误消息。
所以转到0x401C66
在CPU窗口中按Ctrl + G转到那里。
您也可以直接在堆栈上显示的返回地址上按Enter键
所以我们登陆了。如果稍加研究,您会发现硬编码值为puts
(可以在strcmp调用上设置断点,然后重新启动目标以查看与谁进行比较)。
因此,这是一个序列,将跳过坏人消息并将我们带到好孩子消息。此类功能经过专门编码,可以混淆和阻碍静态和动态分析。但是在其他情况下,Ctrl + F9方法非常好。

#2 楼

一旦击中printf()的断点,请按Ctrl + F9告诉OllyDbg运行,直到printf()函数结束,然后按F7将返回指令单步返回给调用方。

评论


如果我尝试按ctrl + f9,则代码仅打印所有这三个消息的第一个消息,否则使用f9打印所有这三个消息。 ctrl + f9或f9都跳过代码,直到kifastsystemcallret调用为止。所以代码卡在这里,所以我无法移动,只是重新启动应用程序。使用ctrl + f9,在此命中之后我命中了f7,但是代码没有跳转到我需要的代码逻辑,有些随机。谢谢你的帮助。

–伊戈尔
2013年12月27日22:38



请张贴在printf()断点处暂停的OllyDbg的屏幕截图。

–詹森·格夫纳(Jason Geffner)
13年12月27日在22:55

好的,请稍等一下。我从《逆向工程的秘密》一书中学习。 i.imgur.com/To9LhuV.png这是关于断点的信息。 i.imgur.com/r7M7xCN.png此屏幕截图显示了在我按f9后代码跳过的地方。

–伊戈尔
2013年12月27日23:00



该断点不在printf()函数上;它在对printf()函数的调用上。并且不要在这种情况下使用F9,因为它只会运行您的程序直到终止。

–詹森·格夫纳(Jason Geffner)
2013年12月27日23:34

使用ctrl + f9,处于调试模式的应用程序仅打印第一条消息,而不打印其他两条消息。但是,如果我先使用ctrl + f9,然后再使用f7(您在这里告诉我),它的外观以及代码在哪里。

–伊戈尔
2013年12月27日23:45



#3 楼

两个ScreenShot都与应用程序在第一个屏幕截图中终止有关,而在第二个屏幕快照中它位于随机的ZwMapSection中。

您发布了在printf上设置一个bp的功能,这是断点命中吗?
如果被击中,那么您可以使用ctrl + k查看调用堆栈。
ollydbg将向您显示调用printf的人

您的屏幕截图不会显示您是否击中了中断,以及您已被Jason在其评论中张贴的对printf的调用暂停了。

还可以使用ollydbg使用runtrace功能来跟踪完整的路径,这可以帮助您在尝试使用它的过程中分离出逻辑。