Cualquier lenguaje de programación que se precie, dispone de 'recursos' que precisamente lo que hacen es eso que reclamas, empaquetar en el ejecutable (o quizás en un fichero aparte), los recursos que el propio ejecutable pueda necesitar, desde iconos, imágenes, cadenas de texto, hasta fuentes, etc...
Si el lenguaje que acostumbras a usar, no dispusiera de ello, o bien quieres apañártelas por tu cuenta de forma independiente, la mejor forma es disponerlo es:
1 Generar el ejecutable y una vez hecho,
2 con otro programa (para ese reciso propósito), 'pegar detrás' los diferentes recursos que precises, al tiempo vas generando una estructura de datos con la info precisa, que es lo que se endosa al final del ejecutable... el ejecutable debe estar diseñado para leer de sí mismo, del final esa estructura, reconocerla y saber interpretar su contenido.
sea tu ejecutable esto: cvbbmtur834
sea que quieres añadir 3 imágenes, (imaginemos que fueran así de grandes-pequeñas en realidad): ert intghj poq245bmrt
sea que además quieres añadir un icono, por ejemplo: prty
sea además que guardas cierto contenido en texto, por ejemplo 74try5
sea que añades otras cosas, más... verás que es más de lo mismo.
Entonces te diseñas tu estructura:
enumeracion TiposDeRecursos
RECURSO_TEXTO = 0
RECURSO_ICONO = 1
RECURSO_IMAGEN = 2
...etc...
fin enumeracion
Estructura recursos
byte Tipo // como enumeracion TipoDerecursos
entero NumBytes
Fin estructura
Array de recursos rc(0 a 3 + 1 + 1 -1) //3 imagenes + 1 icono + 1 texto
Pegar detras del ejecutable: cvbbmtur834,ert,intghj,poq245bmrt,prty,74try5
// las comas se ponen solamente para que se vea claramente la separación.
El array tendrá estos datos:
Rc(0).Tipo = 2 // imagen 1
Rc(0).NumBytes= 3 // ert
Rc(1).Tipo = 2 // imagen 2
Rc(1).NumBytes= 6 // intghj
Rc(2).Tipo = 2 // imagen 3
Rc(2).NumBytes= 10 // poq245bmrt
Rc(3).Tipo = 1 // icono
Rc(4).NumBytes= 4 // prty
Rc(4).Tipo = 0 // texto
Rc(4).NumBytes= 6 // 74try5
Pegas ahora el array detrás de todo.
y de momento queda así:
cvbbmtur834ertintghjpoq245bmrtprty74try5,2,3,3,6,2,10,1,4,0,6
Nuevamente las comas solo tienen el propósito de aclaración y los valores numéricos aquí son textuales, lógicamente deberían ser valores de 1 o más bytes, aquí para explicar de forma clara con texto legible, algún valor tiene 1 o 2 caracteres.
Finalmente pegas el tamaño de elementos del array, que es: 5 (3 imágenes + 1 icono + 1 texto)
Y así tu ejecutable será finalmente esto:
cvbbmtur834ertintghjpoq245bmrtprty74try523362101406,5
Tu ejecutable deberá ser capaz de leer del final un entero que identifica el tamaño del array que irá desde 0 hasta n-1
A continuación deberá ser capaz de leer más atrás de esa última posición precisamente el contenido de ese array.
Y finalmente partiendo de los valores de ese array y los desplazamientos razonados, el recurso que interese...
Realmente toda esa operatoria es más sencilla y cómoda programarla sobre un fichero aparte que sobre el propio ejecutable (podría además escribirlo justo en orden inverso, primero la cantidad del array, luego el contenido del array y luego cada recurso (eso sí éstos en el mismo orden que allí).
Pero sería un fichero aparte, y si es imprescindible que deba ser sobre el propio ejecutable, esa es la solución. Solamente recuerda que el propio ejecutable debe ser capaz de reconocerlo.
Y que para evitar errores, añade un 'magic' al final del propio fichero... si aparece el 'magic' tiene recursos incrustados, si no se olvidó añadirlos o el ejecutable fue alterado-dañado.
El 'magic' es casi cualquier cosa que tu pretendas que sea como significativo de 'contiene recursos al final del ejecutable según tu formato descrito', lo ideal es usar 4-8 caracteres específicos, que ni por casualidad puedan ser parte del contenido volcado, por ejemplo podría ser el texto: RECURSOS, así tu ejecutable finalmente tendría el ejecutable, las 3 imágenes, 1 icono, 1 texto, el array de datos, el tamaño del array y el magic, y quedaría así al final:
cvbbmtur834ertintghjpoq245bmrtprty74try5233621014065RECURSOS