c0defellas/pybin — pull request #1 by tiago4orion (2014-10-14 13:17:33+00:00)
Title: Usar struct do Python para mapear a estrutura do ELF/PE em objetos

Pessoal,

Dei uma olhada no código, e acho que a maneira que estão acessando as informações do binário não é das melhores. Acredito que a maneira mais eficiente e portável seja usando o pacote "struct" do python e fazendo quase da mesma maneira que fazemos em C:

Elf32_Ehdr *ehdr = data;
ehdr->e_ident;
ehdr->e_phoff;
etc.

Para fazer isso em python precisamos definir o formato do pacote que estamos recebendo, no caso do Elf32_Ehdr seria:

Elf32_Ehdr = "<16sHHIIIIIHHHHHH"

O primeiro caracter especifica o byte-order, nesse caso '<' é Little-Endian, o resto é o tamanho dos bytes conforme devem ser desempacotados.
Documentação completa pode ser vista abaixo:
https://docs.python.org/2/library/struct.html#format-characters

A classe para mapear todo o Elf32_Ehdr ficaria somente como abaixo:

import struct

class Ehdr32(object):
"""
ELF header.
"""

Elf32_Ehdr = "<16sHHIIIIIHHHHHH"

def __init__(self, binary):
self.binary = binary

(self.e_ident, self.e_type, self.e_machine, self.e_version, self.e_entry, self.e_phoff, self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx) = struct.unpack(
self.Elf32_Ehdr, self.binary[0:struct.calcsize(self.Elf32_Ehdr)])

ehdr = Ehdr32(binary_data)

print ehdr.e_ident
print ehdr.e_type
print ehdr.e_machine
etc....

Não precisam aceitar o pull-request, é apenas para mostrar outra forma de se fazer a mesma coisa, ao meu ver mais eficiente.

Abraços e bom trabalho Fellas