Enhorabuena, me encantaría saber más acerca de como funciona, si puedes dar mas detalles/explicación.
Aunque también me inunda la gran duda.... ¿Vale para algo más que como experimento? Desconozco .NET pero dudo que sin usar punteros puedas hacer algo dentro de un proceso (Al menos de forma medianamente 'decente').
saludos!
Claro que si vale para algo bro, Ahora Puedes Inyectar tu código (.NET) , en un Proceso Legitimo, Muy Util para desarrollar malware.
Buen aporte. Aunque no lo probé (tan sólo porque actualmente ya no me llaman mucho la atención estos temas, no por desconfianza o algo por el estilo) sí le di un vistazo al código y es refrescante ver algo directo, claro y sin florituras innecesarias (que parece ser lo común en estos tiempos). Te comento un error:
char *Pathvar
= getenv("TEMP"); ...
DLLName = strcat(Pathvar
, DLLName
);
strcat modifica su primer parámetro, pero, dado que tú no reservaste la memoria a la que apunta, no es seguro hacerlo y de acuerdo a las reglas de C, es incorrecto (básicamente es como escribir más allá de los límites de un array). Como suele ser el caso con los bugs de punteros en C, es posible tener la suerte de que el programa funcione bien, pero no deja de ser un error esperando a manifestarse. Al margen de eso, las reglas del lenguaje expresamente prohíben modificar los datos del puntero devuelto por getenv. También aquí el resultado podría ser impredecible, por lo que es mejor corregirlo reservando (malloc) para Pathvar un bloque con el número de bytes suficientes para la ruta del directorio temporal más el nombre de la DLL más un byte adicional para el caracter nulo, y entonces sí, copiar getenv("TEMP") a Pathvar y luego concatenarle el nombre de la DLL.
Gracias Lo tomare en cuenta, apenas se lo basico de C/C++ , el Compañero
@BloodSharp , me guio como hacerlo.
También hay algunas maneras en que podrías ahorrarte la compilación. Esto a lo mejor ya lo sabes y decidiste compilar por alguna otra razón, pero si no es el caso, y lo haces sólo para que el stub pueda conocer los datos de la DLL de .NET (preprocesas el .c para sustituir los datos entre "$$" antes de la compilación, imagino), puedes distribuir (o incluir en tu EXE) solamente la DLL del stub ya compilada. Tu programa podría simplemente añadirle como recursos tanto la DLL de .NET como el nombre del entry point o cualquier otra cosa que necesites, mediante la familia de funciones *UpdateResource de la API de Windows o lo que proporcione .NET. El stub cargaría esos recursos y reservaría dinámicamente la memoria de rawData. O, sin recursos, tu ejecutable podría limitarse a escribir toda esa información (junto con offsets para encontrar los datos fácilmente) al final de la DLL del stub. En cualquier caso, ya con esa información el stub procedería a escribir los bytes en la DLL temporal, la cargaría, etc. tal como lo hace actualmente.
Claro Originalmente lo tenia asi, Pero
Por que tan oculto ? , Decidí que es mejor dejar el stub afuera, para que cualquiera pueda modificarlo a su antojo.
claro exepto las variables dentro de $$ , ya que serán sustituidas por la herramienta.
Ademas , un stub estático , sera muy propenso a ser detectado por los antivirus ser tachado a futuro como "Malware" .
Entonces es mejor dejar el stub Dinamico , para que cualquiera pueda cambiarlo a su gusto y despues lo compilo .
Gracias por Comentar, Me alegra ver nuevas ideas. si tienen alguna otra idea, porfavor escribanla.