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

在“函数”窗口中,我可以看到1000多个函数。

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

我使用IDA,但是如果我可以使用另一个调试器也可以。

#1 楼

尽管您可以使用多种工具,但我建议您尽可能使用GDB,因为它具有在每个函数调用时都会中断的内置功能。<​​br />
现在,您可以做的是运行您的程序两次-第一次,不按任何按钮,第二次,这样做。我正在安装一个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中完成此操作的方式。 >

#2 楼

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

#3 楼

除了Nirlzr的答案外,您还可以转到调试器中的功能Imports窗口(例如IDA,OllyDbg和x64Dbg),然后在您想知道的功能上设置断点。然后,只需运行该程序,调试器将在调用每个函数时停止执行程序。例如,如果要查看程序何时调用CreateProcessInternalW,则可以进入函数导入表(有时称为“符号”),并在此处列出的函数上设置断点。现在,当程序创建新进程时,调试器将在此时中断执行,因此您可以看到传递的参数和返回值。为了方便起见,我在IDA Pro中附加了此屏幕截图-注意屏幕的右侧,我在apphelp.dll的功能列表中找到了该功能列表,可以通过在“模块”窗口中找到它然后双击DLL文件名。现在,我们可以右键单击特定的功能(如我所示),然后单击“添加断点”,然后运行该程序。仅在启动调试器后,它才可在IDA调试器中使用。

注意:有时在程序开始时无法完全解决导入问题,因此当您继续执行程序时,其中的更多内容功能将可用。