mirror of
https://github.com/lief-project/LIEF
synced 2026-06-08 15:30:44 +00:00
174 lines
4.6 KiB
Python
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
|