Crear un PE Editor simple..

Iniciado por demoniox12, 27 Septiembre 2008, 20:57 PM

0 Miembros y 1 Visitante están viendo este tema.

demoniox12

#20
Cita de: E0N en  8 Octubre 2008, 18:53 PM
Pues yo si que no se como no pongas más código jajaja Prueba a hacerlo con el código en ensamblador que te e puesto a ver si también te falla o no, pero no debería. Si mañana saco un rato y no lo has solucionado te hago un ejemplo simple :P

He probado el code en ASM, en ImageSize agranda FF y en la ultima sección tambien agrande FF a RawSize, pero al archivo le agrega 2501 bytes de ceros o sea esos se ven como ExtraDat en el StudPE

Saludos! y agradeceria ese ejemplo simple =), te dejo el code que guarda por si no lo hiciste..

Código (vb) [Seleccionar]
    Open "C:\test.exe" For Binary Access Write As #1
        Put #1, , idh
        a = 0
        For e = Len(idh) To idh.e_lfanew - 1 'desde DOS Header hasta PE Header
        Put #1, , ByteArray(e)
        a = a + 1
        Next e
        tamaniosSecc = 0
        Put #1, , inh
        For i = 0 To UBound(ish)
        Put #1, , ish(i)
        tamaniosSecc = tamaniosSecc + Len(ish(i))
        Next i
        desde = Len(idh) + a + Len(inh) + tamaniosSecc
        For e = desde To UBound(ByteArray) 'desde final de ish hasta final archivo
        Put #1, , ByteArray(e)
        a = a + 1
        Next e
       
    Close #1
By Demoniox

malektaus27A

Este es un code para visualizar el formato pe (esta hecho todo en vb 6)
aqui esta el codigo:
https://foro.elhacker.net/programacion_vb/formato_portable_ejecutable-t197932.0.html

Se obtiene el manejador del archivo con CreateFileA
Se crea el objeto de mapeo con CreateFileMappingA
Se mapea en memoria con MapViewOfFile
el retorno de esta funcion, deja en el inicio del ejecutable
direccion inicio + IMAGE_DOS_HEADER.e_lfanew= situa al inicio de la cabecera nt
inicio cabecera nt + longuitud de la estructura (cabecera nt)= situa al inicio de la tabla de secciones
y de ahi depende que sección se quiera modificar.

por ejemplo para encontrar el punto de entrada de un api en una dll, seria hacer lo anterior, ir al directorio de exportaciones, luego buscar por el nombre en la tabla funciones exportadas por nombre, y obtener el numero de veces q se ha iterado hasta encontrarla, este numero multiplicarlo por 2 y buscar en la tabla de funciones exportadas por ordinal. el valor que se encuentra ahi multiplicarlo por 4 y buscar el la tabla de funciones exportadas por direcciones, el valor que se encuentra alli sumarle la imagen base y listo ese es el punto de entrada para la api algo parecido a lo que hace GetProcAdressA(se podria hacer lo mismo sin mapealo  pero se necesitaria que la dll ya estubiera en memoria y adicionalmente conocer la direccion base).

para escribir en el archivo se usa la api Writefile
BOOL WriteFile(
    HANDLE hFile,                    // manejador del archivo
    LPCVOID lpBuffer,                // dirección de los datos a escribir
    DWORD nNumberOfBytesToWrite,     // número de bytes a escribir
    LPDWORD lpNumberOfBytesWritten,  // en esta variable retorna el numero de bytes escritos
    LPOVERLAPPED lpOverlapped        // dirección de la estructura necesaria para I/O superpuestas normalmente se le pase un NULL
   );

pero especificamente, que es lo que parte del formato pe quieres modificar?.

demoniox12

quiero agrandar la ultima sección

Saludos! y muchas gracias =)!
By Demoniox