2015-04-21 4 views
0

Например:Как проверить немедленное значение, если оно является допустимым EA в ida?

68 38 30 42 00 push offset aUser32_dll_0 ; "USER32.DLL" 

Если я получаю значение операнда с помощью GetOperandValue(), как я могу проверить это непосредственное значение, является допустимым линейный адрес?

+0

Обычно, если аргумент адрес будет где-то внутри образа текущего исполняемого образа PE (при условии, что Wi ndows). Вы можете получить начальные адреса и диапазоны разделов в PE путем анализа его заголовка. msdn.com имеет спецификацию PE, где это объясняется. –

ответ

1

Возможный сценарий может быть следующим:

#!/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 
+0

большое спасибо! – Keen