GetOperandValue(ea,n)
来查看该值的大小,并计算存储该值所需的字节数,但是它不会返回前导零,这意味着它不起作用。现在我正在尝试使用
OpHex(ea,n)
来获取答案,但是它只是返回True
(与OpDecimal
,OpBinary
和OpOctal
一样)。如何找到用于a的操作数的字节数特殊说明,为什么
OpHex
返回true?编辑:我当前的解决方案有效,但是我仍然希望在技术上更正确,更防弹。现在,我只是使用
GetOperandValue(ea, op)
来获取所有指令的两个操作数(即使它们没有或只有一个),然后检查以确保该操作数的值大于FF
。如果它大于FF
,我只是假设它是一个地址,在这种情况下为四个字节。如果两个操作数都满足此条件,我将大小分配为8个字节。目前可以,但是在最终移植到其他体系结构时会遇到困难(现在我正在使用x86 -64)。
#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
评论
您是指操作码指令中的值(例如mov)还是某些指针指向的数据结构的大小?操作码指令中操作数的大小,而不是操作数指向的大小。要重新创建重定位,我需要知道要用地址覆盖多少字节。