gpt4 book ai didi

x86 - 为什么这个dynamorio的指令跟踪程序输出比我的多?

转载 作者:行者123 更新时间:2023-12-05 05:22:21 26 4
gpt4 key购买 nike

我正在尝试使用检测工具 DynamoRIO 进行指令跟踪。我发现他们的网站上已经有一个指令跟踪样本:instrace_x86.c .但是,我不明白为什么他们在instrument_instr function中使用了这么多操作。 .我尝试用另一种简单的方式重写这个函数:

instrument_instr(void *drcontext, instrlist_t *ilist, instr_t *where)
{
app_pc pc;
per_thread_t *data;

data = drmgr_get_tls_field(drcontext, tls_index);
pc = instr_get_app_pc(where);

fprintf(data->logf, PIFX",%s\n",
(ptr_uint_t)pc, decode_opcode_name(instr_get_opcode(where)));
}

我发现这个简单的方法似乎也能正常工作,只是它的输出比官方示例少。

我不知道为什么我的方法log少,因为我不知道为什么官方的示例代码会做这么琐碎的操作。有人熟悉 DynamoRIO 的 API 吗? (特别是 drmgr_register_bb_instrumentation_event 函数。我不明白他们为什么要那样使用回调函数)

最佳答案

instrument_instr 函数在 DynamoRIO 转换 基本 block 时调用,而不是在执行 时调用。由于基本 block 通常只转换一次但执行多次,因此您的输出与示例工具的输出不同。

DynamoRIO 内部工作原理的一个过于简化的 View 是:DynamoRIO 在执行目标应用程序之前转换它们的基本 block 。这使用户(您)能够执行任意更改,并使 DynamoRIO 在执行基本 block 后收回控制权。转换后的 block 被写入所谓的代码缓存,它们将在其中执行。 DynamoRIO 仔细重写地址,以便跳跃和偏移仍然有效。代码缓存的目的是速度:已经变换过的基本 block 不需要再变换,所以留在代码缓存中;从程序其他地方跳转到原来的基本 block 被自动替换为跳转到代码缓存中转换后的基本 block 。

为了显示完整的执行轨迹,您必须更改基本 block ,以便它们输出它们包含的所有指令;然后,只要执行基本 block ,您就会自动获得输出。如果您想有效地做到这一点,这不是微不足道的。这就是示例工具包含大量代码的原因。

我建议阅读一些 tutorial slide sets ,例如 DynamoRIO tutorial at CGO Feb 2017 (PDF) .

关于x86 - 为什么这个dynamorio的指令跟踪程序输出比我的多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com