Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: Binary_Death en 29 Agosto 2013, 20:40 pm



Título: Problema al desplazar el EOF
Publicado por: Binary_Death en 29 Agosto 2013, 20:40 pm
Bueno... estoy haciendo un crypter, como dije en mi anterior post, e intento añadir una sección al ejecutable para añadir una rutina que añadiré como una TLS Callback function.

Al crear una nueva sección, hago que apunte al final del ejecutable indicado por el PointerToRawData+SizeOfRawData de la última sección, ese será el valor del PointerToRawData de mi nueva sección. Claro que, ahí puede haber un EOF Data, así que miramos si lo hay y si lo hay lo copiamos tantos bytes más abajo como indique el SizeOfRawData de mi nueva sección. ¿Hasta aquí va bien?

De acuerdo, pues aquí dejo un fragmento de código en ensamblador que hace lo dicho:

Código:
mov      esi, [ebx].PointerToRawData
               add      esi, [ebx].SizeOfRawData
               mov      [eax].PointerToRawData, esi
              
    
               .IF      dwFileSize > esi
                    push    eax
                    mov     ecx, dwFileSize
                    sub     ecx, esi
                    mov     dwEOFDataSize,ecx
                    add     esi,lpMappedView
                    mov     lpEOFData,esi
                    
                    invoke  GlobalAlloc,GPTR,dwEOFDataSize
                    mov     lpEOFBuffer, eax
                    invoke  RtlMoveMemory,eax,lpEOFData,dwEOFDataSize
                    pop     eax
                    push    eax
                    mov     ecx,[eax].SizeOfRawData
                    add     dword ptr[lpEOFData],ecx
                    invoke  RtlMoveMemory,lpEOFData,lpEOFBuffer,dwEOFDataSize
                    pop     eax    
               .ENDIF


EAX y EBX son punteros a estructuras IMAGE_SECTION_HEADER

EAX apunta a la estructura de la nueva sección, la sección que estamos creando.
EBX apunta a la estructura de la anterior sección, lo que por el momento es la última, la que tiene un PointerToRawOffset mayor.

Por lo demás, el dwFileSize es el tamaño total del fichero obtenido con GetFileSize() y lpMappedFile es la dirección de inicio de la vista del fichero de mapeo.

EDIT:

Solucionado. Da una rabia estarte horas por tonterías...