Problema analizando la IAT en C++

jose maria
30 de Junio del 2008
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 %sn", 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: %sn", pISH->Name);
break;
}
}
if(i != pINH->FileHeader.NumberOfSections){
printf("Inicio FisicalAddress de la IAT: 0x%08Xn", pISH->PointerToRawData + ITdir - pISH->VirtualAddress);
printf("Inicio VirtualAddress de la IAT: 0x%08Xn", 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: %dn", (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(" %sn", 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