在IDA Pro 6.1中为所有函数调用指定断点

时间:2013-03-12 18:22:55

标签: debugging reverse-engineering ida

在IDA Pro 6.1中,我有一个dll,它有二十次调用“CreateFileA”和“CreateFileW”函数API。

我想自动为所有CreateFileA / CreateFileW指定断点。

我可以手动为所有外部参照做,但这很乏味。 有没有办法直接为CreateFileA / CreateFileW调用指定断点?

非常感谢:)

4 个答案:

答案 0 :(得分:1)

您可以在两个CreateFile的第一条指令处设置断点,或者您可以使用IDAPython创建断点来创建断点。

迭代所有指令/调用,并查找对相应函数的调用。

add_bpt()我相信是电话,

答案 1 :(得分:0)

如果CreateFileA / W都是导入(即.idata部分中定义的externs),您是否可以选择有问题的符号并点击F2(添加断点)?出现的Breakpoint设置对话框允许您指定硬件断点模式,在这种情况下,我们希望限制为Read(因为在解析导入时将在启动时写入符号的值),这应该只发生在'调用ds:CreateFileA'实例。

IDA帮助中的一些断点注释:

  • 创建超过4个硬件断点是不可能的
  • 请注意,硬件断点发生在指令执行后,而软件断点发生在指令之前。

答案 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

在IDA的“执行脚本”窗口中运行它

一个已知的限制是它不会识别间接交叉引用(例如使用寄存器的调用)。