在IDA Pro 6.1中,我有一个dll,它有二十次调用“CreateFileA”和“CreateFileW”函数API。
我想自动为所有CreateFileA / CreateFileW指定断点。
我可以手动为所有外部参照做,但这很乏味。 有没有办法直接为CreateFileA / CreateFileW调用指定断点?
非常感谢:)
答案 0 :(得分:1)
您可以在两个CreateFile的第一条指令处设置断点,或者您可以使用IDAPython创建断点来创建断点。
迭代所有指令/调用,并查找对相应函数的调用。
add_bpt()我相信是电话,
答案 1 :(得分:0)
如果CreateFileA / W都是导入(即.idata部分中定义的externs),您是否可以选择有问题的符号并点击F2(添加断点)?出现的Breakpoint设置对话框允许您指定硬件断点模式,在这种情况下,我们希望限制为Read(因为在解析导入时将在启动时写入符号的值),这应该只发生在'调用ds:CreateFileA'实例。
IDA帮助中的一些断点注释:
答案 2 :(得分:0)
据我所知,根据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才能在那里设置断点。
如果您感到困惑,我的建议是“在更简单的调试器中加载二进制文件”并尝试找出我们之前解释过的内容
答案 3 :(得分:0)
这是我写的一个脚本,用来完成你想要的东西。它在调用指定函数的位置设置软断点。
// 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”替换为您的函数名称,并通过File > Script command
一个已知的限制是它不会识别间接交叉引用(例如使用寄存器的调用)。