我试图从IDA Pro的给定指令中获取所有操作数的字节大小。最初,我尝试使用GetOperandValue(ea,n)来查看该值的大小,并计算存储该值所需的字节数,但是它不会返回前导零,这意味着它不起作用。

现在我正在尝试使用OpHex(ea,n)来获取答案,但是它只是返回True(与OpDecimalOpBinaryOpOctal一样)。

如何找到用于a的操作数的字节数特殊说明,为什么OpHex返回true?

编辑:我当前的解决方案有效,但是我仍然希望在技术上更正确,更防弹。现在,我只是使用GetOperandValue(ea, op)来获取所有指令的两个操作数(即使它们没有或只有一个),然后检查以确保该操作数的值大于FF。如果它大于FF,我只是假设它是一个地址,在这种情况下为四个字节。如果两个操作数都满足此条件,我将大小分配为8个字节。

目前可以,但是在最终移植到其他体系结构时会遇到困难(现在我正在使用x86 -64)。

评论

您是指操作码指令中的值(例如mov)还是某些指针指向的数据结构的大小?

操作码指令中操作数的大小,而不是操作数指向的大小。要重新创建重定位,我需要知道要用地址覆盖多少字节。

#1 楼

似乎没有简单的方法可以实现这一目标。但是您可以看一下IDA SDK文档的此页面。

根据前一页的描述,我们可以编写一些辅助函数:



def size_of_operand(op):
    tbyte = 8
    dt_ldbl = 8
    n_bytes = [ 1, 2, 4, 4, 8,
            tbyte, -1, 8, 16, -1,
            -1, 6, -1, 4, 4,
            dt_ldbl, 32, 64 ]
    return n_bytes[op.dtype]


现在我们可以使用像



insn = idautils.DecodeInstruction(ScreenEA())
index_of_operand = 0
size_of_operand(insn.Operand[index_of_operand])


这样的命令来获取尺寸

例如,对于xor al, al,它返回1。对于pop ebp,它返回4。

#2 楼

您是否在寻找类似

Message("%s\n" , GetCurrentLine());
Message("%x\n" , ItemSize(ScreenEA()));


的东西,结果如下所示

.text:010328BB 56                            push    esi
1
.text:010328BC BE 10 42 05 01                mov     esi, offset unk_1054210
5
.text:010328C1                               cmp     byte_1054309, bl
6
.text:010328C1 38 1D 09 43 05 01             cmp     byte_1054309, bl
6


评论


似乎查询者只对操作数的大小感兴趣,而不对整个指令感兴趣。但这很接近。

– 0xC0000022L♦
18-11-15在21:24

是的,@ 0xC0000022L是正确的。

–theodidact
18年11月16日在18:42