LIEF/examples/python/elf_unstrip.py
Romain Thomas b94900ca7f Improve the ELF part of LIEF
Major changes (features):
  * Enable adding multiple sections/segments - Executable (PIE or not), Library
  * Enable adding multiple dynamic entries (DT_NEEDED, DT_INIT etc)
  * Enable adding multiple relocations
  * Enable adding multiple dynamic symbols
  * Enable segment replacement

Major changes (API):
  * Getters Binary::get_*name*() has been renamed to "name()"
  * Binary::add(const DynamicEntry& entry) - To add an entry in the dynamic table
  * Section& Binary::add(const Section& section, bool loaded = true) - To add a section(s)
  * Segment& Binary::add(const Segment& segment, uint64_t base = 0) - To add segments
  * Segment& replace(const Segment& new_segment, const Segment& original_segment, uint64_t base = 0)
  * Binary's last_offset_section(), last_offset_segment(), next_virtual_address()
    to have information about offset
  * Binary's add_library(), get_library(), has_library() to handle
    DT_NEEDED entries

Other changes:
  * Binary::insert_content() - Use add(const Section&) or add(const Segment&) instead
  * ELF's DataHandler has been cleaned
  * Through LIEF::Section one can look for integers, strings, data
    within the section (see LIEF::Section::search,
    LIEF::Section::search_all)
  * Through LIEF::Binary one can get *xref* of a number (or address)
    see LIEF::Binary::xref function
  * To access to the Abstract binary in Python, one can now use
    the 'abstract' attribute. (e.g. binary.abstract.header.is_32)

Resolve: #83
Resolve: #66
Resolve: #48
2017-09-02 08:54:54 +02:00

58 lines
1.5 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Description
# -----------
# In this example, we assume that we found
# the ``main`` function at address 0x402A00
# and we add a static symbol to the binary
# so that we can do:
#
# (gdb) break main
# Breakpoint 1 at 0x402a00
from lief import ELF
import sys
binary = ELF.parse(sys.argv[1])
symtab_section = ELF.Section()
symtab_section.name = ""
symtab_section.type = ELF.SECTION_TYPES.SYMTAB
symtab_section.entry_size = 0x18
symtab_section.alignment = 8
symtab_section.link = len(binary.sections) + 1
symtab_section.content = [0] * 100
symstr_section = ELF.Section()
symstr_section.name = ""
symstr_section.type = ELF.SECTION_TYPES.STRTAB
symstr_section.entry_size = 1
symstr_section.alignment = 1
symstr_section.content = [0] * 100
symtab_section = binary.add(symtab_section, loaded=False)
symstr_section = binary.add(symstr_section, loaded=False)
symbol = ELF.Symbol()
symbol.name = ""
symbol.type = ELF.SYMBOL_TYPES.NOTYPE
symbol.value = 0
symbol.binding = ELF.SYMBOL_BINDINGS.LOCAL
symbol.size = 0
symbol.shndx = 0
symbol = binary.add_static_symbol(symbol)
symbol = ELF.Symbol()
symbol.name = "main"
symbol.type = ELF.SYMBOL_TYPES.FUNC
symbol.value = 0x402A00
symbol.binding = ELF.SYMBOL_BINDINGS.LOCAL
symbol.shndx = 14
symbol = binary.add_static_symbol(symbol)
print(symbol)
binary.write(sys.argv[2])