我使用的是ARM可执行文件。
有时我会有类似MOV的指令:
MOV R0, #0xCD548A40

其中数字#0xCD548A40是有效的偏移量,但IDA不能自动识别它。 >我尝试使用启用的选项“自动将数据自动转换为偏移量”重新分析可执行文件,而没有任何合适的结果。 :
idaapi.jumpto(address)
idaapi.process_ui_action("OpOffset", 0)

使用起来不太方便。
问题

给出特定地址的指令及其有效偏移范围内的一个操作数是它吗?可以使用IDA Python将此类数字转换为偏移量吗?
我应该使用哪个IDAPython API?


#1 楼

我一直在使用Ida OpOff函数。那是idc,不是idapython,而是https://www.hex-rays.com/products/ida/support/idapython_docs/idc-module.html#OpOff说OpOff中也有idapython。此外,还有另一个功能OpOffEx,可让您指定更多详细信息。我认为您需要的就是其中之一。

#2 楼

我碰巧碰到了这个确切的问题。

这就是我所做的。将for位替换为if位,即可对其进行少量测试。

from idautils import *
from idaapi import *
from idc import *

#if True:
#    if True:
#        if True:
#            startea = 0x0F9109DC
#            endea = 0x0F9109F
for segea in Segments():
    for funcea in Functions(segea, SegEnd(segea)):
        functionName = GetFunctionName(funcea)
        for (startea, endea) in Chunks(funcea):
            for ea in Heads(startea, endea):
                if idc.GetMnem(ea) != "MOV" or idc.get_operand_type(ea, 1) != 5 or  idc.get_str_type(idc.get_operand_value(ea, 1)) != 0:
                    continue
                print "0x%08x"%(ea), ":", idc.GetOpnd(ea, 1), idc.get_operand_type(ea, 1)
                idc.op_plain_offset(ea,1,0)


`