duda acerca de los servicios :P

Iniciado por x64core, 13 Agosto 2011, 21:23 PM

0 Miembros y 1 Visitante están viendo este tema.

x64core

buenas cree este tema relacionado a este :P

http://foro.elhacker.net/analisis_y_diseno_de_malware/manejar_sevicios_desde_vb-t123518.0.html

tengo una duda de como crear un servicio e visto que estan las funciones pero creo que me estoy equivocando en algo :P o no funciona en win 7 ???

todo el codigo de vb lo agrego a un modulo y despues llamo a la funcion "main" luego en esa funcion agrego la funcion "ServiceInstall" que creo que en los paremtros me quivoco noce :P yo escribo el nombre de la PC o es el nombre del usuario del que se esta ocupando? luego el segundo parametro es el nombre del servicio no :P y el tercero la ruta del EXE yo escribo la ruta del notepad :P
bueno si hay alguien que enseñe como funciona el codigo gracias  ;D

ThunderCls

En que te falla y que error te devuelve?
El prototipo de la funcion es:

Código (vb) [Seleccionar]
ServiceInstall(ComputerName As String, ServiceName As String, Path As String)

El primer parametro es el nombre de la PC (Segun la MSDN - http://msdn.microsoft.com/en-us/library/ms684323(v=vs.85).aspx):
The name of the target computer. If the pointer is NULL or points to an empty string, the function connects to the service control manager on the local computer.

El segundo y el tercer parametro estan relacionados con "CreateService" (http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx). Por lo que estuve viendo en la implementacion de la funcion, se utiliza el mismo parametro de funcion "ServiceName" para los parametros de API "lpServiceName" y "lpDisplayName" que no necesariamente tienen que ser iguales...bueno, es solo una aclaracion.
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

x64core

pues yo queria saber como usar las funciones osea como instalar digamos el notepad como servicio :P
yo e investigado un poco pero no logro hacerlo :/


(e hecho una copia del notepad al C )
Código (vb) [Seleccionar]
Sub Main()
Dim ComputerN As String
Dim LenC As Long

ComputerN = Space(MAX_COMPUTERNAME_LENGTH)
LenC = MAX_COMPUTERNAME_LENGTH + 1
GetComputerName ComputerN, LenC
ComputerN = Left$(ComputerN, LenC)

ServiceInstall ComputerN, "NOTEPAD", "C:\NOTEPAD.exe"

    'ServiceStop "", "ipodservice"
    'ServiceStart "", "ipodservice"
    'ServicePause "", "ipodservice"
    'ServiceInstall "", "ipodservice",
    'ServiceUnInstall "", "ipodservice"
    'MsgBox ServiceStatus("", "ipodservice")
End Sub


y cuando llamo a la funcion de instalar el servicio no me instala nada :/ yo uso window 7 noce si eso puede afectar aunq en la msdn dice que desde 98 creo :P en adelanet :P es mas e puesto esta linea despues de la llamada a la API createservice

Código (vb) [Seleccionar]
If Err.LastDllError <> 0 Then Debug.Print Error(Err.LastDllError)

para saber cual es el error y me devuelve esto:

"Error definido por la aplicación o el objeto"

:P

x64core

:P sale buenas e logrado instalar un servicio :P
con este codigo:


Código (vb) [Seleccionar]
Public Function Service_Install(SVC_NAME As String, SVC_DESC As String) As Boolean
    Dim lHManager           As Long
    Dim lHService           As Long
    Dim lResult             As Long
    Dim tStatus             As SERVICE_STATUS
    Dim sSvcPath            As String
    Dim sAccount            As String

On Error GoTo Handler
    sSvcPath = App.Path + "\" & SVC_NAME
    sAccount = "LocalSystem"
    lHManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_CREATE_SERVICE)
    lResult = CreateService(lHManager, SVC_NAME, SVC_DESC, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, sSvcPath, vbNullString, vbNullString, vbNullString, sAccount, vbNullString)
    If Not lResult = 0 Then
        Service_Install = True
    Else
        GoTo Handler
    End If
    CloseServiceHandle lHManager
On Error GoTo 0
Exit Function
   
Handler:
    If Not lHManager = 0 Then CloseServiceHandle lHManager
End Function


Public Function Service_StartUp(SVC_NAME As String, svcStartType As eServiceStartType) As Boolean
    Dim lHManager           As Long
    Dim lHService           As Long
    Dim lResult             As Long

On Error GoTo Handler
    lHManager = OpenSCManager(vbNullString, vbNullString, SC_MANAGER_CONNECT)
    lHService = OpenService(lHManager, SVC_NAME, SERVICE_CHANGE_CONFIG)
    lResult = ChangeServiceConfig(lHService, SERVICE_NO_CHANGE, svcStartType, SERVICE_NO_CHANGE, vbNullString, vbNullString, 0&, vbNullString, vbNullString, vbNullString, vbNullString)
    If Not lResult = 0 Then Service_StartUp = True
    CloseServiceHandle lHService
    CloseServiceHandle lHManager
On Error GoTo 0
Exit Function
   
Handler:
    If Not lHService = 0 Then CloseServiceHandle lHService
    If Not lHManager = 0 Then CloseServiceHandle lHManager
End Function


y lo utilizo asi:


Código (VB) [Seleccionar]
If Service_Install(App.EXEName & ".exe", "EJEMPLO SERVICIO") Then
    Debug.Print Service_StartUp(App.EXEName & ".exe", START_AUTO)
Else
    Debug.Print "SVC NOT"
End If


compilo el proyecto y lo ejecuto, me instala el servicio el proceso de programa aparece como un proceso normal en el admin de tareas, en la pestaña de servicios lo encuentro instalado:


pero al parecer no esta iniciado ( claro no tiene la funcion para ser iniciado ) luego lo inicio manualmente y me dice esto:


y luego apago y vuelvo a encender y no esta iniciado el servicio
alguien me puede ayudar? :( :P


pero ahora el problema es que no me inicia el servicio :P

Elemental Code

que programa estas poniendo como servicio.?
Cualquier programa se puede poner como servicio?

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

raul338

Cualquier programa se puede, pero al iniciarlo el programa debe "terminar" la llamada devolviendo un código antes de un tiempo determinado, como hacerlo, no sé :xD

x64core

#6
Cita de: Elemental Code en  2 Septiembre 2011, 22:30 PM
que programa estas poniendo como servicio.?
Cualquier programa se puede poner como servicio?

bueno yo hice un programa sin interfas ( form ) porque lei en algun sitio no recuerdo bien que los servicios no deben de tener GUI :P entonces hice un medio hook para detectar los pendrive :P y me pasa ese problema :P

Cita de: raul338 en  3 Septiembre 2011, 01:07 AM
Cualquier programa se puede, pero al iniciarlo el programa debe "terminar" la llamada devolviendo un código antes de un tiempo determinado, como hacerlo, no sé :xD

pues ahora que lo dices raul338 cuando inicio el servicio instalado con codigo el programa creado para iniciar el servicio se cuelga :P
debe ser eso que dices :P y luego hice un programa normal que crea 100 archivos de texto en una X carpeta ( todo eso esta en el sub main del modulo porque no les agrego form ) luego de comprobar que se crearon los 100 archivos termina el sub main del modulo y finaliza el programa y el otro programa que llamo a la funcion para inciar el servicio noce cuelga :P
bueno espero que alguien si pueda


BlackZeroX

The Dark Shadow is my passion.

BlackZeroX

#8
.
Aqui te dejo un servicio en vb6 es el que te dige que tradujeras, solo le faltan las constantes, y la verdad ya me dio weba buscarlas asi que aqui te lo dejo.

SOLO LO TRADUJE JAMAS LO PROBE... si puedes corregir los errores adelante si no avisa.

Va en un modulo X...

Código (Vb) [Seleccionar]


Option Explicit

Private Const NO_ERROR = 0

Private Const SERVICE_WIN32_OWN_PROCESS = &H10&
Private Const SERVICE_WIN32_SHARE_PROCESS = &H20&
Private Const SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS + _
                              SERVICE_WIN32_SHARE_PROCESS
Private Const SERVICE_ACCEPT_STOP = &H1
Private Const SERVICE_ACCEPT_PAUSE_CONTINUE = &H2
Private Const SERVICE_ACCEPT_SHUTDOWN = &H4
Private Const SC_MANAGER_CONNECT = &H1
Private Const SC_MANAGER_CREATE_SERVICE = &H2
Private Const SC_MANAGER_ENUMERATE_SERVICE = &H4
Private Const SC_MANAGER_LOCK = &H8
Private Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
Private Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SERVICE_QUERY_CONFIG = &H1
Private Const SERVICE_CHANGE_CONFIG = &H2
Private Const SERVICE_QUERY_STATUS = &H4
Private Const SERVICE_ENUMERATE_DEPENDENTS = &H8
Private Const SERVICE_START = &H10
Private Const SERVICE_STOP = &H20
Private Const SERVICE_PAUSE_CONTINUE = &H40
Private Const SERVICE_INTERROGATE = &H80
Private Const SERVICE_USER_DEFINED_CONTROL = &H100
Private Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
                                    SERVICE_QUERY_CONFIG Or _
                                    SERVICE_CHANGE_CONFIG Or _
                                    SERVICE_QUERY_STATUS Or _
                                    SERVICE_ENUMERATE_DEPENDENTS Or _
                                    SERVICE_START Or _
                                    SERVICE_STOP Or _
                                    SERVICE_PAUSE_CONTINUE Or _
                                    SERVICE_INTERROGATE Or _
                                     SERVICE_USER_DEFINED_CONTROL)
Private Const SERVICE_DEMAND_START As Long = &H3
Private Const SERVICE_ERROR_NORMAL As Long = &H1
' Private Enum SERVICE_CONTROL
Private Const SERVICE_CONTROL_STOP = &H1
Private Const SERVICE_CONTROL_PAUSE = &H2
Private Const SERVICE_CONTROL_CONTINUE = &H3
Private Const SERVICE_CONTROL_INTERROGATE = &H4
Private Const SERVICE_CONTROL_SHUTDOWN = &H5
' End Enum
' Private Enum SERVICE_STATE
Private Const SERVICE_STOPPED = &H1
Private Const SERVICE_START_PENDING = &H2
Private Const SERVICE_STOP_PENDING = &H3
Private Const SERVICE_RUNNING = &H4
Private Const SERVICE_CONTINUE_PENDING = &H5
Private Const SERVICE_PAUSE_PENDING = &H6
Private Const SERVICE_PAUSED = &H7
' End Enum


'typedef struct _SERVICE_TABLE_ENTRY {
'  LPTSTR                  lpServiceName;
'  LPSERVICE_MAIN_FUNCTION lpServiceProc;
'} SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;
'http://msdn.microsoft.com/en-us/library/ms686001%28v=vs.85%29.aspx
Type SERVICE_TABLE_ENTRY
    lpServiceName   As String
    lpServiceProc   As Long
End Type

'BOOL WINAPI StartServiceCtrlDispatcher(
'  __in  const SERVICE_TABLE_ENTRY *lpServiceTable
');
'http://msdn.microsoft.com/en-us/library/ms686324%28v=vs.85%29.aspx
Private Declare Function StartServiceCtrlDispatcher Lib "advapi32.dll" Alias "StartServiceCtrlDispatcherA" (lpServiceStartTable As SERVICE_TABLE_ENTRY) As Long

'typedef struct _SERVICE_STATUS {
'  DWORD dwServiceType;
'  DWORD dwCurrentState;
'  DWORD dwControlsAccepted;
'  DWORD dwWin32ExitCode;
'  DWORD dwServiceSpecificExitCode;
'  DWORD dwCheckPoint;
'  DWORD dwWaitHint;
'} SERVICE_STATUS, *LPSERVICE_STATUS;
'http://msdn.microsoft.com/en-us/library/ms685996%28VS.85%29.aspx
Type SERVICE_STATUS
    dwServiceType               As Long
    dwCurrentState              As Long
    dwControlsAccepted          As Long
    dwWin32ExitCode             As Long
    dwServiceSpecificExitCode   As Long
    dwCheckPoint                As Long
    dwWaitHint                  As Long
End Type

'SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler(
'  __in  LPCTSTR lpServiceName,
'  __in  LPHANDLER_FUNCTION lpHandlerProc
');
'http://msdn.microsoft.com/en-us/library/ms685054%28VS.85%29.aspx
Public Declare Function RegisterServiceCtrlHandler Lib "advapi32.dll" Alias "RegisterServiceCtrlHandlerA" (ByVal lpServiceName As String, ByVal lpHandlerProc As Long) As Long

'void WINAPI OutputDebugString(
'  __in_opt  LPCTSTR lpOutputString
');
'http://msdn.microsoft.com/en-us/library/aa363362%28VS.85%29.aspx
Public Declare Sub OutputDebugString Lib "kernel32.dll" Alias "OutputDebugStringA" (ByVal lpServiceTable As String)

'BOOL WINAPI SetServiceStatus(
'  __in  SERVICE_STATUS_HANDLE hServiceStatus,
'  __in  LPSERVICE_STATUS lpServiceStatus
');
'http://msdn.microsoft.com/en-us/library/ms686241%28VS.85%29.aspx
Public Declare Function SetServiceStatus Lib "advapi32.dll" (ByVal hServiceStatus As Long, ByVal lpServiceStatus As Long) As Long

'DWORD WINAPI GetLastError(void);
'http://msdn.microsoft.com/en-us/library/ms679360%28v=VS.85%29.aspx
Public Declare Function GetLastError Lib "kernel32.dll" () As Long

Dim MyServiceStatus             As SERVICE_STATUS
Dim MyServiceStatusHandle       As Long

Public Function getLPFunc(ByVal lpFunc As Long) As Long
    getLPFunc = lpFunc
End Function

Sub main()
Dim DispatchTable(1) As SERVICE_TABLE_ENTRY
    DispatchTable(0).lpServiceName = "MyService"
    DispatchTable(0).lpServiceProc = getLPFunc(AddressOf MyServiceStart)
    DispatchTable(1).lpServiceName = vbNullString
    DispatchTable(1).lpServiceProc = &H0
    If (Not StartServiceCtrlDispatcher(DispatchTable(0))) Then
        OutputDebugString " [MY_SERVICE] StartServiceCtrlDispatcher " & GetLastError
    End If
End Sub

Public Function MyServiceStart(ByVal lCantArg As Long, ByVal lpArgv As Long)
Dim status          As Long
Dim SpecificError   As Long

    MyServiceStatus.dwServiceType = SERVICE_WIN32
    MyServiceStatus.dwCurrentState = SERVICE_START_PENDING
    MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP Or SERVICE_ACCEPT_PAUSE_CONTINUE
    MyServiceStatus.dwWin32ExitCode = 0
    MyServiceStatus.dwServiceSpecificExitCode = 0
    MyServiceStatus.dwCheckPoint = 0
    MyServiceStatus.dwWaitHint = 0
   
    MyServiceStatusHandle = RegisterServiceCtrlHandler("MyService", getLPFunc(AddressOf MyServiceCtrlHandler))

    If (MyServiceStatusHandle = &H0) Then
        status = GetLastError()
        OutputDebugString (" [MY_SERVICE] RegisterServiceCtrlHandler failed " & status)
        Exit Function
    End If

    status = MyServiceInitialization(lCantArg, lpArgv, SpecificError)
    If (Not (status = NO_ERROR)) Then
        MyServiceStatus.dwCurrentState = SERVICE_STOPPED
        MyServiceStatus.dwCheckPoint = 0
        MyServiceStatus.dwWaitHint = 0
        MyServiceStatus.dwWin32ExitCode = status
        MyServiceStatus.dwServiceSpecificExitCode = SpecificError
        SetServiceStatus MyServiceStatusHandle, ByVal VarPtr(MyServiceStatus)
        Exit Function
    End If
    MyServiceStatus.dwCurrentState = SERVICE_RUNNING
    MyServiceStatus.dwCheckPoint = 0
    MyServiceStatus.dwWaitHint = 0

    If (Not SetServiceStatus(MyServiceStatusHandle, ByVal VarPtr(MyServiceStatus))) Then
        status = GetLastError()
        OutputDebugString (" [MY_SERVICE] RegisterServiceCtrlHandler error " & status)
    End If
   
    OutputDebugString (" [MY_SERVICE] Returning the Main Thread ")
   
End Function

Public Function MyServiceInitialization(ByVal lCantArg As Long, ByVal lpArgv As Long, ByRef SpecificError As Long)
Dim ff      As Long
    ff = FreeFile
    Open "c:\Servicio en VB6.txt" For Binary As ff
        Put ff, , "Hola mundo desde un servicio creado en vb6"
    Close ff
    MyServiceInitialization = 0
End Function

Public Sub MyServiceCtrlHandler(ByVal Opcode As Long)
Dim status      As Long
    Select Case (Opcode)
        Case SERVICE_CONTROL_PAUSE:
            MyServiceStatus.dwCurrentState = SERVICE_PAUSED
        Case SERVICE_CONTROL_CONTINUE:
            MyServiceStatus.dwCurrentState = SERVICE_RUNNING
        Case SERVICE_CONTROL_STOP:
            MyServiceStatus.dwWin32ExitCode = 0
            MyServiceStatus.dwCurrentState = SERVICE_STOPPED
            MyServiceStatus.dwCheckPoint = 0
            MyServiceStatus.dwWaitHint = 0

            If (Not SetServiceStatus(MyServiceStatusHandle, ByVal VarPtr(MyServiceStatus))) Then
                status = GetLastError()
                OutputDebugString " [MY_SERVICE] SetServiceStatus error " & status
            End If

            OutputDebugString " [MY_SERVICE] Leaving MyService"
            Exit Sub

        Case SERVICE_CONTROL_INTERROGATE:
        Case Else
            OutputDebugString " [MY_SERVICE] Unrecognized opcode " & Opcode
    End Select
    If (Not SetServiceStatus(MyServiceStatusHandle, ByVal VarPtr(MyServiceStatus))) Then
      status = GetLastError()
      OutputDebugString " [MY_SERVICE] SetServiceStatus error " & status
    End If
End Sub



Sangriento Infirno Lunar!¡.
The Dark Shadow is my passion.

x64core

gracias tio por tomarte el tiempo de traducirlo y ayudar :) pero ya le probado :P y no funka :P lo e probado usando mi logica :P en "myservice" escribi el servicio que queria ejecutar y no anda hace todo el proceso del sub main y luego finaliza :P no llama a la funcion callback ( creo que asi se le llama :P )  que veo ahi :P