IDA SDK - 无法理解位移查询函数的输出?

逆向工程 艾达 C++ 开发包
2021-06-12 14:05:44

好的,所以我想用 IDA SDK 解析 x86 指令。但是我无法理解输出,我有这个代码(decode_insn在每个存在的操作数(type不是 0)之后执行):

//op is an operand op_t of some insn_t
//ea1 is current address
                if(has_displ(op)) {
                    
                    msg("%x\n", ea1);

                    msg("%d\n", x86_base_reg(instr, op));

                    msg("%d\n", x86_index_reg(instr, op));

                    msg("%d\n", x86_scale(op));

                    msg("%d\n", op.addr);
                }

这是拆卸:

.text:0040AE64                 lea     edx, ds:0[eax*4]
.text:0040AE6B                 lea     edi, [eax+eax*2]

我为上述每条指令得到的输出是:

40AE64
-1
0
2
0

对于第二个,它甚至没有进入 if。我的问题是为什么?还有为什么输出中的 2 不是 4?

此外,如果您能指出一些利用 API 来完全解析 x86 指令的开源项目,以供参考,我将不胜感激。

1个回答

指令编码和解码是 SDK 中最不友好的部分之一。由于它们必须使用相同的数据类型集支持如此多的处理器架构,因此它们基本上必须在如何存储有关操作数的信息方面发挥创意。它并不总是具有逻辑意义,但它确实没有必要——除了可以存储和检索数据以及处理器模块知道如何处理它之外,真正需要满足的要求很少。

也就是说,您可以通过编写插件/IDAPython 脚本来转储操作数信息,从而熟悉在给定架构上的工作方式。我写了这样一个脚本,您可以在此处的倒数第二段中找到链接

对于您的具体问题:

  1. 我猜第二条指令使用的是o_phrase操作数,而不是o_displ.
  2. 该数字2表示左移的量,而不是乘以的量。这与 x86*4对内存表达式部分的编码方式一致