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

#10
Hola!! una duda.. que hay que modificar del PE Header para que los datos que se le agregan al final de un exe sean parte de la info del exe, o sea como si fuera parte de la ultima sección... intente modificar unicamente el rawsize de la ultima sección y el imagesize pero me dejo el exe inservible..

Saludos!

PD: yo lo que quiero hacer es meter un exe cifrado dentro del stub, entonces yo lo que hago es:

abro el stub, obtengo rawsize, virtualsize y size of image, luego abro el archivo a cifrar y obtengo los mismos datos entonces sumo el rawsize del stub + el rawsize del archivo y lo pongo como rawsize del archivo final, con virtualsize lo aumento en 1000 hasta que virtualsize < rawsize, y luego con size of image sumo las 2 size of image y se lo pongo al archivo final y listo
pero me deja el archivo inservible..
By Demoniox

~~

Hice hace algún tiempo un código en asm para ampliar la última sección, si lo quieres pídelo. El mecanismo es este:

  • Le sumas al raw size  de  la  última  sección el tamaño que quieres ampliarla.
  • Le sumas al virtual size el SectionAlignment.
  • Le sumas al  SizeOfImage  el tamaño que quieres ampliar la  última sección y guardas el archivo.

    Salu2

demoniox12

#12
Cita de: E0N en  7 Octubre 2008, 15:48 PM
Hice hace algún tiempo un código en asm para ampliar la última sección, si lo quieres pídelo. El mecanismo es este:

  • Le sumas al raw size  de  la  última  sección el tamaño que quieres ampliarla.
  • Le sumas al virtual size el SectionAlignment.
  • Le sumas al  SizeOfImage  el tamaño que quieres ampliar la  última sección y guardas el archivo.

    Salu2
a ver, adaptando eso a mi necesid, al rawsize del archivo final le sumo el filelen() (2,56 bytes -> 1 del pe header no? o bien le sumo el imagesize del archivo a cifrar?) del archivo a cifrar, al virtual size del archivo final le sumo el section alignment del archivo a cifrar y en sizeofimage, tambien le sumo la misma cantidad que a rawsize.
asi?

Saludos! y muchas gracias!

PD: seria bueno ver el ejemplo que comentas.
By Demoniox

~~

A ver, para aclarar conceptos le llamaremos "stub" al stub del crypter y "archivo a cifrar" al archivo que quieres meter a continuación del stub cifrado y listo para que el stub lo desencripte y ejecute ok?

(1) Al raw size de la última sección del stub le sumas el tamaño del archivo a cifrar.
(2) Al virtual size de la última sección del stub le sumas el Section Aligement.
(3) Al size of image del stub le sumas el tamaño del archivo a cifrar.
(4) Pones el archivo a cifrar a continuación del stub y todo listo.

Así tiene que funcionarte perfectamente, luego solo te queda extraer el archivo a cifrar del stub, que puedes saber donde empieza calculando cuanto ocupa el stub a partir del PE, te dejo una función: (No uso las estructuras en esta función por que me la pidieron hace tiempo y no me apetecia postear todo el módulo, pero la puedes adaptar fácilmente si quieres ;))

Código (vb) [Seleccionar]
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dst As Any, Src As Any, ByVal cLen As Long)

Private Sub Form_Load()
    MsgBox "El EOF está en el byte: " & GetEOF("C:\file.exe")
    End
End Sub

Function GetEOF(Path As String) As Long

    Dim ByteArray() As Byte
    Dim PE As Long, NumberOfSections As Integer
    Dim BeginLastSection As Long
    Dim RawSize As Long, RawOffset As Long
       
    Open Path For Binary As #1
        ReDim ByteArray(LOF(1) - 1)
        Get #1, , ByteArray
    Close #1
   
    Call CopyMemory(PE, ByteArray(&H3C), 4)
    Call CopyMemory(NumberOfSections, ByteArray(PE + &H6), 2)
    BeginLastSection = PE + &HF8 + ((NumberOfSections - 1) * &H28)
    Call CopyMemory(RawSize, ByteArray(BeginLastSection + 16), 4)
    Call CopyMemory(RawOffset, ByteArray(BeginLastSection + 20), 4)
    GetEOF = RawSize + RawOffset
   
End Function


En cuanto al ejemplo en ASM que comentaba: (FASM)

Código (asm) [Seleccionar]

; ****************************************************************************
; ***  Código que amplía 0xFF bytes la última sección de un ejecutable.    ***
; ***                                                                      ***
; ***    -> Le sumamos al raw size  de  la  última  sección el tamaño que  ***
; ***       queremos ampliarla.                                            ***
; ***    -> Le sumamos al virtual size el SectionAlignment.                ***
; ***    -> Le sumamos al  SizeOfImage  el tamaño que queremos ampliar la  ***
; ***       última sección y guardamos el archivo.                         ***
; ****************************************************************************

include 'H:\archivos de programa\fasm\include\win32ax.inc'

.code
start:
; Usamos la pila para gurdar nuestras variables
sub esp, 20
; [esp+0]  -> El handle del archivo
; [esp+4]  -> Handle del archivo mapeado
; [esp+8]  -> Lo que sería el "ImageBase" del archivo proyectado
; [esp+12] -> SectionAligement
; [esp+16] -> NumberOfSections
; Sobran dos bytes por el alineamiento de la pila

; Mapeamos el archivo en memoria con 40 bytes de más
invoke CreateFile, ruta, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_WRITE+FILE_SHARE_READ, 0, OPEN_EXISTING, 0,0
mov dword[esp], eax
invoke GetFileSize, eax, 0
add eax, 0x2600 ; <--- Tamaño a ampliar
mov esi, dword[esp]
invoke CreateFileMapping, esi, 0, PAGE_READWRITE, 0, eax, 0
mov [esp+4], eax
invoke MapViewOfFile, eax, FILE_MAP_ALL_ACCESS, 0, 0, 0
mov [esp+8], eax

; Obtenemos los datos necesarios del PE
mov ebx, dword[eax+0x3C] ; EBX = Signature
mov edi, dword[eax+0x3C] ; Guardamos también en edi la posición del signature para usarla luego
add ebx, eax
add edi, eax

add dword[ebx+0x50], 0xFF ; Le sumamos al SizeOfImage el tamaño a ampliar
mov eax, dword[ebx+0x38]
mov [esp+12], eax
mov ax, word[ebx+0x6]
mov [esp+16], ax

; Obtenemos los datos necesarios de la última sección
mov ax, word[esp+16]
dec eax
mov edx, 0x28
mul edx
add edi, eax
add edi, 248 ; 248 = Tamaño OptionalHeader

add dword[edi+16], 0xFF ; Le sumamos al RawSize el tamaño a ampliar
mov eax, dword[esp+12]
add dword[edi+8], eax ; Le sumamos al VirtualSize el SectionAlignment


; Liberamos memoria, cuadramos la pila y salimos
mov esi, esp
invoke CloseHandle, dword[esi]
invoke CloseHandle, dword[esi+4]
invoke UnmapViewOfFile, dword[esi+8]
add esp, 20
invoke ExitProcess, 0



ruta db 'H:\h.exe', 0 ; La ruta del archivo a tratar

.end start


Salu2

demoniox12

#14
Cita de: E0N en  8 Octubre 2008, 17:07 PM

(1) Al raw size de la última sección del stub le sumas el tamaño del archivo a cifrar.
(2) Al virtual size de la última sección del stub le sumas el Section Aligement.
(3) Al size of image del stub le sumas el tamaño del archivo a cifrar.
(4) Pones el archivo a cifrar a continuación del stub y todo listo.


Muchas gracias, una ultima cosa que no me quedo en claro, yo obtengo el rawsize de la ultima sección del stub, lo paso a hex, y de hexadecimal a decimal y ahi le sumo el filelen() del archivo a cifrar?

Saludos!
By Demoniox

~~

#15
Lo que tienes que hacer es sumar o en hexadecimal los dos o en decimal los dos (VB te devuelve los números en decimal, así que súmalos así) recuerda que decimal y hexadecimal no son más que formas de representar números binarios (ceros y unos) :P

demoniox12

Código (vb) [Seleccionar]
    RellenarPE (App.Path & "\Stub.exe") 'Relleno PE Stub
    rawoffsetS = Hex(ish(UBound(ish)).PointerToRawData)  'raw offset +
    rawsizeS = Hex(ish(UBound(ish)).SizeOfRawData)  'raw size = punto que empieza el otro codigo (finaliza el exe)
    virtualsizeS = Hex(ish(UBound(ish)).VirtualSize)
    sizeofimageS = Hex(inh.OptionalHeader.SizeOfImage)
    sectionalignmentS = Hex(inh.OptionalHeader.SectionAlignment)
 
    RellenarPE (Text1.Text) 'Relleno Archivo
    sizeofimageA = Hex(inh.OptionalHeader.SizeOfImage)
   
    tamArchivo = FileLen(Text1.Text)
    rawsizeM = tamArchivo + HexToDec(rawsizeS)
    sizeofimageM = tamArchivo + HexToDec(sizeofimageS)
    virtualsizeM = HexToDec(virtualsizeS) + HexToDec(sectionalignmentS)


    ish(UBound(ish)).SizeOfRawData = CLng("&H" & DecToHex(rawsizeM))
    ish(UBound(ish)).VirtualSize = CLng("&H" & DecToHex(virtualsizeM))
    inh.OptionalHeader.SizeOfImage = CLng("&H" & DecToHex(sizeofimageM))


compruebo con el StudPE y se modifican todo bien y el peso queda todo bien pero me sigue dando error win32 aplicacion no valida
By Demoniox

~~

Lo primero, por que obtienes los valores en hexadecimal y luego los pasas a decimal con HexToDec para sumarlos??  :xD :xD

Lo segundo, pones el archivo a cifrar a continuación del stub o en su caso rellenas los bytes necesarios?? Por que si no te va a dar error xD

Y bueno no se que más decirte, por el trozo de código que pones parece que está bien, haz pruebas con el código en ensamblador que te he pasado (espero que no se me haya olvidado ningún paso) por que tiene que funcionar ;)

demoniox12

Cita de: E0N en  8 Octubre 2008, 18:19 PM
Lo primero, por que obtienes los valores en hexadecimal y luego los pasas a decimal con HexToDec para sumarlos??  :xD :xD

Lo segundo, pones el archivo a cifrar a continuación del stub o en su caso rellenas los bytes necesarios?? Por que si no te va a dar error xD

Y bueno no se que más decirte, por el trozo de código que pones parece que está bien, haz pruebas con el código en ensamblador que te he pasado (espero que no se me haya olvidado ningún paso) por que tiene que funcionar ;)

jeje bueno pekeño error xD pero igual, si, relleno los bytes necesarios, hago los calculos luego de que ya tengo el archivo final (todo cifrado y el stub) y le cambio el PE Header, he probado restandole 1 byte y con el StudPE me aparece extra dat, sin restarle no aparece o sea que si lo toma todo como la ultima sección. as que no se :S

Saludos!
By Demoniox

~~

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