format pe console
include 'win32ax.inc'
.data
Espacio equ 13,10,0 ;Para pasar a una nueva linea.
RutaArchivo rb MAX_PATH ;Variable para guardar la ruta de el archivo
PunteroPEheader dd ? ; Puntero de el Pe header
Logo db ' ===================================',13,10 ; LOGO PRINCIPAL
db ' = PE visor by YST =',13,10
db ' ===================================',13,10,0
LogoGeneral db ' ===================================',13,10 ; LOGO GENERAL
db ' = General =',13,10
db ' ===================================',13,10,0
LogoSecciones db ' ===================================',13,10
db ' = Secciones =',13,10 ;LOGO DE INFO DE LAS SECCIONES
db ' ===================================',13,10,0
LogoExport db ' ===================================',13,10
db ' = Export data =',13,10 ;LOGO DE INFO DE el Export data
db ' ===================================',13,10,0
LogoImport db ' ===================================',13,10
db ' = Import data =',13,10 ;LOGO DE INFO DE el import data
db ' ===================================',13,10,0
FHandle dd ? ; MZ de el archivo
.code
start:
invoke system,"color 3" ;Ponemos el color de texto
invoke printf,Logo ;Imprimimos el logo
invoke printf,Espacio ;Ponemos dos nuevas lineas.
invoke printf,Espacio
invoke printf,"Inserte la ruta de el archivo a examinar:" ; Preguntamos el archivo
invoke printf,Espacio
invoke scanf,"%s",RutaArchivo ;Obtenemos la ruta de el archivo
invoke LoadLibrary,RutaArchivo ;Cargamos el archivo
.if eax = 0 ; Si hay error
invoke printf,"Hubo un error al cargar el archivo:" ;Mostramos el error .
invoke printf,RutaArchivo
invoke ExitProcess,0 ; Nos salimos.
.else ; De lo contrario
.if word[eax] = "MZ" ; Si los primeros 2 bytes son igual a MZ
mov [FHandle],eax ; Guardamos el MZ en FHandle
.else ; De lo contrario
invoke printf,"Ingrese un archivo valido." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif
add eax,dword[eax+03ch] ; Guardamos en eax la direccion de el PE header
.if word[eax] = "PE" ; Si los primeros 2 bytes son igual a PE
mov [PunteroPEheader],eax ; Guardamos el puntero de el PE header en PunteroPEheader
.else ; De lo contrario
invoke printf,"No se a detectado PE header." ;Mostramos el error .
invoke ExitProcess,0 ; Nos salimos.
.endif ; Terminamos los if
.endif
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoGeneral ;Imprimimos el logo de la informacion general.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
mov ebx,[FHandle]
mov ebx,dword[ebx+03ch]
invoke printf,"La posicion de el PE header es : 0x%x" ,ebx ;Mostramos la direccion de el PE header
invoke printf,Espacio ; Pasamos a la siguiente linea.
add ebx,[FHandle]; Le sumamos a la posicion de el PE header el MZ para pasar a el puntero de el PE header
invoke printf,"TimeDateStamp: 0x%x " ,dword[ebx+08h] ; Imprimimo el TimeDateStamp
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"SizeOfCode: 0x%x " ,dword[ebx+1ch] ; Imprimimo el SizeOfCode
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"AddressOfEntrPoint: 0x%x " ,dword[ebx+28h] ; Imprimimo el AddressOfEntrPoint
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"ImageBase: 0x%x " ,dword[ebx+34h] ; Imprimimo el ImageBase
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"SizeOfImage: 0x%x " ,dword[ebx+50h] ; Imprimimo el SizeOfImage
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"SizeOfHeaders: 0x%x " ,dword[ebx+54h] ; Imprimimo el SizeOfHeaders
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"CheckSum: 0x%x " ,dword[ebx+58h] ; Imprimimo el CheckSum
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"Subsystem: " ;Imprimimos el Subsystem
.if dword[ebx+5Ch] = 2h ;SI es GUI
invoke printf,"Windows GUI" ; Imprimimos Windows GUI
.else ; De lo contrario es CUI (Consola)
invoke printf,"Windows CUI" ; Imprimimos Windows CUI
.endif ;Terminamos el if
invoke printf,Espacio ; Pasamos a la siguiente linea.
stdcall EOFExtraDataExtract,[FHandle]
invoke printf,"Posicion de el EOF: 0x%x",eax ;Imprimimos la posicion de el EOF
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoSecciones ;Imprimimos el logo de la informacion de las secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
mov esi,[PunteroPEheader] ;Movemos el puntero de el PE Header a esi.
movzx ebx,word[esi+06h] ; Guardamos la cantidad de secciones en ebx.
invoke printf,"Numero de secciones: %d",ebx ;Imprimimos la cantidad de secciones.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
.bucleImprimeSecciones: ; Bucle que imprime secciones
dec ebx ;Les restamos uno a ebx
mov eax,28h ;Hacemos que eax sea igual a $28
mul ebx ;Multiplicamos ebx
add eax,0xf8 ;Le sumamos $F8 ( $F8 = START OF SECTION TABLE )
add eax,esi ;Le agregamos al resultado de la multiplicacion el puntero de el PE header
mov edi,eax ;Guardamos eax en edi
invoke printf,"Name: %s",edi ;Imprimimos el nombre de la sección.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,"virtual address: 0x%x",dword[edi+0ch] ;Imprimimos el virtual address
invoke printf,Espacio ; Pasamos a la siguiente linea
invoke printf,"VirtualSize: 0x%x",dword[edi+08h] ;Imprimimos el VirtualSize
invoke printf,Espacio ; Pasamos a la siguiente linea
invoke printf,"SizeOfRawData: 0x%x",dword[edi+10h] ; Imprimimos el SizeOfRawData
invoke printf,Espacio ; Pasamos a la siguiente linea
invoke printf,"pointerToRawData : 0x%x",dword[edi+14h] ;Imprimimos el pointerToRawData
invoke printf,Espacio ; Pasamos a la siguiente linea
invoke printf,"Characteristics: 0x%x",dword[edi+24h] ;Imprimimos las Characteristics
invoke printf,Espacio ; Pasamos a la siguiente linea
invoke printf,Espacio ; Pasamos a la siguiente linea
invoke printf,Espacio ; Pasamos a la siguiente linea
cmp ebx,0
jne .bucleImprimeSecciones ; Si no se an imprimido todas las secciones saltamos a lña etiqueta .bucleImprimeSecciones .
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,LogoExport ;Imprimimos el logo de la informacion de el export data.
invoke printf,Espacio ; Pasamos a la siguiente linea.
invoke printf,Espacio ; Pasamos a la siguiente linea.
.if dword[esi+078h] = 0 ; Si no hay export data
invoke printf,"[+]No se exporta ninguna funcion."
invoke printf,Espacio ; Pasamos a la siguiente linea.
.else
mov ebx,dword[esi+078h]
add ebx,[FHandle]
invoke printf,"Cantidad de funciones exportadas: %d",dword[ebx+18h] ;Imprimimo la cantidad de funciones exportadas.
invoke printf,Espacio ; Pasamos a la siguiente linea. +
mov edi,dword[ebx+20h] ;AddressOfNames
add edi,[FHandle]
mov ebx,dword[ebx+18h] ;Numero de exports
invoke printf,"Funciones exportadas: "
invoke printf,Espacio
.bucleExportData: ;Bucle para imprimir la export data
dec ebx
mov eax, [edi + ebx * 4]
add eax,[FHandle]
invoke printf,"[+]%s",eax
invoke printf,Espacio
cmp ebx,0
jne .bucleExportData ;Si no se an imprimido todas seguimos
.endif
invoke printf,LogoImport
invoke printf,Espacio
invoke printf,Espacio
mov eax,[PunteroPEheader]
.if dword[eax+80h] = NULL ;Si no importamos ninguna funcion.
invoke printf,"[+]No importa ninguna funcion."
.else;De lo contrario
stdcall Sacaimport,[FHandle]
.endif
invoke system,"pause"
invoke ExitProcess,0
proc EOFExtraDataExtract,FHandle ;Funcion para extraer el EOF
push esi ebx
mov eax,[FHandle]
mov esi,dword[eax+03ch] ;Offset to start of PE header
add esi,eax
movzx ebx, word[esi+06h] ;Number Of Sections
dec ebx
mov eax,28h
mul ebx
add esi,0xf8 ;START OF SECTION TABLE
add esi,eax
mov eax,dword[esi+10h] ;SizeOfRawData
add eax,dword[esi+14h] ;pointerToRawData
pop ebx esi
ret
endp
proc Sacaimport ,handle
locals
Export dd ?
endl
pushad
mov eax,[handle]
mov ebx,dword[eax+03ch]
add ebx,eax
mov ebx,dword[ebx+80h]
add ebx,eax
mov [Export],ebx
.buclelib:
mov ebx,[Export]
mov edi,dword[ebx+0ch]
cmp edi,0
je .salir
add edi,[handle]
invoke printf,"- Funciones de %s: ",edi
invoke printf,"%s",Espacio
xor esi,esi
mov esi,dword[ebx]
add esi,[handle]
mov edi,esi
xor ebx,ebx
.bucleapi:
xor esi,esi
mov esi,dword[edi+ebx]
cmp esi,0
je .otralib
add esi,[handle]
add esi,2h
invoke printf," [*]%s",esi
invoke printf,"%s",Espacio
add ebx,04h
jmp .bucleapi
.otralib:
add [Export] ,14h
jmp .buclelib
.salir:
popad
ret
endp
.end start
section '.reloc' fixups data discardable