在 IDA Pro 6.1 中,我有一个 dll,它对“CreateFileA”和“CreateFileW”函数 API 有 20 次调用。
我想自动为所有 CreateFileA/CreateFileW 指定断点。
我可以为所有外部参照手动完成,但这很乏味。有没有办法直接为 CreateFileA/CreateFileW 调用指定断点?
非常感谢 :)
在 IDA Pro 6.1 中,我有一个 dll,它对“CreateFileA”和“CreateFileW”函数 API 有 20 次调用。
我想自动为所有 CreateFileA/CreateFileW 指定断点。
我可以为所有外部参照手动完成,但这很乏味。有没有办法直接为 CreateFileA/CreateFileW 调用指定断点?
非常感谢 :)
您可以在 CreateFile 的第一条指令处设置断点,或者您可以使用 IDAPython 来创建断点。
遍历所有指令/调用并查找对适当函数的调用。
add_bpt() 我相信是电话,
这是我写的一个脚本来完成你想要的。它在调用指定函数的位置设置软断点。
// Script used to set a breakpoint at the callsite
// of the specified function using cross-references.
#include <idc.idc>
static SetBreakpoint(location)
{
// Sets a breakpoint to be activated when
// the debugger runs over the address.
AddBptEx(location, 0, BPT_SOFT);
}
static CrossReferenceSource(source)
{
// Find the linear address of the source
// location to start xref'ing from.
auto sourcefn = LocByName(source);
auto iterfn = DfirstB(sourcefn);
if (sourcefn != BADADDR && iterfn != BADADDR)
{
do
{
Message("Setting breakpoint @ 0x%08x\n", iterfn);
SetBreakpoint(iterfn);
iterfn = DnextB(sourcefn, iterfn);
} while(iterfn != BADADDR);
}
}
static main()
{
auto source = "FunctionName";
Message("--- Setting breakpoints at cross-reference ---\n");
CrossReferenceSource(source);
Message("--- Finished settings breakpoints --\n");
}
将“FunctionName”替换为您的函数名称,并在 IDA 的“执行脚本”窗口中运行它,可通过File > Script command
一个已知的限制是它不能识别间接交叉引用(例如使用寄存器调用)。
如果 CreateFileA/W 都是导入的(即,在 .idata 部分中定义的外部变量),你能不能只选择有问题的符号并按 F2(添加断点)?出现的断点设置对话框允许您指定硬件断点模式,在这种情况下,我们希望将其限制为读取(因为解析导入时将在启动时写入符号的值),这应该只发生在 '调用 ds:CreateFileA' 实例。
IDA 帮助中的一些断点说明:
据我所知,根据 kornman00,“CreateFile”是从 dll 导入的。其实是直接从Kernel32.dll导入的,不知道怎么用的可以看这里。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
因此,为了做你正在寻找的东西,最好的方法是直接进入它,在 kernel32.CreateFileA 或 kernel32.CreateFileW 中设置断点。差异只是应用程序使用 Ansichar 还是 Widechar。
显然,为了做到这一点,您需要启动调试过程,因为必须先为您的应用程序加载 kernel32,然后才能在那里设置断点。
如果您感到困惑,我的建议是“在更简单的调试器中加载二进制文件”并尝试弄清楚我们之前向您解释过的内容