mirror of
https://github.com/mandiant/capa.git
synced 2026-06-12 19:11:32 -07:00
119 lines
3.1 KiB
Python
119 lines
3.1 KiB
Python
# Copyright 2024 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
|
|
import sys
|
|
import logging
|
|
import argparse
|
|
import importlib.util
|
|
|
|
import rich
|
|
import rich.table
|
|
|
|
import capa.main
|
|
from capa.features.extractors.ida.idalib import is_idalib_installed
|
|
from capa.features.extractors.binja.find_binja_api import find_binaryninja, load_binaryninja, is_binaryninja_installed
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def is_vivisect_installed() -> bool:
|
|
try:
|
|
return importlib.util.find_spec("vivisect") is not None
|
|
except ModuleNotFoundError:
|
|
return False
|
|
|
|
|
|
def load_vivisect() -> bool:
|
|
try:
|
|
import vivisect # noqa: F401 unused import
|
|
|
|
return True
|
|
except ImportError:
|
|
return False
|
|
|
|
|
|
def main(argv=None):
|
|
if argv is None:
|
|
argv = sys.argv[1:]
|
|
|
|
parser = argparse.ArgumentParser(description="Detect analysis backends.")
|
|
capa.main.install_common_args(parser, wanted=set())
|
|
args = parser.parse_args(args=argv)
|
|
|
|
try:
|
|
capa.main.handle_common_args(args)
|
|
except capa.main.ShouldExitError as e:
|
|
return e.status_code
|
|
|
|
if args.debug:
|
|
logging.getLogger("capa").setLevel(logging.DEBUG)
|
|
logging.getLogger("viv_utils").setLevel(logging.DEBUG)
|
|
else:
|
|
logging.getLogger("capa").setLevel(logging.ERROR)
|
|
logging.getLogger("viv_utils").setLevel(logging.ERROR)
|
|
|
|
table = rich.table.Table()
|
|
table.add_column("backend")
|
|
table.add_column("already installed?")
|
|
table.add_column("found?")
|
|
table.add_column("loads?")
|
|
|
|
if True:
|
|
row = ["vivisect"]
|
|
if is_vivisect_installed():
|
|
row.append("True")
|
|
row.append("-")
|
|
else:
|
|
row.append("False")
|
|
row.append("False")
|
|
|
|
row.append(str(load_vivisect()))
|
|
table.add_row(*row)
|
|
|
|
if True:
|
|
row = ["Binary Ninja"]
|
|
if is_binaryninja_installed():
|
|
row.append("True")
|
|
row.append("-")
|
|
else:
|
|
row.append("False")
|
|
row.append(str(find_binaryninja() is not None))
|
|
|
|
row.append(str(load_binaryninja()))
|
|
table.add_row(*row)
|
|
|
|
if True:
|
|
row = ["IDA idalib"]
|
|
if is_idalib_installed():
|
|
row.append("True")
|
|
row.append("-")
|
|
else:
|
|
row.append("False")
|
|
row.append("False")
|
|
|
|
does_idalib_load = False
|
|
try:
|
|
import idapro # noqa: F401 [imported but unused]
|
|
except ImportError:
|
|
does_idalib_load = True
|
|
row.append(str(does_idalib_load))
|
|
table.add_row(*row)
|
|
|
|
rich.print(table)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|