def __init__(self): self.logger = logging.getLogger(__name__) self.tmp_dir = tempfile.mkdtemp( suffix='_lief_sample_{:d}'.format(LibAddSample.COUNT)) self.logger.debug("temp dir: {}".format(self.tmp_dir)) LibAddSample.COUNT += 1 self.binadd_path = os.path.join(self.tmp_dir, "binadd.c") self.libadd_path = os.path.join(self.tmp_dir, "libadd.c") self.libadd_so = os.path.join(self.tmp_dir, "libadd.so") self.binadd_bin = os.path.join(self.tmp_dir, "binadd.bin") self.compiler = get_compiler() self.logger.debug("Compiler: {}".format(self.compiler)) with open(self.binadd_path, 'w') as f: f.write(BINADD_C) with open(self.libadd_path, 'w') as f: f.write(LIBADD_C) self._compile_libadd() self._compile_binadd()
def test_libadd_api2(self): _, binaddc = tempfile.mkstemp(prefix="binadd_", suffix=".c") _, libaddc = tempfile.mkstemp(prefix="libadd_", suffix=".c") self._logger.debug(binaddc) self._logger.debug(libaddc) fd, binadd = tempfile.mkstemp(prefix="binadd_", suffix=".bin") _, libadd = tempfile.mkstemp(prefix="libadd_", suffix=".so") _, libadd2 = tempfile.mkstemp(prefix="libadd2_", suffix=".so") self._logger.debug(binadd) self._logger.debug(libadd) self._logger.debug(libadd2) with open(binaddc, 'w') as f: f.write(BINADD) with open(libaddc, 'w') as f: f.write(LIBADD) compiler = get_compiler() fmt = "" if is_x86_64(): fmt = "{compiler} -Wl,--export-dynamic -mcmodel=large -fPIE -pie -o {output} {input}" if is_aarch64(): fmt = "{compiler} -Wl,--export-dynamic -fPIE -pie -o {output} {input}" # Compile libadd r = self.run_cmd( fmt.format(compiler=compiler, output=libadd, input=libaddc)) self.assertTrue(r, msg="Unable to compile libadd") libadd = lief.parse(libadd) add_hidden_static = libadd.get_static_symbol("add_hidden") libadd.add_exported_function(add_hidden_static.value, add_hidden_static.name) libadd.write(libadd2) lib_directory = os.path.dirname(libadd2) libname = os.path.basename(libadd2)[3:-3] # libadd.so ---> add r = self.run_cmd( "{compiler} -Wl,--export-dynamic -mcmodel=large -fPIE -pie -Wl,-rpath={libdir} -L{libdir} -o {output} {input} -l{libadd2}" .format(compiler=compiler, libdir=lib_directory, libadd2=libname, output=binadd, input=binaddc)) self.assertTrue(r, msg="Unable to compile binadd") os.close(fd) st = os.stat(binadd) os.chmod(binadd, st.st_mode | stat.S_IEXEC) r = self.run_cmd(binadd + " 1 2") self.assertTrue(r) self.assertIn("From [email protected] a + b = 3", r.output)
def setUp(self): self.logger = logging.getLogger(__name__) self.tmp_dir = tempfile.mkdtemp(suffix='_lief_test_content') self.logger.debug("temp dir: {}".format(self.tmp_dir)) self.binadd_path = os.path.join(self.tmp_dir, "binadd.c") self.libadd_path = os.path.join(self.tmp_dir, "libadd.c") self.libadd_so = os.path.join(self.tmp_dir, "libadd.so") self.binadd_bin = os.path.join(self.tmp_dir, "binadd.bin") self.compiler = get_compiler() self.logger.debug("Compiler: {}".format(self.compiler)) with open(self.binadd_path, 'w') as f: f.write(BINADD_C) with open(self.libadd_path, 'w') as f: f.write(LIBADD_C)
def setUp(self): self.logger = logging.getLogger(__name__) self.tmp_dir = tempfile.mkdtemp(suffix='_lief_testhash') self.logger.debug("temp dir: {}".format(self.tmp_dir)) self.binadd_path = os.path.join(self.tmp_dir, "binadd.c") self.libadd_path = os.path.join(self.tmp_dir, "libadd.c") self.libadd_so = os.path.join(self.tmp_dir, "libadd.so") self.binadd_bin = os.path.join(self.tmp_dir, "binadd.bin") self.compiler = get_compiler() if self.compiler is None: self.logger.error("Unable to find a compiler") sys.exit(0) self.logger.debug("Compiler: {}".format(self.compiler)) with open(self.binadd_path, 'w') as f: f.write(BINADD_C) with open(self.libadd_path, 'w') as f: f.write(LIBADD_C)
def test_libadd(self): _, binaddc = tempfile.mkstemp(prefix="binadd_", suffix=".c") _, libaddc = tempfile.mkstemp(prefix="libadd_", suffix=".c") self._logger.debug(binaddc) self._logger.debug(libaddc) fd, binadd = tempfile.mkstemp(prefix="binadd_", suffix=".bin") _, libadd = tempfile.mkstemp(prefix="libadd_", suffix=".so") _, libadd2 = tempfile.mkstemp(prefix="libadd2_", suffix=".so") self._logger.debug(binadd) self._logger.debug(libadd) self._logger.debug(libadd2) with open(binaddc, 'w') as f: f.write(BINADD) with open(libaddc, 'w') as f: f.write(LIBADD) compiler = get_compiler() # Compile libadd r = self.run_cmd( "{compiler} -Wl,--export-dynamic -mcmodel=large -fPIE -pie -o {output} {input}" .format(compiler=compiler, output=libadd, input=libaddc)) self.assertTrue(r, msg="Unable to compile libadd") libadd = lief.parse(libadd) libadd_hidden = libadd.get_symbol("add_hidden") libadd_hidden.binding = lief.ELF.SYMBOL_BINDINGS.GLOBAL libadd_hidden.visibility = lief.ELF.SYMBOL_VISIBILITY.DEFAULT libadd_hidden = libadd.add_dynamic_symbol( libadd_hidden, lief.ELF.SymbolVersion.global_) self._logger.debug(libadd_hidden) libadd.add(lief.ELF.DynamicSharedObject(os.path.basename(libadd2))) libadd.write(libadd2) lib_directory = os.path.dirname(libadd2) libname = os.path.basename(libadd2)[3:-3] # libadd.so ---> add r = self.run_cmd( "{compiler} -Wl,--export-dynamic -mcmodel=large -fPIE -pie -Wl,-rpath={libdir} -L{libdir} -o {output} {input} -l{libadd2}" .format(compiler=compiler, libdir=lib_directory, libadd2=libname, output=binadd, input=binaddc)) self.assertTrue(r, msg="Unable to compile binadd") os.close(fd) st = os.stat(binadd) os.chmod(binadd, st.st_mode | stat.S_IEXEC) r = self.run_cmd(binadd + " 1 2") self.assertTrue(r) self.assertIn("From [email protected] a + b = 3", r.output)