Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: EstoyBaneado en 4 Junio 2005, 20:15 pm



Título: Pausar la ejecucion de un programa
Publicado por: EstoyBaneado en 4 Junio 2005, 20:15 pm
Me gustaria muchuchusisimo saber si se puede "pausar" o detener temporalmente la ejecucion de un programa y cual es la Api q lo hace. Para q no se malentienda, quiero pausar desde mi programa en vb, otro programa externo.

gracias de antemano.


Título: Re: Pausar la ejecucion de un programa
Publicado por: Ertai en 5 Junio 2005, 00:28 am
Algo tipo Olly o Softice?  :o :o

Lo veo dificil.

Saludos,
Ertai


Título: Re: Pausar la ejecucion de un programa
Publicado por: Slasher-K en 5 Junio 2005, 00:48 am
No se pueden pausar aplicaciones sino threads. Para pausar una aplicación tenés que pausar su thread primario.

Para detener la ejecución de un subproceso (thread) se utiliza la función SuspendThread (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/suspendthread.asp). Para volver a reanudar la ejecución se utiliza ResumeThread (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/resumethread.asp). Se puede llamar a la función SuspendThread las veces que se deseen pero luego hay que llamar a ResumeThread la misma cantidad de veces para que el subproceso continúe ejecutandose.

Saludos.


Título: Re: Pausar la ejecucion de un programa
Publicado por: EstoyBaneado en 6 Junio 2005, 03:35 am
¿como puedo saber el handle del thread primario? porque segun vi, a la funcion suspendthread hay que pasarle como parametro el handle, pero yo solamente sé el ID del thread, y no me funca.
Sé que una manera seria abriendo el ID con la funcion OpenThread, pero esa funcion solo existe en WinXP.

¿Alguna Idea?

thx.


Título: Re: Pausar la ejecucion de un programa
Publicado por: byebye en 6 Junio 2005, 04:06 am
depura el proceso desde tu programa (debugactiveprocess), cuando DebugEventCode sea = a CREATE_PROCESS_DEBUG_EVENT tiras de CREATE_PROCESS_DEBUG_INFO que consta de estos datos:

Código:
typedef struct _CREATE_PROCESS_DEBUG_INFO { // cpdi  
    HANDLE hFile;
    HANDLE hProcess;
    HANDLE hThread; <--------------- aqui lo que buscas
    LPVOID lpBaseOfImage;
    DWORD dwDebugInfoFileOffset;
    DWORD nDebugInfoSize;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
    LPVOID lpImageName;
    WORD fUnicode;
} CREATE_PROCESS_DEBUG_INFO;


Título: Re: Pausar la ejecucion de un programa
Publicado por: Crashoverwrite en 13 Junio 2005, 14:00 pm
Código:
Declare Function MsgWaitForMultipleObjects Lib "user32" _
(ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, _
ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, _
ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Sub Main()

    Static t As Boolean
    If t <> True Then _
    SetTimer hwnd, 0, 1, AddressOf TimerProc: t = True
   
    SafeSleep (3600)
   
End Sub

Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
   
    ' EJECUCION EN SEGUNDO PLANO
   
   
    '///////////////////////////////////////////////////////
        ' [ CODE code ]:::::::::::::>>
    '///////////////////////////////////////////////////////
   
End Sub

Sub SafeSleep(ByVal inWaitSeconds As Single) 'PAUSA Y NO CARGA LA CPU!!!

Const WAIT_OBJECT_0 As Long = 0
Const WAIT_TIMEOUT As Long = &H102

Dim lastTick As Single
Dim timeout As Long
timeout = inWaitSeconds * 1000
lastTick = Timer

Do
Select Case MsgWaitForMultipleObjects(0, 0, False, timeout, 255)
Case WAIT_OBJECT_0
DoEvents
timeout = ((inWaitSeconds) - (Timer - lastTick)) * 1000
If timeout < 0 Then timeout = 0

Case Else
Exit Do

End Select

Loop While True

Main ' VUELVE AL PROCEDIMIENTO PRINCIPAL
   
End Sub


Título: Re: Pausar la ejecucion de un programa
Publicado por: byebye en 13 Junio 2005, 22:39 pm
en ese codigo pausa otro proceso por algun sitio?


Título: Re: Pausar la ejecucion de un programa
Publicado por: Slasher-K en 14 Junio 2005, 00:35 am
Código:
Main ' VUELVE AL PROCEDIMIENTO PRINCIPAL

Esa linea va a provocar un desbordamiento de pila.

Saludos.


Título: Re: Pausar la ejecucion de un programa
Publicado por: kasiko en 14 Junio 2005, 00:52 am
ummmmm  muy interesante el hilo  :o


Título: Re: Pausar la ejecucion de un programa
Publicado por: EstoyBaneado en 14 Junio 2005, 01:12 am
1) El code no anda.
2) Que se supone que hace? Un Sleep a mi propio proceso?
3) Crashoverwrite, eso es lo q hace el code, crashea. jaja.

salu!


Título: Re: Pausar la ejecucion de un programa
Publicado por: Crashoverwrite en 17 Junio 2005, 03:58 am
Precisamente lo que evito es el desbordamiento de pila. de todas maneras, lo tengo en desarrollo..

Pruebenlo y me dicen despues,;compilen en un nuevo proyecto exe, en un modulo estandar solamente, sin form. y dejenlo corriendo todo el tiempo que quieran, luego me dicen que tal muchachos!




NOTA DEL MODERADOR: No uses mayúsculas, en el foro se considera que estás gritando.


Título: Re: Pausar la ejecucion de un programa
Publicado por: Slasher-K en 17 Junio 2005, 04:41 am
Insisto que ese código va a dar un desbordamiento de pila y no sirve para detener ningún otro proceso, revisalo bien.

Saludos.


Título: Re: Pausar la ejecucion de un programa
Publicado por: Crashoverwrite en 17 Junio 2005, 09:18 am
PUES A MI NO ME LO DA!!


Título: Re: Pausar la ejecucion de un programa
Publicado por: Slasher-K en 17 Junio 2005, 09:25 am
Primero, no escribas en mayúsculas.

Ahora vamos a ver. El programa empieza en Main. Desde Main se llama a SafeSleep, desde SafeSleep vuelve a llamar a Mains y asçi sucesivamente. ¿Qué crees que va a pasar luego de varias llamadas a Main?, claro que si, un stack overflow.

Probá el siguiente código:

Código:
Sub Main
  Call SafeSleep
End Sub

Sub SafeSleep()
  Call Main
End Sub

Es lo mismo pero sin las demás instrucciones. Si lo probás te da un stack overflow.


Título: Re: Pausar la ejecucion de un programa
Publicado por: Slasher-K en 17 Junio 2005, 10:18 am
Esto es simple, si no sabes, no comentas y listo. Veo que ni siquiera con un código tan simple podés comprender tu error así que no vengas a querer ganar, esto no es una competencia. Si fueras más humilde aceptarías que te esquivocaste y ya.

Ahora como programador te digo que el código que pusiste es realmente horrible y mal estructurado, eso mismo se puede hacer de otra forma mucho menos complicada y SIN ERRORES DE PROGRAMACIÓN. Además no tiene nada que ver con este hilo.

Tema cerrado, si no te gusta te vas y ya, y no faltes el respeto porque en ningún momento te traté mal ni mucho menos.