elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:04  


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  [Source] Recorrer la IAT
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Source] Recorrer la IAT  (Leído 1,484 veces)
Thor


Desconectado Desconectado

Mensajes: 1.176


Ver Perfil
[Source] Recorrer la IAT
« en: 13 Abril 2008, 18:55 »

Código
#include <stdio.h>
#include <windows.h>
 
int main(int argc, char *argv[]){
if(argc != 2){
printf("Pasale un parametro !");
return EXIT_FAILURE;
}
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 EXIT_FAILURE;
}
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(int 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){
PIMAGE_IMPORT_BY_NAME pIIBN = (PIMAGE_IMPORT_BY_NAME)&buf[(unsigned long)pITD->u1.AddressOfData - pISH->VirtualAddress + pISH->PointerToRawData];
printf("  %s\n", pIIBN->Name);
pITD++;
}
pIID++;
}
}
}
}
free(buf);
CloseHandle(fichero);
return EXIT_SUCCESS;
}
Me hacía ilu hacerlo.
Con CreateMapFile creo que se puede hacer mas facil sin el lio de transformar RVA's en raw, offseets o como se diga.

Si veis algún fallo, casos en los que pueda fallar o tal encantado de que lo digais.


En línea
~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.983


Ver Perfil WWW
Re: [Source] Recorrer la IAT
« Respuesta #1 en: 13 Abril 2008, 21:38 »

Pues a mi me funciona con todos los ejecutables que he probado, esta muy bien ;) Lo chulo sería que sacase tb direcciones de apis que no estén cargadas en la iat que es lo gracioso para un virusillo xDD
Felicidades Thor ;)


En línea
Parcer0

Desconectado Desconectado

Mensajes: 8


NeoSecurityTeam


Ver Perfil WWW
Re: [Source] Recorrer la IAT
« Respuesta #2 en: 13 Abril 2008, 21:57 »

Yo tengo algo muy parecido al tu programa. Cual el tuyo es mas rapido =]. Me gusto mejor. Solo que para mucha gente no les va a compilar correcto por lo que en la linea 25;
for(int i = 0; i < pINH->FileHeader.NumberOfSections; i++){ tenes el 'int' dentro del for loop(Solo si compilas en .C...). Pero compila correcto. Y lo que E0N dijo de sacar las direcciones de las Apis eso es un dia buena para no tener que ir a buscarlas en otro ejecutable.

Thanks...!!
« Última modificación: 13 Abril 2008, 22:28 por Parcer0 » En línea

Tughack


Desconectado Desconectado

Mensajes: 490


Ver Perfil
Re: [Source] Recorrer la IAT
« Respuesta #3 en: 14 Abril 2008, 15:05 »

Pues a mi me funciona con todos los ejecutables que he probado, esta muy bien ;) Lo chulo sería que sacase tb direcciones de apis que no estén cargadas en la iat que es lo gracioso para un virusillo xDD
Felicidades Thor ;)

Entonces no lo has probado con exes en vb ^^

Pero funciona con los demas.

Saludos
En línea
Thor


Desconectado Desconectado

Mensajes: 1.176


Ver Perfil
Re: [Source] Recorrer la IAT
« Respuesta #4 en: 14 Abril 2008, 16:32 »

Gracias por avisar Tughack fallaba cuando alguna función era importada por su número, ordinal, en vez de por su nombre.
Citar
If set, the bottom 31 bits (or 63 bits for a 64-bit executable) is treated as an ordinal value. If the high bit isn't set, the IMAGE_THUNK_ DATA value is an RVA to the IMAGE_IMPORT_BY_NAME.
Sustituir el while por este nuevo:
Código
					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++;
}
 
En línea
hijocker

Desconectado Desconectado

Mensajes: 44


Ver Perfil
Re: [Source] Recorrer la IAT
« Respuesta #5 en: 29 Junio 2008, 18:29 »

Hola a todos.

Pido disculpas por reabrir el tema tan tarde pero es que tengo un problema y no se como resolverlo. Agradeceria muchisimo cualquier ayuda.

Vereis he copiado el codigo tal cual y al compilarlo con el Dev C++ 4 me ha soltado algunos errores. Los he resuelto casi todos aunque no se el porque a mi me salen y al resto parece que no.

He tenido que cambiar los tipos byte por BYTE, he tenido que declarar la variable 'i' fuera del 'for', he tenido que añadir la cabecera stdlib por que me daba problemas con malloc y tambien he cambiado todos los EXIT_FAILURE y SUCCES por 0 y 1.

Hasta aqui todo bien, pero 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 y/o explicarme porque he tenido que retocar tantas cosas del programa??

Gracias
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recorrer ciertos elementos en JS
Desarrollo Web
Riki_89D 1 1,288 Último mensaje 10 Enero 2011, 20:09
por Nakp
Recorrer dataGrid
.NET
proteus8 6 1,543 Último mensaje 25 Febrero 2011, 16:00
por .::IT::.
Recorrer Winsock
Programación Visual Basic
Stelio Kontos 1 411 Último mensaje 24 Marzo 2011, 13:53
por skyweb07
recorrer una pagina en busca de emails
Dudas Generales
Kase 4 1,083 Último mensaje 15 Junio 2011, 01:53
por .:UND3R:.
Recorrer directorios y generar log (BATCH)
Scripting
TheTroyanDark 8 1,462 Último mensaje 30 Junio 2011, 01:39
por TheTroyanDark
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines