El archivo ELF no es solo un ejecutable, sino una forma muy conveniente de describir el diseño de un programa en la memoria. La intención original de este proyecto es permitir que un individuo cree un archivo ELF que describe la asignación de memoria utilizada para un programa integrado. Especialmente útil para usar junto con otras herramientas de análisis, tales como: Ida/Ghidra/etc ... Pueden tener toda su información deseada sin la necesidad de abrir solo un archivo .bin ordinario y ejecutar varios scripts de Idapython (estoy harto de Load additional binary file... opción).
¿Las solicitudes de extracción son, por supuesto, más que bienvenidas?
Usa pip :
python3 -m pip install simpleelfO clonar tú mismo y construir:
git clone [email protected]:doronz88/simpleelf.git
cd simpleelf
python -m pip install -e . -UAhora puedes importar simple y comenzar a jugar con él.
El análisis es fácil de usar ElfStruct . Pruébalo:
from simpleelf . elf_structs import ElfStructs
ElfStructs ( '<' ). Elf32 . parse ( elf32_buffer ) # outputs a constucts' container
ElfStructs ( '<' ). Elf64 . parse ( elf64_buffer ) # outputs a constucts' container El edificio es fácil con ElfBuilder . Pruébalo:
from simpleelf . elf_builder import ElfBuilder
from simpleelf import elf_consts
# can also be used with ELFCLASS64 to create 64bit layouts
e = ElfBuilder ( elf_consts . ELFCLASS32 )
e . set_endianity ( '<' )
e . set_machine ( elf_consts . EM_ARM )
code = b'CODECODE'
# add a segment
text_address = 0x1234
text_buffer = b'cybercyberbitimbitim' + code
e . add_segment ( text_address , text_buffer ,
elf_consts . PF_R | elf_consts . PF_W | elf_consts . PF_X )
# add a second segment
e . add_segment ( 0x88771122 , b'data in 0x88771122' ,
elf_consts . PF_R | elf_consts . PF_W | elf_consts . PF_X )
# add a code section inside the first segment
code_address = text_address + text_buffer . find ( code ) # point at CODECODE
code_size = len ( code )
e . add_code_section ( code_address , code_size , name = '.text' )
# set entry point
e . set_entry ( code_address )
# add .bss section. not requiring a loaded segment from
# file
bss_address = 0x5678
bss_size = 0x200
e . add_empty_data_section ( bss_address , bss_size , name = '.bss' )
# get raw elf
e . build ()