Возможный сценарий может быть следующим:
#!/usr/bin/env python
from __future__ import print_function
import idaapi
def main():
# get instruction at mouse pos
current_ea = idaapi.get_screen_ea()
print("[*] Current screen ea: {:#x}".format(current_ea))
#get instruction operand
insn = idaapi.decode_insn(current_ea)
op = idaapi.cmd.Operands[0]
# check if immediate value
if op.type == idaapi.idaapi.o_imm:
# get operand value
imm_value = op.value
print("[*] current operand is an immediate: {:#x}".format(imm_value))
# check if addres is loaded in idb
print("[*] {:#x} is loaded in IDB? -> {}".format(imm_value,
idaapi.isLoaded(imm_value)))
# get segment for immediate value
seg = idaapi.getseg(imm_value)
print("[*] Segment start for {:#x} is {:#x}".format(imm_value,
seg.startEA))
else:
print("[-] Not an immediate")
if __name__ == "__main__":
main()
Выберите адрес в целях МАР, а затем запустить скрипт выше.
Сценарий проверяет, что первый операнд команды является непосредственным значением. Если это так, то просто проверьте, что адрес этого немедленного значения известен IDA (существует несколько способов проверки этого, я просто использовал isLoaded()
и getseg()
).
Это, очевидно, проверяет, что адрес находится внутри IDB. Адрес может быть действительным виртуальным адресом в контексте программы, но расположен за пределами IDB, и IDA не имеет никакого способа это знать.
Пример (выбор адреса 0x1019D5B1 в представлении МАР):
.text:1019D5B1 push offset [email protected] ; " Addr @ %p\n"
.text:1019D5B6 call pOutputRoutine
offset [email protected]
расположен на 0x100A4ECC:
.text:100A4ECC [email protected] db ' Addr @ %p',0Ah,0
Script выход:
[*] Current screen ea: 0x1019d5b1
[*] current operand is an immediate: 0x100a4ecc
[*] 0x100a4ecc is loaded in IDB? -> True
[*] Segment start for 0x100a4ecc is 0x10001000
Обычно, если аргумент адрес будет где-то внутри образа текущего исполняемого образа PE (при условии, что Wi ndows). Вы можете получить начальные адреса и диапазоны разделов в PE путем анализа его заголовка. msdn.com имеет спецификацию PE, где это объясняется. –