Files
lief-project-LIEF/tests/api/test_python.py
T
2026-03-19 17:08:49 +01:00

174 lines
4.6 KiB
Python

#!/usr/bin/env python
import sys
import pytest
import io
from io import open as io_open
from pathlib import Path
import lief
from utils import get_sample, is_x86_64
def test_wrong_obj(capsys):
class Empty:
pass
_ = lief.parse(Empty())
captured = capsys.readouterr()
assert "LIEF parser interface does not support this Python object: test_python.Empty" in captured.err
def test_pathlib():
lspath = Path(get_sample('ELF/ELF64_x86-64_binary_ls.bin'))
ls = lief.parse(lspath)
assert isinstance(ls, lief.ELF.Binary)
def test_io():
lspath = get_sample('ELF/ELF64_x86-64_binary_ls.bin')
ls = lief.parse(lspath)
assert ls.abstract.header is not None
with io_open(lspath, 'rb') as f:
ls = lief.parse(f)
assert ls.abstract.header is not None
with io_open(lspath, 'rb') as f:
ls = lief.parse(f)
assert ls.abstract.header is not None
with io_open(lspath, 'rb') as f:
ls = lief.ELF.parse(f)
assert ls.abstract.header is not None
with io_open(get_sample('PE/PE64_x86-64_binary_HelloWorld.exe'), 'rb') as f:
binary = lief.PE.parse(f)
assert binary.abstract.header is not None
with io_open(get_sample('MachO/MachO64_x86-64_binary_dd.bin'), 'rb') as f:
binary = lief.MachO.parse(f)[0]
assert binary.abstract.header is not None
with open(lspath, 'rb') as f: # As bytes
ls = lief.parse(f.read())
assert ls.abstract.header is not None
with open(lspath, 'rb') as f: # As io.BufferedReader
ls: lief.ELF.Binary = lief.parse(f)
assert ls.abstract.header is not None
assert len(ls.sections) > 0
with open(lspath, 'rb') as f: # As io.BytesIO object
bytes_stream = io.BytesIO(f.read())
assert bytes_stream is not None
def test_wrong_io():
class Wrong1:
pass
class Wrong2(io.IOBase):
pass
class Wrong3(io.IOBase):
def tell(self):
return 0
class Wrong4(io.IOBase):
def tell(self):
return 0
def seek(self, pos):
return 0
class Wrong5(io.IOBase):
def tell(self):
return 0
def seek(self, p0, p1):
return 0
def read(self):
return None
def readinto(self, size):
return None
wrong = Wrong1()
out = lief.parse(wrong)
assert out is None
wrong = Wrong2()
out = lief.parse(wrong)
assert out is None
wrong = Wrong3()
out = lief.parse(wrong)
assert out is None
wrong = Wrong4()
out = lief.parse(wrong)
assert out is None
wrong = Wrong5()
out = lief.parse(wrong)
assert out is None
def test_platform():
if sys.platform.lower().startswith("linux"):
assert lief.current_platform() == lief.PLATFORMS.LINUX
if sys.platform.lower().startswith("darwin"):
assert lief.current_platform() == lief.PLATFORMS.OSX
if sys.platform.lower().startswith("win"):
assert lief.current_platform() == lief.PLATFORMS.WINDOWS
def test_issue_688():
"""
https://github.com/lief-project/LIEF/issues/688
"""
pe = lief.parse(get_sample("PE/9b58db32f6224e213cfd130d6cd7a18b2440332bfd99e0aef4313de8099fa955.neut"))
assert pe.resources_manager.dialogs[0].items[0] is not None
i = pe.resources_manager.dialogs[0].items
assert i[0] is not None
def test_hash():
if is_x86_64():
assert lief.hash(b"foo") == 17981288402089600942
def test_iterator():
mfc_path = get_sample('PE/PE64_x86-64_binary_mfc-application.exe')
mfc = lief.parse(mfc_path)
items = mfc.resources_manager.dialogs[0].items
assert len(items) > 0
assert items[0] is not None
assert next(items) is not None
with pytest.raises(StopIteration) as e_info:
for i in range(100):
next(items)
with pytest.raises(IndexError):
items[100]
def test_abstract_concrete():
pe = lief.parse(get_sample('PE/PE64_x86-64_binary_HelloWorld.exe'))
assert type(pe) == lief.PE.Binary
abstract = pe.abstract
assert type(abstract) == lief.Binary
assert type(abstract.concrete) == lief.PE.Binary
def test_from_bytes():
input_path = Path(get_sample('PE/PE64_x86-64_binary_HelloWorld.exe'))
pe = lief.PE.parse(input_path.read_bytes())
assert pe is not None
input_path = Path(get_sample('ELF/python3.12d'))
elf = lief.ELF.parse(input_path.read_bytes())
assert elf is not None
input_path = Path(get_sample('MachO/MachO64_AArch64_weak-sym-fc.bin'))
macho = lief.MachO.parse(input_path.read_bytes())
assert macho is not None