#!/usr/bin/env python # -*- coding: utf-8 -*- # In this example, we replace all statics symbols in the .symtab # with a random name. # # Example: # # >>> readelf -s ./hello_c # # 28: 0600700 0 OBJECT LOCAL DEFAULT 19 __JCR_LIST__ # 29: 0400420 0 FUNC LOCAL DEFAULT 12 deregister_tm_clones # 30: 0400460 0 FUNC LOCAL DEFAULT 12 register_tm_clones # 31: 04004a0 0 FUNC LOCAL DEFAULT 12 __do_global_dtors_aux # 32: 0600920 1 OBJECT LOCAL DEFAULT 24 completed.6940 # 33: 06006f8 0 OBJECT LOCAL DEFAULT 18 __do_global_dtors_aux_fin # ... # # >>> python elf_symbol_obfuscation ./hello_c ./hello_c.obf # # >>> readelf -s ./hello_c.obf # # 28: 0600700 0 OBJECT LOCAL DEFAULT 19 xnsffdfsryna # 29: 0400420 0 FUNC LOCAL DEFAULT 12 wsadqwrubbmdugrxzwiv # 30: 0400460 0 FUNC LOCAL DEFAULT 12 wrgeecrckeskyishte # 31: 04004a0 0 FUNC LOCAL DEFAULT 12 pqhfpptwtqzuiefrwnwdk # 32: 0600920 1 OBJECT LOCAL DEFAULT 24 vwevxfvdmcrjdv # 33: 06006f8 0 OBJECT LOCAL DEFAULT 18 rksefyibghsyhbbnfikknpvzc import lief import sys import random, string def randomword(length): return ''.join(random.choice(string.ascii_lowercase) for i in range(length)) def randomize(binary, output): symbols = binary.static_symbols if len(symbols) == 0: print("No symbols") return for symbol in symbols: symbol.name = randomword(len(symbol.name)) binary.write(output) if __name__ == '__main__': if len(sys.argv) != 3: print("Usage:", sys.argv[0], " ") sys.exit(-1) binary = lief.parse(sys.argv[1]) randomize(binary, sys.argv[2])