IDAPython дамп шестнадцатеричный прекод опкода в файл - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь вывести шестнадцатеричное представление кода операции рядом с кодом операции в текстовый файл, но пока мне это не удалось.Вот как это выглядит сейчас:

.init_proc   start: 6a0  end: 6b0
6a0  å-à   PUSH  {LR}; _init
6a4  ëO    BL    frame_dummy
6a8  ë¨    BL    __do_global_ctors_aux
6ac  äð    POP   {PC}

strerror     start: 6c4  end: 6d0
6c4  âÆ    ADR   R12, 0x6CC
6c8  âŒÊ   ADD   R12, R12, #0x8000
6cc  å¼þ`  LDR   PC, [R12,#(strerror_ptr - 0x86CC)]!; __imp_strerror

К сожалению, функция get_bytes возвращает только строку, а не целое число, поэтому я не могу преобразовать ее в hex.Есть ли другой способ сделать это?Это мой сценарий idapython:

cur_addr = 0

with open("F:/Ida_scripts/ida_output.txt", "w") as f:
    for func in Functions():
        start = get_func_attr(func, FUNCATTR_START)
        end = get_func_attr(func, FUNCATTR_END)
        f.write("%s\t start: %x\t end: %x" % (get_func_name(func), start, end))
        cur_addr = start
        while cur_addr <= end:
            f.write("\n%x\t%s\t%s" % (curr_addr, get_bytes(cur_addr, get_item_size(curr_addr)), generate_disasm_line(cur_addr, 0)))
            cur_addr = next_head(cur_addr, end)
        f.write("\n\n")

1 Ответ

0 голосов
/ 15 февраля 2019

Если get_bytes() возвращает строку, то я предполагаю, что вы хотите преобразовать каждый байт в этой строке в шестнадцатеричный формат и вывести его вместо этого.Попробуйте это:

print(' '.join('%02x' % ord(c) for c in get_bytes(…))

Это напечатает что-то вроде этого:

61 62 63 64

(Для 'abcd' в качестве ввода.)

Или как функция:

def str_to_hex(s):
  return ' '.join('%02x' % ord(c) for c in s)

Обратите внимание, что в Python3 тип str является типом данных Unicode, поэтому он будет больше, чем просто байт на символ;там у вас есть тип bytes для байтовых массивов (возможно, ваш get_bytes() должен будет вернуть это вместо строки).В Python2 тип str - это байтовый массив, а тип unicode - для строк в кодировке Unicode.Я не знаю, в какой версии Python вы разрабатываете.

...