如何查看使用调试器调用的所有函数

逆向工程 艾达 调试 职能
2021-07-08 08:33:37

我使用 IDA 进行调试,我想查看/打印所有被调用的函数。

在函数窗口中,我看到了 1000 多个函数。

所以我想看看当我按下 Enter 或按下按钮和类似的动作时调用了哪些函数。

我使用 IDA,但如果我可以用另一个调试器来完成,那也没关系。

3个回答

尽管您可以使用多种工具,但我建议您尽可能使用 GDB,因为它具有在每次函数调用时中断的内置功能。

现在,您可以做的是运行您的程序两次 - 第一次,不按按钮,第二次,这样做。我正在附加一个 python 脚本,该脚本会将每个函数调用以及对它的多次调用打印到名为output的文件中随意将其用于您的目的:

#!/usr/bin/env python3
import gdb
import re

breakpoints = []
gdb.execute('rbreak', to_string=True)
gdb.execute('run', to_string=True)
try:
    while True:
        a = gdb.execute('continue', to_string=True)
        reg = gdb.execute('info registers rip', to_string=True)
        b = reg.split()[1][2:]
        f = reg.split()[3]
        c = gdb.execute('info breakpoints', to_string=True).split('\n')
        d = [s for s in c if b in s]
        if len(d) > 1:
            sys.exit(1)
        e = d[0].split()[0].split('.')[0]
        gdb.execute('disable breakpoints ' + e)
        breakpoints.append(e)
        breakpoints.append(f)
except:
    f = open("output", "w+")
    [f.write(b + '\n') for b in breakpoints]
    f.close()

您可以通过运行gdb name_of_your_program然后source gdb.py假设脚本名称为gdb.py来调用它

这样做两次后,您将获得两个文件:一个包含所有函数调用,但未按下按钮,另一个包含按下按钮时的函数调用。简单地运行diff这个文件将揭示哪些函数负责按钮按下处理。

如果由于某种原因你不能使用 GDB,这个答案显示了它可以在radare2 中完成的方式

通常,调试器(包括 IDA)提供跟踪功能。这是在预定义的粒度级别记录被调试者的操作。这可以记录所有单独的指令,或者根据您的需要记录函数调用。使用函数跟踪 ( Debugger -> Tracing -> Function Tracing),用户可以查看在整个跟踪期间调用的所有函数。请记住,这可能会生成大量跟踪,建议将其记录到文件中。

除了 Nirlzr 的回答,您还可以转到调试器中的函数导入窗口(例如 IDA、OllyDbg 和 x64Dbg),并在您感兴趣的函数上设置断点。然后,只需运行程序,调试器将在调用每个函数时停止程序的执行。

例如,如果您想查看程序何时调用 CreateProcessInternalW,您可以进入函数导入表(有时称为“符号”)并在那里列出的函数上设置断点。现在,当程序创建一个新进程时,调试器将在该点中断执行,以便您可以看到传递的参数和返回值。为方便起见,我在 IDA Pro 中附上了此屏幕截图 - 请注意屏幕右侧的功能列表,apphelp.dll通过在“模块”窗口中找到它,然后双击DLL 文件名。现在我们可以右键单击我显示的特定函数,然后单击“添加断点”,然后运行该程序。这仅在调试器启动后在 IDA 调试器中可用。

注意:有时导入在程序开始时没有完全解决,因此当您继续执行程序时,将可以使用更多这些功能。在此处输入图片说明