mirror of
https://github.com/QuasarApp/LIEF.git
synced 2025-04-30 14:24:33 +00:00
111 lines
2.4 KiB
Python
111 lines
2.4 KiB
Python
|
#/usr/bin/env python
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
|
|||
|
# Description
|
|||
|
# -----------
|
|||
|
# Universal format reader.
|
|||
|
# Input can be PE, ELF or Mach-O
|
|||
|
|
|||
|
import lief
|
|||
|
import sys
|
|||
|
|
|||
|
def print_sections(sections):
|
|||
|
print("== Sections ==")
|
|||
|
f_title = "|{:<30} | {:<18}| {:<18}| {:<18}| {:<9}|"
|
|||
|
f_value = "|{:<30} | 0x{:<16x}| 0x{:<16x}| 0x{:<16x}| {:<9.2f}|"
|
|||
|
print(f_title.format("Name", "File offset", "Size", "Virtual Address", "Entropy"))
|
|||
|
for section in sections:
|
|||
|
print(f_value.format(\
|
|||
|
section.name,\
|
|||
|
section.offset,\
|
|||
|
section.size,\
|
|||
|
section.virtual_address,\
|
|||
|
section.entropy))
|
|||
|
print("")
|
|||
|
|
|||
|
def print_symbols(symbols):
|
|||
|
|
|||
|
print("== Symbols ==")
|
|||
|
|
|||
|
f = "|{:<30} |"
|
|||
|
|
|||
|
print(f.format("Name"))
|
|||
|
|
|||
|
for symbol in symbols:
|
|||
|
print(f.format(symbol.name))
|
|||
|
print("")
|
|||
|
|
|||
|
|
|||
|
def print_exported_functions(functions):
|
|||
|
|
|||
|
print("== Exported functions ==")
|
|||
|
f = "|{:<30} |"
|
|||
|
print(f.format("Name"))
|
|||
|
for func in functions:
|
|||
|
print(f.format(func))
|
|||
|
print("")
|
|||
|
|
|||
|
def print_imported_functions(functions):
|
|||
|
|
|||
|
print("== Imported functions ==")
|
|||
|
f = "|{:<30} |"
|
|||
|
print(f.format("Name"))
|
|||
|
for func in functions:
|
|||
|
print(f.format(func))
|
|||
|
print("")
|
|||
|
|
|||
|
|
|||
|
def print_imported_libraries(libraries):
|
|||
|
|
|||
|
print("== Imported Libraries ==")
|
|||
|
f = "|{:<30} |"
|
|||
|
print(f.format("Name"))
|
|||
|
for library in libraries:
|
|||
|
print(f.format(library))
|
|||
|
print("")
|
|||
|
|
|||
|
|
|||
|
|
|||
|
def read_binary(path):
|
|||
|
print("== Abstract Reader ==")
|
|||
|
|
|||
|
binary = lief.parse(path)
|
|||
|
binary = super(binary.__class__, binary)
|
|||
|
try:
|
|||
|
header = binary.header
|
|||
|
print(header)
|
|||
|
except lief.not_implemented as e:
|
|||
|
print(e)
|
|||
|
|
|||
|
sections = binary.sections
|
|||
|
symbols = binary.symbols
|
|||
|
func_exported = binary.exported_functions
|
|||
|
func_imported = binary.imported_functions
|
|||
|
libraries = binary.libraries
|
|||
|
|
|||
|
if len(sections) > 0:
|
|||
|
print_sections(sections)
|
|||
|
|
|||
|
if len(symbols) > 0:
|
|||
|
print_symbols(symbols)
|
|||
|
|
|||
|
if len(func_exported) > 0:
|
|||
|
print_exported_functions(func_exported)
|
|||
|
|
|||
|
if len(func_imported) > 0:
|
|||
|
print_imported_functions(func_imported)
|
|||
|
|
|||
|
if len(libraries) > 0:
|
|||
|
print_imported_libraries(libraries)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
|
|||
|
if len(sys.argv) != 2:
|
|||
|
print("Usage:", sys.argv[0], "<binary>")
|
|||
|
sys.exit(1)
|
|||
|
|
|||
|
read_binary(sys.argv[1])
|
|||
|
|