Problema al desplazar el EOF

Iniciado por Binary_Death, 29 Agosto 2013, 20:40 PM

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

Binary_Death

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:


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...