BNIL 명령 트리 및 메타 프로그램 Python 명령 일치자를 그래프로 표시하는 BinaryNinja 플러그인입니다.
설치는 두 가지 방법으로 지원됩니다. 첫 번째는 새 플러그인 관리자를 사용하고 두 번째는 수동 설치를 사용합니다.
"편집" 메뉴에서 "플러그인 관리"를 선택하여 새로운 플러그인 관리자를 사용하세요. 플러그인 목록에서 "BNIL Instruction Graph"를 검색하고 마우스 오른쪽 버튼을 클릭한 후 "설치"를 클릭한 후 다시 마우스 오른쪽 버튼을 클릭하고 "활성화"를 선택하세요.
$ git clone https://github.com/withzombies/bnil-graph.git
$ cd ~/Library/Application Support/Binary Ninja/plugins
$ ln -s ~/git/bnil-graph .
bnil-graph를 사용하려면 명령어를 마우스 오른쪽 버튼으로 클릭하고 "BNIL Instruction Graph"를 선택하세요. 해당 주소와 관련된 BNIL 명령어를 그래프로 표시하고 HTML 형식으로 표시합니다.
Binary Ninja는 피연산자 접근자를 동적으로 추가합니다. 이로 인해 편리한 접근자가 dir()
호출이나 API 문서에 표시되지 않습니다. bnil-graph는 좋은 접근자 이름(예: 소스 레지스터 또는 메모리에 대한 insn.src
)을 포함하여 IL 명령어의 구조를 보여줍니다.
예시 그래프:
그래프 플러그인 외에도 bnil-graph는 선택한 지침과 정확히 일치하는 일치 함수를 생성합니다. 이 기능을 사용하면 새로운 플러그인 개발자가 지침을 신속하게 일치시킬 수 있습니다. 의도된 용도는 일치하려는 명령과 유사한 명령을 찾아 일치 함수를 생성한 다음 생성된 함수를 수정하여 요구 사항을 더 잘 지원하는 것입니다.
예를 들어 3개의 매개변수를 사용하는 모든 MediumLevelILSSA MLIL_CALL_SSA 명령을 찾으려고 시도하는 것입니다. 매개변수가 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
이제 3개의 매개변수로 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 )
예시 일치자:
이 프로젝트의 저작권은 Ryan Stortz(@withzombies)에게 있으며 Apache 2.0 라이센스에 따라 사용할 수 있습니다.