PDA

Ver la versión completa : Problema analizando la IAT de los ejecutables en Dev C++



hijocker
30-06-2008, 20:59
Hola a todos.

Tengo un problema y no se como resolverlo. Agradeceria muchisimo cualquier ayuda.

Vereis he copiado este codigo tal cual y al compilarlo con el Dev C++ 4 me ha soltado algunos errores. Los he resuelto casi todos, pero hay uno que se me resiste.

El codigo es el siguiente:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
int i;
if(argc != 2){
printf("Pasale un parametro !");
return 0;
}
HANDLE fichero = CreateFile((LPCTSTR)argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(fichero == INVALID_HANDLE_VALUE){
printf("Error abriendo el fichero");
return 0;
}
printf("IAT de %s\n", argv[1]);
DWORD size = GetFileSize(fichero, NULL);
BYTE *buf = (BYTE *)malloc(size);
DWORD bytesleidos;
ReadFile(fichero, buf, size, &bytesleidos, NULL);
if(size == bytesleidos){
PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)buf;
if(pIDH->e_magic == IMAGE_DOS_SIGNATURE){ //MZ
PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)&buf[pIDH->e_lfanew];
unsigned long ITdir = pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
PIMAGE_SECTION_HEADER pISH;
for(i = 0; i < pINH->FileHeader.NumberOfSections; i++){
pISH = (PIMAGE_SECTION_HEADER)&buf[pIDH->e_lfanew + sizeof(IMAGE_NT_HEADERS) + i*sizeof(IMAGE_SECTION_HEADER)];
if(pISH->VirtualAddress <= ITdir && pISH->VirtualAddress + pISH->SizeOfRawData > ITdir){
printf("Tabla IAT encontrada en sección: %s\n", pISH->Name);
break;
}
}
if(i != pINH->FileHeader.NumberOfSections){
printf("Inicio FisicalAddress de la IAT: 0x%08X\n", pISH->PointerToRawData + ITdir - pISH->VirtualAddress);
printf("Inicio VirtualAddress de la IAT: 0x%08X\n", pINH->OptionalHeader.ImageBase + ITdir);
PIMAGE_IMPORT_DESCRIPTOR pIID = (PIMAGE_IMPORT_DESCRIPTOR)&buf[ITdir - pISH->VirtualAddress + pISH->PointerToRawData];
while(pIID->Characteristics != 0){
printf("%s:\n", &buf[pIID->Name - pISH->VirtualAddress + pISH->PointerToRawData]);
PIMAGE_THUNK_DATA pITD = (PIMAGE_THUNK_DATA)&buf[pIID->OriginalFirstThunk - pISH->VirtualAddress + pISH->PointerToRawData];
while(pITD->u1.AddressOfData != NULL){
if((DWORD)pITD->u1.AddressOfData & 0x80000000)
printf(" Ord: %d\n", (DWORD)pITD->u1.AddressOfData & 0x7FFFFFFF);
else{
PIMAGE_IMPORT_BY_NAME pIIBN = (PIMAGE_IMPORT_BY_NAME)&buf[(DWORD)pITD->u1.AddressOfData - pISH->VirtualAddress + pISH->PointerToRawData];
printf(" %s\n", pIIBN->Name);
}
pITD++;
}
pIID++;
}
}
}
}
free(buf);
CloseHandle(fichero);
return 1;
}



Hay un error que no consigo resolver y me tiene loco. He buscado por internet pero no acabo de aclararme.

El error es el siguiente:

invalid types 'BYTE *[_IMAGE_THUNK_DATA *]' for array subscript

y me lo da en esta linea:

PIMAGE_THUNK_DATA pITD = (PIMAGE_THUNK_DATA)&buf[pIID->OriginalFirstThunk - pISH->VirtualAddress + pISH->PointerToRawData];

No entiendo muy bien que esta pasando, pero calculo que se trata de alguno de los parametros entre los corchetes del buf, pero ni idea.

Alguien puede ayudarme con este error.

Gracias

Marchi
21-07-2008, 07:47
Yo lo compile con el Dev-C++ (Mingw32 3.4.2) y no da ningun error, solo un warning pero no en esa linea, y ademas no tiene nada que ver con lo que te aparece. De hecho funciona aparentemente bien.

Ademas, sintacticamente parece correcto.


Precisá que compilador estas usando.


Saludos