2010-10-24 22 views
5

Quiero aprender a leer la memoria de otros procesos y hacer que mi programa llame a las otras funciones de procesos y qué no con mis propios parámetros y esas cosas. Lo busqué en Google y parece que necesitas usar cosas como ReadProcessMemory pero no he podido encontrar ningún tutorial bueno que explique cómo usarlos. ¿Podría alguien señalarme en la dirección correcta para aprender cosas como esta? Quiero hacerlo en C++ (o java si es posible) en Windows (7 y 64 bits si eso importa).¿Cómo se puede acceder a la memoria de otro proceso y llamar a sus funciones?

Además, sé que esto suena subjetivo y podría utilizarse con fines maliciosos, pero le garantizo que no utilizaré ningún conocimiento obtenido de esto por ningún motivo perjudicial. Simplemente quiero aprender esto por diversión y para enseñarme algo nuevo.

+0

¿Qué es exactamente estás tratando de hacer * * con ReadProcessMemory? Tu pregunta no es lo suficientemente específica. – wj32

+1

Bueno, estaba buscando a alguien que sugiriera un tutorial sobre cómo usar cosas como ReadProcessMemory y otras cosas. Realmente no tengo nada específico en mente en este momento. Lo que básicamente quiero hacer es aprender a 'hackear' mis propios programas. Quiero hacer algo como crear un programa que le pida al usuario que ingrese la cadena de arriba para continuar. Luego quiero hacer un 'bot' que leerá la memoria de procesos para ver qué es la cadena, luego ingréselo. Solo quiero jugar con cosas como esas, pero no sé por dónde empezar. – krej

Respuesta

5

No puede llamar directamente a funciones en otros procesos, porque su proceso y el otro proceso tienen espacios de direcciones diferentes. Una forma de evitar esto es crear un subproceso remoto en el proceso (utilizando CreateRemoteThread o RtlCreateUserThread), pero eso solo le permite pasar un parámetro a la función. Podría intentar crear un hilo remoto, escribir los parámetros en su pila y cambiar sus registros usando SetThreadContext. Otra forma es inyectar su propia DLL que llama a la función.

Otro problema es localizar la función para llamar. Probablemente necesite cargar símbolos para EXEs o DLL donde la función que necesita no se exporta.

Para preguntas generales sobre las partes internas de Windows, intente preguntar en Sysinternals Forums.

EDITAR: Lo que ha indicado (leer una cadena que el proceso verifica contra la entrada del usuario) es muy difícil de hacer en un programa sin conocer previamente el diseño de las instrucciones y datos en el archivo de imagen. Si, por ejemplo, tiene un programa crackme, podría usar una herramienta de análisis estático como IDA Pro o ejecutar el programa bajo un depurador. De cualquier manera, estas cosas generalmente requieren la participación humana y son difíciles de hacer automáticamente.

+0

Downvoter: explíquese. – wj32

1

Processes, por diseño y por definición, están aislados entre sí. Tienen espacio de direcciones separado.

El sistema operativo mantiene sus procesos separados y asigna los recursos que necesitan para que sean menos probable que interfieran entre sí ...

Pueden duda comunicarse, pero solo si lo desean, a través de alguna forma de inter-process communication.

Sin embargo, threads, a veces conocido como proceso ligero, comparten su espacio de direcciones y pueden leer las estructuras de datos de los demás.

No estoy seguro, lo que entiende por

llamada, los otros procesos funciones

Una función f() puede ser compilado en código ejecutable múltiples procesos. El proceso A y el proceso B pueden llamar al f() de forma independiente en su contexto.

De lo contrario, el proceso A puede "comunicarse" al proceso B para realizar alguna acción, que por ejemplo puede implementarse en la función g() en B.B puede ejecutarlo en su contexto y "comunicar" el resultado de nuevo a A.

0

No puedo ver ningún uso beneficioso de esto, pero de todos modos. Hay al menos dos maneras de hacer que otro proceso llame a algo:

1) CreateRemoteThread(), creará un hilo en un proceso.

2) QueueUserAPC() hará que un hilo existente en ese proceso llame a una función de devolución de llamada.

Si ASLR está deshabilitado, es suficiente para llamar a una función sin parámetros. De lo contrario, también necesitará VirtualQueryEx(), ReadProcessMemory() y WriteProcessMemory().

Sí, y no es algo que hacer en Java :)

+0

Las APC de usuario no se ejecutan si el subproceso no realiza una espera de alertable. La mayoría de los hilos no. – wj32

+0

@ wj32 correcto, pero si otro proceso es suyo, puede ponerlos en alerta. – ruslik

+0

Pero, a juzgar por el objetivo del OP, eso sería hacer trampa :) Por supuesto, debería ser posible crear un subproceso remoto en NtTestAlert para que el subproceso ejecute el APC inmediatamente después de reanudarlo. – wj32

Cuestiones relacionadas