def test_write(tmp_path): binary_name = "crypt_and_hash" fat = lief.MachO.parse( get_sample( 'MachO/9edfb04c55289c6c682a25211a4b30b927a86fe50b014610d04d6055bd4ac23d_crypt_and_hash.macho' )) target = fat.take(lief.MachO.CPU_TYPES.ARM64) output = f"{tmp_path}/{binary_name}.built" target.write(output) target = lief.parse(output) process(target) valid, err = lief.MachO.check_layout(target) assert valid, err if is_apple_m1(): chmod_exe(output) sign(output) with subprocess.Popen([output], universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc: stdout = proc.stdout.read() assert "CAMELLIA-256-CCM*-NO-TAG" in stdout assert "AES-128-CCM*-NO-TAG" in stdout
def test_linkedit_shift(tmp_path): binary_name = "crypt_and_hash" fat = lief.MachO.parse(get_sample('MachO/9edfb04c55289c6c682a25211a4b30b927a86fe50b014610d04d6055bd4ac23d_crypt_and_hash.macho')) target: lief.MachO.Binary = fat.take(lief.MachO.CPU_TYPES.ARM64) # Shift content target.shift_linkedit(0x4000) output = f"{tmp_path}/{binary_name}.built" target.remove_signature() target.write(output) process_crypt_and_hash(output) if is_apple_m1(): chmod_exe(output) sign(output) with subprocess.Popen([output], universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc: stdout = proc.stdout.read() assert "CAMELLIA-256-CCM*-NO-TAG" in stdout assert "AES-128-CCM*-NO-TAG" in stdout
def run_program(path, args=None): if is_apple_m1(): sign(path) # Make sure the program has exec permission chmod_exe(path) dyld_check(path) env = os.environ env["DYLD_PRINT_APIS"] = "1" env["DYLD_PRINT_WARNINGS"] = "1" kwargs = { "universal_newlines": True, "stdout": subprocess.PIPE, "stderr": subprocess.STDOUT, "env": env, } prog_args = path if args is None else [path] + args with Popen(prog_args, **kwargs) as proc: proc.poll() print(f"{path} exited with {proc.returncode}") return proc.stdout.read()