该对话框是一个密码挑战,我想捕获/跟踪/观察单击对话框的“确定”按钮后立即执行的代码(希望是密码检查代码)。

我似乎找不到在IDA中执行此操作的方法。 IDA中完成此操作的正确顺序是什么?

#1 楼

如果使用调试器来动态分析过程,则比使用静态分析要容易得多。

如果应用程序使用纯Windows API,则可以尝试使用spy ++之类的软件来获取对话框过程的地址,只要对话框中发生一些有趣的事情时就会调用该地址,或者,您可以在DialogBox API函数上放置一个断点(其中有几个,DialogBoxA用于ascii字符串,DialogBoxW用于宽字符字符串,以及一些DialogBoxEx变体)。一旦知道了地址,就可以在IDA中查找该地址。更加困难,因为这些工具箱可能只会使用Windows API的一小部分,并自行处理事件。但是,如果您在gtk和/或qt上放置一个断点(同样在多个A / W / Ex变体中)以​​检查应用程序何时何地实际读取您输入的内容,则可能仍然成功。

如果由于某种原因,您绝对不能使用调试器,而只能使用IDA,则仍然可以尝试交叉引用上述功能,并从那里开始。但是,由于您不知道密码检查代码中使用了哪个交叉引用,因此这可能会更加困难/耗时。

除此之外,其中的一些想法我对类似问题的回答可能会对您有所帮助。

#2 楼

最初,您可以简单地搜索对话框中打印的任何字符串,并且在不进行混淆的情况下,用户输入之后执行的代码应易于定位。例如,在IDA Pro中:



如果这是一个简单的密码破解程序,则应查找迭代字符串中每个字符(即用户输入)的代码。 ,并将其与一些硬编码值进行比较。另外,正如其他人所阐述的那样,您可以查找Win32 API的特定用途并找到交叉引用。

评论


这种方法的问题是,如果它是Windows对话框,它将在exe文件中的某些资源中定义,而不是在代码/数据中定义,并且您不会在IDA中的任何位置找到字符串。

–贡特拉姆·布洛姆(Guntram Blohm)
2014年7月31日17:43

虽然我记得对,但您可以在IDA中加载rsrc段?

–多米尼克·安塔尔(Dominik Antal)
2014年8月7日15:14

@DominikAntal:是的,在自动分析之前,IDA提供了“加载资源段”复选框选项。

–JamalS
2014年8月7日15:14

#3 楼

我将运行目标,并使其显示对话框,然后将其附加到调试器。我会闯入调试器,在线程之间切换,直到看到哪个叫对话框。如果找到,我将打印调用堆栈。

如果通过通过地址计算出的运行时(虚拟函数)调用对话框,则静态分析可能很困难,但是您始终可以尝试上述方法。 >

#4 楼

不知道我应该接受以上哪个答案。我只在这里使用IDA报告对我有用的方法:


由于启动程序时主窗口和主菜单已经存在,因此我寻找了一个具有密码挑战对话框作为其下游。在这种情况下,它是FileOpen子例程。
单击File-> Open菜单项并选择受密码保护的文件会导致命中断点,从而暂停程序的执行。
请继续执行直到弹出密码询问对话框。
通过将最后执行的指令设置为断点来回溯。
重复步骤2到4,直到识别出触发该对话框的代码。

检查字符串(例如“ check”,“ password”)和其他预期关键字无效,因为找不到了它们。

幸运的是,在此过程中,一个名为遇到“ chk_pass”,我能够从暂时存储密码的EDX寄存器中提取密码。

#5 楼

有时,您会看到一个RegisterClass(Ex)调用,该调用带有指向结构的指针,该结构包括指向处理事件的函数的函数指针。该回调通常是您通常要查看的地方,特别是WM_COMMAND的消息和wParam0xC8