Плагин BinaryNinja для графического отображения дерева инструкций BNIL и сопоставления инструкций метапрограммы Python.
Установка поддерживается двумя способами: первый с использованием нового менеджера плагинов, а второй — установка вручную.
Используйте новый менеджер плагинов, выбрав «Управление плагинами» в меню «Правка». Найдите в списке плагинов «График инструкций BNIL», щелкните его правой кнопкой мыши и нажмите «Установить», затем щелкните правой кнопкой мыши еще раз и выберите «Включить».
$ git clone https://github.com/withzombies/bnil-graph.git
$ cd ~/Library/Application Support/Binary Ninja/plugins
$ ln -s ~/git/bnil-graph .
Чтобы использовать bnil-граф, щелкните правой кнопкой мыши инструкцию и выберите «График инструкций BNIL». Это отображает инструкции BNIL, связанные с этим адресом, и отображает их в форме HTML.
Binary Ninja динамически добавляет методы доступа к операндам, поэтому удобные методы доступа не отображаются в вызовах dir()
или в документации API. bnil-graph показывает структуру инструкции IL, включая ее удобные имена доступа (например, insn.src
для исходного регистра или памяти)
Пример графика:
В дополнение к плагину графика bnil-graph также сгенерирует функцию сопоставления, которая будет точно соответствовать выбранным инструкциям. Эта функция позволит новым разработчикам плагинов быстро сопоставлять инструкции. Предполагаемое использование — найти инструкцию, аналогичную той, которую вы хотите сопоставить, сгенерировать функцию сопоставления, а затем изменить сгенерированную функцию для лучшего удовлетворения ваших потребностей.
Примером может служить попытка найти все инструкции MediumLevelILSSA MLIL_CALL_SSA, которые принимают 3 параметра. Я сгенерировал средство сопоставления с несвязанной функцией с 0 параметрами:
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . output . dest_memory != 0x1 :
return False
if len ( insn . output . dest ) != 0 :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if insn . dest . constant != 0x14000d49c :
return False
if len ( insn . params ) != 0 :
return False
if insn . src_memory != 0x0 :
return False
return True
Мы можем изменить это, чтобы удалить некоторые конкретные ограничения:
def match_MediumLevelILSSA_140001194_0 ( insn ):
# mem#1 = 0x14000d49c() @ mem#0
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
# invalid
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
# 0x14000d49c
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 0 :
return False
return True
Мы удалили пункт назначения вызова и ограничения версий памяти. Затем обновите проверку параметров, чтобы проверить 3 параметра:
def match_3_param_MLIL_CALL_SSA ( insn ):
if insn . operation != MediumLevelILOperation . MLIL_CALL_SSA :
return False
if insn . output . operation != MediumLevelILOperation . MLIL_CALL_OUTPUT_SSA :
return False
if insn . dest . operation != MediumLevelILOperation . MLIL_CONST_PTR :
return False
if len ( insn . params ) != 3 :
return False
return True
Теперь у нас есть сопоставитель, который будет идентифицировать инструкции MLIL_CALL_SSA с тремя параметрами! Теперь перебираем инструкции MLIL SSA и вызываем сопоставитель, и все готово:
if __name__ == '__main__' :
bv = binaryninja . BinaryViewType . get_view_of_file ( sys . argv [ 1 ])
bv . update_analysis_and_wait ()
for func in bv . functions :
mlil = func . medium_level_il
for block in mlil . ssa_form :
for insn in block :
if match_3_param_MLIL_CALL_SSA ( insn ):
print "Match: {}" . format ( insn )
Пример сопоставителя:
Авторские права на этот проект принадлежат Райану Сторцу (@withzombies), и он доступен по ЛИЦЕНЗИИ Apache 2.0.