Aquí tienes una versión expandida con más detalles sobre cómo afectan los cambios en los binarios y cómo solucionarlos en Windows, Linux y macOS.
Windows (PE - Portable Executable)
Relacionado: biblio. Herramientas. Lectura y escritura coordinada entre procesos sin kernel. Sistema de Gestion de la Seguridad de la Informacion. 2025 02 13 TPM UEFI y sistemas Anticheat.
El formato PE (Portable Executable) se usa en Windows para archivos EXE, DLL y SYS. Su cabecera incluye información crítica como el tamaño del binario y un checksum opcional.
¿Dónde se define el tamaño del binario?
SizeOfImage(Offset0x50en la cabecera PE/NT)- Define el tamaño total del binario en memoria.
- Si modificas el tamaño del binario pero no actualizas este valor, el sistema operativo puede rechazar la ejecución o producir errores en el mapeo de memoria.
SizeOfHeaders(Offset0x54)- Indica el tamaño de todas las cabeceras combinadas.
- Si el binario tiene nuevas secciones añadidas, esta sección debe actualizarse.
¿El PE usa checksum?
-
Sí, tiene un campo
CheckSum(Offset0x58). -
En la mayoría de los casos, Windows ignora este checksum, excepto en archivos de sistema críticos o controladores (
.sys). -
Si necesitas recalcularlo, puedes usar:
signtool /verify /dump binary.exeO herramientas como PEChecksum, PE-bear o LIEF.
¿Cómo solucionar problemas tras modificar un PE?
- Si solo cambias instrucciones del mismo tamaño, el binario debería seguir funcionando sin problemas.
- Si agregas código nuevo, debes:
- Buscar espacios libres en el binario (rellenos de
NOPs). - Añadir una nueva sección con herramientas como
PE-bear. - Actualizar
SizeOfImagesi el binario crece.
- Buscar espacios libres en el binario (rellenos de
- Si Windows bloquea el binario por el checksum, usa
LIEFpara recalcularlo.
Linux (ELF - Executable and Linkable Format)
El formato ELF se usa en Linux para binarios ejecutables, bibliotecas compartidas (.so) y módulos del kernel.
¿Dónde se define el tamaño del binario?
-
p_fileszyp_memszen la tabla de segmentos (Program Header)p_filesz: Tamaño en disco del segmento.p_memsz: Tamaño en memoria del segmento.- Si agregas código y no actualizas
p_filesz, la parte extra puede ser ignorada al cargar el binario.
-
e_shoffye_shentsize * e_shnume_shoff: Indica la posición de la tabla de secciones.e_shentsize * e_shnum: Define cuántas secciones tiene el ELF y su tamaño total.- Si modificas las secciones, estos valores deben actualizarse.
¿El ELF usa checksum?
- No tiene checksum obligatorio, pero algunas distribuciones usan
stripo.gnu_debuglinkpara detectar cambios. - En kernels o binarios protegidos, herramientas como SELinux o AppArmor pueden detectar modificaciones.
¿Cómo solucionar problemas tras modificar un ELF?
-
Si solo cambias bytes del mismo tamaño, no hay problema.
-
Si agregas código, debes:
- Modificar
p_fileszpara reflejar el nuevo tamaño. - Asegurar que las secciones tengan el tamaño adecuado en
e_shoff.
- Modificar
-
Para modificar ELF de forma segura, usa
readelfoelfedit:readelf -l binary elfedit --output-type binary
macOS (Mach-O)
El formato Mach-O se usa en macOS e iOS para ejecutables, bibliotecas (.dylib) y binarios del kernel.
¿Dónde se define el tamaño del binario?
__TEXTy__DATAen la Load Command- Estas secciones indican el tamaño del código y los datos en memoria.
- Si modificas el código, debes actualizar estos valores.
- LC_SEGMENT_64.nsects
- Define cuántas secciones tiene el binario.
- Si agregas código, debes modificar este valor.
¿El Mach-O usa checksum?
-
No tiene checksum obligatorio, pero requiere firma (
codesign). -
Si editas un binario sin actualizar la firma, macOS puede bloquear su ejecución con errores como:
code signature invalid
¿Cómo solucionar problemas tras modificar un Mach-O?
-
Si cambias instrucciones del mismo tamaño, no hay problema.
-
Si agregas código nuevo, debes:
- Ajustar
__TEXTy__DATA. - Modificar
LC_SEGMENT_64.nsectssi creaste una nueva sección.
- Ajustar
-
Si macOS bloquea el binario, puedes eliminar la firma con:
sudo codesign --remove-signature binary
Conclusión
Si modificas un binario, debes tener en cuenta:
- Windows (PE): Debes actualizar
SizeOfImagey, si es necesario, recalcular el checksum. - Linux (ELF): Si cambias el tamaño, modifica
p_fileszyp_memsz. - macOS (Mach-O): Actualiza
__TEXT,__DATAy elimina la firma si es necesario.
Si solo cambias bytes sin alterar el tamaño, el binario debería seguir funcionando. Pero si agregas código nuevo, necesitas ajustar la estructura para evitar fallos.