2017-07-05 20:21:26 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
import unittest
|
|
|
|
import lief
|
|
|
|
import tempfile
|
|
|
|
import sys
|
|
|
|
import subprocess
|
|
|
|
import stat
|
|
|
|
import os
|
|
|
|
import logging
|
|
|
|
import random
|
|
|
|
import itertools
|
|
|
|
|
|
|
|
from subprocess import Popen
|
|
|
|
|
|
|
|
from unittest import TestCase
|
|
|
|
from utils import get_sample
|
|
|
|
|
|
|
|
class TestMachO(TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self.logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
def test_function_starts(self):
|
|
|
|
dd = lief.parse(get_sample('MachO/MachO64_x86-64_binary_dd.bin'))
|
|
|
|
|
|
|
|
functions = [
|
|
|
|
0x100001581, 0x1000016cc, 0x1000017cc,
|
|
|
|
0x1000019e3, 0x100001a03, 0x100001a1d,
|
|
|
|
0x1000020ad, 0x1000022f6, 0x1000023ef,
|
2017-07-30 17:22:09 +02:00
|
|
|
0x10000246b, 0x10000248c, 0x1000026da,
|
2017-07-05 20:21:26 +02:00
|
|
|
0x100002754, 0x10000286b, 0x100002914,
|
2017-07-30 17:22:09 +02:00
|
|
|
0x100002bd8, 0x100002be8, 0x100002c2b,
|
|
|
|
0x100002c62, 0x100002d24, 0x100002d5a,
|
|
|
|
0x100002d91, 0x100002dd5, 0x100002de6,
|
|
|
|
0x100002dfc, 0x100002e40, 0x100002e51,
|
|
|
|
0x100002e67, 0x100002f9e
|
2017-07-05 20:21:26 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
self.assertEqual(dd.function_starts.data_offset, 21168)
|
|
|
|
self.assertEqual(dd.function_starts.data_size, 48)
|
|
|
|
text_segment = list(filter(lambda e : e.name == "__TEXT", dd.segments))[0]
|
|
|
|
functions_dd = map(text_segment.virtual_address .__add__, dd.function_starts.functions)
|
|
|
|
|
|
|
|
self.assertEqual(functions, list(functions_dd))
|
|
|
|
|
2017-07-27 15:50:55 +02:00
|
|
|
|
|
|
|
def test_version_min(self):
|
|
|
|
sshd = lief.parse(get_sample('MachO/MachO64_x86-64_binary_sshd.bin'))
|
|
|
|
self.assertEqual(sshd.version_min.version, [10, 11, 0])
|
|
|
|
self.assertEqual(sshd.version_min.sdk, [10, 11, 0])
|
|
|
|
|
|
|
|
|
2017-07-17 17:22:55 +02:00
|
|
|
def test_relocations(self):
|
|
|
|
helloworld = lief.parse(get_sample('MachO/MachO64_x86-64_object_HelloWorld64.o'))
|
|
|
|
|
|
|
|
# __text Section
|
|
|
|
text_section = helloworld.get_section("__text")
|
|
|
|
relocations = text_section.relocations
|
|
|
|
self.assertEqual(len(relocations), 2)
|
|
|
|
|
|
|
|
# 0
|
2017-09-05 22:40:13 +02:00
|
|
|
self.assertEqual(relocations[0].address, 0x233)
|
2017-07-17 17:22:55 +02:00
|
|
|
self.assertEqual(relocations[0].type, 2)
|
2017-07-30 17:22:09 +02:00
|
|
|
self.assertEqual(relocations[0].size, 32)
|
2017-07-17 17:22:55 +02:00
|
|
|
|
|
|
|
self.assertEqual(relocations[0].is_scattered, False)
|
|
|
|
|
|
|
|
self.assertEqual(relocations[0].has_symbol, True)
|
|
|
|
self.assertEqual(relocations[0].symbol.name, "_printf")
|
|
|
|
|
|
|
|
self.assertEqual(relocations[0].has_section, True)
|
|
|
|
self.assertEqual(relocations[0].section.name, text_section.name)
|
|
|
|
|
|
|
|
# 1
|
2017-09-05 22:40:13 +02:00
|
|
|
self.assertEqual(relocations[1].address, 0x21b)
|
2017-07-17 17:22:55 +02:00
|
|
|
self.assertEqual(relocations[1].type, 1)
|
2017-07-30 17:22:09 +02:00
|
|
|
self.assertEqual(relocations[1].size, 32)
|
2017-07-17 17:22:55 +02:00
|
|
|
|
|
|
|
self.assertEqual(relocations[1].is_scattered, False)
|
|
|
|
|
|
|
|
self.assertEqual(relocations[1].has_symbol, False)
|
|
|
|
|
|
|
|
self.assertEqual(relocations[1].has_section, True)
|
|
|
|
self.assertEqual(relocations[1].section.name, text_section.name)
|
|
|
|
|
|
|
|
# __compact_unwind__LD Section
|
|
|
|
cunwind_section = helloworld.get_section("__compact_unwind__LD")
|
|
|
|
relocations = cunwind_section.relocations
|
|
|
|
self.assertEqual(len(relocations), 1)
|
|
|
|
|
|
|
|
# 0
|
2017-09-05 22:40:13 +02:00
|
|
|
self.assertEqual(relocations[0].address, 0x247)
|
2017-07-17 17:22:55 +02:00
|
|
|
self.assertEqual(relocations[0].type, 0)
|
2017-07-30 17:22:09 +02:00
|
|
|
self.assertEqual(relocations[0].size, 32)
|
2017-07-17 17:22:55 +02:00
|
|
|
|
|
|
|
self.assertEqual(relocations[0].is_scattered, False)
|
|
|
|
|
|
|
|
self.assertEqual(relocations[0].has_symbol, False)
|
|
|
|
|
|
|
|
self.assertEqual(relocations[0].has_section, True)
|
|
|
|
self.assertEqual(relocations[0].section.name, "__cstring")
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-07-05 20:21:26 +02:00
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
|
|
root_logger = logging.getLogger()
|
|
|
|
root_logger.setLevel(logging.DEBUG)
|
|
|
|
|
|
|
|
ch = logging.StreamHandler()
|
|
|
|
ch.setLevel(logging.DEBUG)
|
|
|
|
root_logger.addHandler(ch)
|
|
|
|
|
|
|
|
unittest.main(verbosity=2)
|
|
|
|
|