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