0

我经常在网上看到,当话题倒转的时候,就是这个语法

  *(_WORD *)(a1 + 6) = *(_WORD *)(a2 + 2);

我认为这段代码来自一个 IDA 插件(对吗?),但我无法理解它.. 有人可以解释一下,或者指出在哪里研究这个代码性质的东西吗?

提前致谢 =)

4

1 回答 1

2

此代码从 指向的地址复制 2 个字节到 指向a2 + 2的地址a1 + 6

更详细地说,代码执行以下操作:

  • 从 . 提前 2 个字节a2
  • 将结果视为WORD指针,即指向由两个字节组成的值的指针。这是(_WORD *)右边的部分。
  • 读取上述指针引用的 2 个字节。这是*右侧表达式的最左侧。

我们现在有一个 16 位的值。现在我们:

  • 从 . 提前 6 个字节a1
  • 将结果视为WORD指针。同样,这是(_WORD *)部分。
  • 将我们在第一部分中读取的 2 个字节写入我们拥有的指针指向的地址。

如果您以前从未见过这样的代码,您可能会认为(_WORD*)在表达式的两边都使用 是多余的 - 但事实并非如此。例如,我们可以读取一个 16 位值并将其写入一个指向 32 位值的指针中(例如,通过对其进行符号扩展)。

我建议您还查看汇编代码,您将在其中看到构成此分配的步骤。如果您没有它,那么只需自己编写一个 C 程序来执行此类操作,然后对其进行反编译。

于 2017-09-02T17:26:28.113 回答