sin embargo respecto a la conversion a UCHAR la hago para que no me salgan bytes negativos de la forma de 0xFFFFFFAB como me ocurrio que luego generan error en la declaracion de la shellcode, de esta manera ahorro esos problemas con el casteo.
Puedes ahorrarte ese problema ya con declarar el buffer como PUCHAR en lugar de PCHAR...
Sin embargo la autentica duda es: si cojo una dll de un messagebox por ejemplo y paso todos sus byte a una shellcode e inyecto la shellcode ¿deberia de inyectarse la dll sin problemas no?. La dll que uso para la shellcode hace un messagebox y la he inyectado en procesos sin problemas pero a la hora de inyectarla como shellcode surgen los problemas y crashea el proceso objetivo
Cada archivo PE tiene al inicio la cabecera DOS, la cabecera PE, secciones de información extras, si es libería/driver o utiliza ASLR seguro tiene secciones de reubicaciones (.reloc), secciones de datos globales (.*data), secciones de importaciones y exportaciones (.import / .export si mal no recuerdo), secciones de código ejecutable (.text / .code , etc...) y algunas veces secciones de recursos.
Si lo que quieres hacer es pasar todo a una secuencia de bytes y enviarselos directamente a un programa y redireccionar un hilo de ejecución al primer byte estás frito, dado que no está apuntando a código real sino a información del archivo PE.
Cuando inyectas con otros métodos por ejemplo hilo remoto con LoadLibrary, el API de dicho proceso se encarga de cargar y verificar si es un archivo PE, procesar los datos, cargar módulos dependientes, reubicar los datos del código a ejecutarse en caso de que esté ocupado la mismas direcciones virtuales del proceso por otro módulo y capaz algo más que se me olvide de momento.
Conclusión tendrías que no solamente inyectar el código sino que además realizar las mismas tareas que el PELoader a mano desde otro proceso lo cuál se vuelve una tarea demasiado tediosa y mucho más si además tienes que cargar dependencias...
EDIT: Capaz te sirva (como una sugerencia de una flasheada que se me ocurrió recién
) crear un ejecutable normal sin ASLR, lo cuál te evitarías la tabla de reubicaciones, evitar objetos o variables globales para la secciones de datos (usando únicamente locales), evitar llamar a APIs del SO directamente para evitar la secciones de import creando tus propias GetProcAddress, GetModuleHandle y LoadLibrary (en internet hay info) si necesitas APIs. En lugar de recopilar todos los bytes del PE solo obtienes los de la sección/es ejecutable/s y el offset de tu función inicializadora (main), creando primero un
JUMP CALL al principio del payload hacia el main y luego metiendo todos los bytes recogidos de la/s sección/es ejecutable/s.
B#