我使用 IDA 进行调试,我想查看/打印所有被调用的函数。
在函数窗口中,我看到了 1000 多个函数。
所以我想看看当我按下 Enter 或按下按钮和类似的动作时调用了哪些函数。
我使用 IDA,但如果我可以用另一个调试器来完成,那也没关系。
我使用 IDA 进行调试,我想查看/打印所有被调用的函数。
在函数窗口中,我看到了 1000 多个函数。
所以我想看看当我按下 Enter 或按下按钮和类似的动作时调用了哪些函数。
我使用 IDA,但如果我可以用另一个调试器来完成,那也没关系。
尽管您可以使用多种工具,但我建议您尽可能使用 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
这个文件将揭示哪些函数负责按钮按下处理。
通常,调试器(包括 IDA)提供跟踪功能。这是在预定义的粒度级别记录被调试者的操作。这可以记录所有单独的指令,或者根据您的需要记录函数调用。使用函数跟踪 ( Debugger -> Tracing -> Function Tracing
),用户可以查看在整个跟踪期间调用的所有函数。请记住,这可能会生成大量跟踪,建议将其记录到文件中。
除了 Nirlzr 的回答,您还可以转到调试器中的函数导入窗口(例如 IDA、OllyDbg 和 x64Dbg),并在您感兴趣的函数上设置断点。然后,只需运行程序,调试器将在调用每个函数时停止程序的执行。
例如,如果您想查看程序何时调用 CreateProcessInternalW,您可以进入函数导入表(有时称为“符号”)并在那里列出的函数上设置断点。现在,当程序创建一个新进程时,调试器将在该点中断执行,以便您可以看到传递的参数和返回值。为方便起见,我在 IDA Pro 中附上了此屏幕截图 - 请注意屏幕右侧的功能列表,apphelp.dll
通过在“模块”窗口中找到它,然后双击DLL 文件名。现在我们可以右键单击我显示的特定函数,然后单击“添加断点”,然后运行该程序。这仅在调试器启动后在 IDA 调试器中可用。