Hola de nuevo.
Indagando encontré respuestas a las dudas que me surgieron en el mensaje anterior.
1. El código que cité arriba más bien era seudocódigo, el real conlleva complejidades adicionales pero por lo visto superables.
2. Efectivamente, el parámetro
lpParameter dado a la función CreateRemoteThread, debe ser una dirección de memoria válida para el proceso remoto. El truco para esto es obtener ésta con la función
VirtualAllocEx y escribir en ella el argumento con la función
WriteProcessMemory. ¡Por lo visto podemos escribir datos directamente en la memoria de otros procesos!
3. El ejemplo de
Rezmond que
enlacé arriba es sólo el segundo de al menos dos maneras que él plantea para lograr la inyección.
El método 1 no necesita que sea cargada ninguna DLL (aunque por otras razones sí emplea DLLs en el ejemplo que expone).
4. Sí es posible inyectar una rutina de nuestro programa en el espacio de memoria de otro proceso. Como puede apreciarse en el ejemplo del método 1, el truco es, también, utilizar las funciones
VirtualAllocEx y
WriteProcessMemory para copiar el código máquina de nuestra rutina en la memoria del proceso remoto, y luego usar CreateRemoteThread para crear un hilo dentro de tal proceso, empezando su ejecución en la dirección base del bloque de memoria donde fue copiado el código.
5. En ambos casos, Rezmond ejecuta inicialmente otra función de su autoría, llamada
GetDebugPrivs, la cual llama a otro par de funciones de la API de Windows para darle al programa algo así como
permisos de depuración. Desconozco en qué punto de sus ejemplos son necesarios tales permisos, pero parece ser algo importante para que aquellos funcionen.
Ahora sólo me quedaría la pregunta,
¿cómo saber cuántos bytes ocupa el código máquina de una función? En uno de los ejemplos vemos que se utilizó un valor de 1000 bytes (cómo diciendo
más vale que sobre a que falte), pero ¿podría, por ejemplo, servirnos la ventana
CPU del depurador (Ctrl+Alt+C) para calcular el tamaño de una rutina?
Espero con esto haber contribuido en algo para que
Rolando encuentre solución al problema que plantea. No quiere decir que me despido del tema, solo que esperaré sus comentarios para ver por dónde podemos seguir ayudando.
Saludos.
Al González.
P.D. Ahora veo que
Escafandra hizo un adelanto sobre esto que comenté. Interesante el uso de esas funciones.