File ELF tidak hanya dapat dieksekusi, tetapi cara yang sangat nyaman untuk menggambarkan tata letak program dalam memori. Tujuan asli dari proyek ini adalah untuk memungkinkan seseorang untuk membuat file ELF yang menjelaskan pemetaan memori yang digunakan untuk program tertanam. Terutama berguna untuk digunakan bersama dengan alat analisis lainnya, seperti: IDA/GHIDRA/dll ... Mereka dapat memiliki semua informasi yang diinginkan tanpa perlu membuka hanya file .bin yang biasa dan menjalankan beberapa skrip Idapython (saya muak Load additional binary file... opsi).
Permintaan tarik tentu saja lebih dari disambut?
Gunakan pip :
python3 -m pip install simpleelfAtau klon diri dan bangun:
git clone [email protected]:doronz88/simpleelf.git
cd simpleelf
python -m pip install -e . -USekarang Anda bisa mengimporf sederhana dan mulai bermain dengannya.
Parsing mudah menggunakan ElfStruct . Cobalah:
from simpleelf . elf_structs import ElfStructs
ElfStructs ( '<' ). Elf32 . parse ( elf32_buffer ) # outputs a constucts' container
ElfStructs ( '<' ). Elf64 . parse ( elf64_buffer ) # outputs a constucts' container Bangunan mudah menggunakan ElfBuilder . Cobalah:
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 ()