• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ribamar

Programa para obter informação de um ficheiro obj

28 mensagens neste tópico

Boas.

Preciso fazer um programa que indique certos atributos (nome, dimensão, conteudo, simbolos definidos, etc) de um ficheiro objecto (COFF).

Já li este artigo:

http://msdn.microsoft.com/en-us/magazine/cc301805.aspx e este http://support.microsoft.com/default.aspx?scid=kb;en-us;q121460

mas continuo à deriva com td esta historia da organização e funcionamento de ficheiros PE e COFF.

alguma dica por onde começar? a ideia que tenho neste momento é que o ficheiro obj tem atributos, por exemplo Name, que eu terei de ler o ficheiro até encontrar esse atributo e depois ler e guardar o valor do atributo, mas a minha duvida prende-se como é que eu sei onde esta o nome, permissoes, simbolos, etc. Ainda não encontrei uma imagem ou diagrama que seja sucinto nessa representação dos dados do ficheiro obj.

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
The central location where the PE format (as well as COFF files) is described is WINNT.H. Within this header file, you'll find nearly every structure definition, enumeration, and #define needed to work with PE files or the equivalent structures in memory. Sure, there is documentation elsewhere. MSDN has the "Microsoft Portable Executable and Common Object File Format Specification," for instance (see the October 2001 MSDN CD under Specifications). But WINNT.H is the final word on what PE files look like.

http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

A minha sugestão é olhares para o WINNT.H e experimentar, experimentar, experimentar.

... google ...

Talvez a começar pela linha 2027.

http://source.winehq.org/source/include/winnt.h#L2027

Talvez amanhã consiga um bocadinho de tempo para umas experiências (só tenho PEs e COFFs no trabalho). Despertaste-me o interesse :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

continuo sem fazer minima ideia por onde começar e sem conseguir perceber como esta estruturado o ficheiro...

vou tentar googlar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal ninguem pode dar uma ajuda? Sera que eu tenho d ler o .obj em modo binario e procurar certos padroes de bits onde esta a informação que eu procuro dentro de cada file, sera por ai?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

programa que obtenha atributos de 1 ficheiro objecto, tais como Nome;

Dimensão; Conteúdo; Símbolos definidos; Símbolos referenciados; permissão de leitura; permissão de

escrita; alinhamento; tipo de conteúdo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

programa que obtenha atributos de 1 ficheiro objecto, tais como Nome;

Dimensão; Conteúdo; Símbolos definidos; Símbolos referenciados; permissão de leitura; permissão de

escrita; alinhamento; tipo de conteúdo.

http://osr507doc.sco.com/en/topics/COFF.html

Tens aí o formato do ficheiro. Agora é começar a desenvolver um parser.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado amigo vou estudar bem a estrutura do ficheiro em causa.

thanks again

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depois de ter lido muita documentação acerca da estrutura do ficheiro PE acho que a melhor maneira é usar a funcao fseek para obter os bytes que pretendo de um ficheiro obj.

Se alguem tiver uma ideia melhor sou td ouvidos :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depois de ter lido muita documentação acerca da estrutura do ficheiro PE acho que a melhor maneira é usar a funcao fseek para obter os bytes que pretendo de um ficheiro obj.

Se alguem tiver uma ideia melhor sou td ouvidos :)

Basicamente é isso que tens de fazer.

Ou então definir as estruturas em C sem alinhamento (1-byte packed) e usar o fread().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então definir as estruturas em C sem alinhamento (1-byte packed) e usar o fread().

dessa maneira n tou a ver cm haveria de fazer, o fread() copia um ficheiro inteiro para uma estrutura de dados, acho que ia ser mais complexo... :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

dessa maneira n tou a ver cm haveria de fazer, o fread() copia um ficheiro inteiro para uma estrutura de dados, acho que ia ser mais complexo... :/

Isto era no caso de quereres ler os campos todos do ficheiro para memória. Ainda por cima tens a papinha feita! Se fores ao site tens lá as estrutruras para C:

struct filehdr
{
unsigned short   f_magic;  /* magic number */
unsigned short   f_nscns;  /* number of section */
long f_timdat; /* time and date stamp */
long f_symptr; /* file ptr to symbol table */
long f_nsyms; /* number entries in the symbol table */
unsigned short f_opthdr; /* size of optional header */
unsigned short f_flags; /* flags */ 
}; 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

essa "papinha" so me vai ajudar a saber os campos das estruturas, eu tenho que sempre à unha ir procura-las dentro do file não é? Não é possivel invocar funções que ja existam que vao buscar os atributos, por exemplo, que estao descritos na struct filehdr que em cima mencionas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não li a estrutura do ficheiro com muita atenção, mas deve ter ponteiros para as outras estruturas. Não deves precisar de andar à procura.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa isso é brutal, mas nao faço a minima como se faz... isso ia-me poupar imenso tempo.

por exemplo, o prog q tenho d fazer é uma especia de versao mt reduzida do prog dumpfile, como estara esse prog implementado? não é open source pois n?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas basta ler o formato do ficheiro no link que te mandei, está lá tudo explicado.

A estrutura do ficheiro é tipo isto:

  • File header
  • Section 0
  • Section 1
  • Section n
  • Symbol table

Basicamente tens de começar por ler o header, verificar se o magic number é válido. Depois dependendo de quantos sectores existirem, vais lendo o header de cada sector e os respectivos conteúdos (o header de cada section tem ponteiros para o conteúdo). Depois no fim é leres o symbol table cujo ponteiro está no header do ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa isso é brutal, mas nao faço a minima como se faz... isso ia-me poupar imenso tempo.

por exemplo, o prog q tenho d fazer é uma especia de versao mt reduzida do prog dumpfile, como estara esse prog implementado? não é open source pois n?[\quote]

a' partida cada campo do ficheiro tem um offset no inicio para a estrutura correspondente... se for esse o caso e' so passar o valor do offset para o fseek e ler os dados a partir dai.

tnh um trb identico para fzr, vou começar ag a pesquisar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a' partida cada campo do ficheiro tem um offset no inicio para a estrutura correspondente... se for esse o caso e' so passar o valor do offset para o fseek e ler os dados a partir dai.

tnh um trb identico para fzr, vou começar ag a pesquisar...

Sim, lê os meus posts anteriores. Acho que explicam mais ou menos o que é preciso fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim e' o k tou a fzr ;)

ps: triton es o serpentinekavu do magic da ptnet ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim e' o k tou a fzr ;)

ps: triton es o serpentinekavu do magic da ptnet ?

Sou o triton no #p@p da PTnet. Se quiseres passa por lá para tirares dúvidas. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

de momento estou numa residencia onde os pcs nao teem permissao do administrador para instalar software, no fds tou em casa ja poderei aceder a' ptnet.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.

Voltei a pôr mãos à obra e desenvolvi um pouco das bases do programa para ler conteúdo de 1 file .obj.

Antes de mais quero dizer que fiquei com a noção muito importante de que se pode criar uma estrutura com base nos conhecimentos da estrutura de um ficheiro já existente (neste caso um .obj) e depois com o fread ler do ficheiro pa essa estrutura e depois muito facilmente aceder aos atributos desse ficheiro pelas simples invocação dos atributos da estrutura. Não tinha esta noção que acho importantíssima para manipulação de ficheiros, e a facilidade que com este método permite aceder ao conteúdo de um ficheiro e obter informação deste.

Deixo aqui o código que neste momento permite guardar numa estrutura o header de um ficheiro .obj e o primeira section header:

#include  <stdio.h>

typedef struct _coofHeader{
unsigned short machine;
unsigned short numberOfSections;
unsigned int timeDateStamp;
unsigned int pointerToSymbolTabel;
unsigned int numberOfSymbols;
unsigned short sizeOfOptionalHeader;
unsigned short characteristics;
} coofHeader;

typedef struct _coofSectionHeader{
unsigned char name[8];
unsigned int virtualSize;
unsigned int virtualAddress;
unsigned int sizeOfRawData;
unsigned int pointerToRawData;
unsigned int pointerToRelocations;
unsigned int pointerToLineNumbers;
unsigned short numberOfRelocations;
unsigned short numberOfLineNumbers; 
unsigned int characteristics;
} coofSectionHeader;

int main(void){
FILE* file = fopen("exe9.obj","r");
coofHeader fileHeader;
int numberOfSections = 0;
int sizeOfRawData = 0;
coofSectionHeader fileSection;
fread(&fileHeader, sizeof(coofHeader), 1, file);
numberOfSections = fileHeader.numberOfSections;
fread(&fileSection, sizeof(coofSectionHeader), 1, file);
//while(numberOfSections >= 0){
	--numberOfSections;
	sizeOfRawData = fileSection.sizeOfRawData;
	fseek(file, fileSection.pointerToRawData, SEEK_SET);
	while(sizeOfRawData >= 0){
		printf("%X",getc(file));
		sizeOfRawData--;
	}
       //}
fclose(file);
}

Agora a minha duvida é a seguinte: devo guardar em memoria, num array de structs do tipo coofSectionHeader as varias sections headers de um ficheiro e so depois or sobre elas e imprimir a informação pretendida, ou passo a 1ª section header pa struct e imprimo, passo a segunda e imprimo, e por ai fora?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais quero dizer que fiquei com a noção muito importante de que se pode criar uma estrutura com base nos conhecimentos da estrutura de um ficheiro já existente (neste caso um .obj) e depois com o fread ler do ficheiro pa essa estrutura e depois muito facilmente aceder aos atributos desse ficheiro pelas simples invocação dos atributos da estrutura. Não tinha esta noção que acho importantíssima para manipulação de ficheiros, e a facilidade que com este método permite aceder ao conteúdo de um ficheiro e obter informação deste.

Isso é o método mais comum para ler informações de ficheiros. Nem estou a ver nenhuma outra maneira prática de o fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois mas o que eu estava habituado a fazer era ler do ficheiro directamente para o stdout.

Nos ficheiros de texto serve e chega, agora para outro tipo de ficheiros ler primeiro para uma estrutura é mt melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora