Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: yunernunez en 27 Julio 2021, 19:36 pm



Título: Abrir Perfiles Chrome desde Visual Basic
Publicado por: yunernunez en 27 Julio 2021, 19:36 pm
Hola a tod@s...por favor, quisiera que me ayuden con los siguiente: Cómo abrir un perfil específico google desde un botón con Visual Basic; uso este código pero sólo abre el perfil por defecto, supongo que me falta algún argumento...

Private Sub Command1_Click()
Shell "C:\Program Files\Google\Chrome\Application\chrome.exe", vbNormalFocus
End Sub


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: MCKSys Argentina en 27 Julio 2021, 19:44 pm
Hola!

Revisa éste post: https://superuser.com/questions/377186/how-do-i-start-chrome-using-a-specified-user-profile (https://superuser.com/questions/377186/how-do-i-start-chrome-using-a-specified-user-profile)

Saludos!


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: yunernunez en 27 Julio 2021, 21:11 pm
Hola!

Revisa éste post: https://superuser.com/questions/377186/how-do-i-start-chrome-using-a-specified-user-profile (https://superuser.com/questions/377186/how-do-i-start-chrome-using-a-specified-user-profile)

Saludos!


ya he intentado con el argumento --user-data-dir=  pero no ha funcionado...para medio resolver lo que hice fue desde un botón abrir un archivo .bat el cual contiene la instrucción para abrir el perfil requerido y (que capricho!!) en el archivo .bat si funciona ese argumento

esto es lo que usé en el botón de visual basic:
Private Sub Command1_Click()
Shell "C:\Users\yuner\Desktop\Perfiles\P1.bat"
End Sub

esto es lo que use en el archivo .bat:
start chrome.exe --user-data-dir="C:\Users\yuner\AppData\Local\Google\Chrome\User Data\Profile 1"


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: EdePC en 27 Julio 2021, 23:00 pm
Tendrías que poner la sentencia exacta que no te funciona para revisarlo, supongo que no estás poniendo o escapando las comillas, lo siguiente debería funcionar:

Código
  1. Private Sub Command1_Click()
  2.  Shell "C:\Program Files\Google\Chrome\Application\chrome.exe --profile-directory=""Profile 1""", vbNormalFocus
  3. End Sub

- Para escapar las comillas se deben poner dos veces


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: yunernunez en 28 Julio 2021, 02:28 am
Tendrías que poner la sentencia exacta que no te funciona para revisarlo, supongo que no estás poniendo o escapando las comillas, lo siguiente debería funcionar:

Código
  1. Private Sub Command1_Click()
  2.  Shell "C:\Program Files\Google\Chrome\Application\chrome.exe --profile-directory=""Profile 1""", vbNormalFocus
  3. End Sub

- Para escapar las comillas se deben poner dos veces


Diste en el clavo..eran las comillas...ahora en el caso de tener varios perfiles abiertos al mismo tiempo, como se haría para cerrar de forma individual cada perfil??...


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: yunernunez en 28 Julio 2021, 19:50 pm
Siguiendo el código facilitado por EdePC, he armado lo siguiente para abrir varios perfiles dando un lapso de 5 segundos entre las aperturas de los mismos:
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
'abrir el perfil 1
Shell "C:\Program Files\Google\Chrome\Application\chrome.exe --profile-directory=""Profile 1""", vbNormalFocus
'esperar 5 segundos
Sleep 5000
'abrir el perfil 2
Shell "C:\Program Files\Google\Chrome\Application\chrome.exe --profile-directory=""Profile 2""", vbNormalFocus
'esperar 5 segundos
Sleep 5000
End Sub

pero no se como cerrar los perfiles uno a uno...


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: MCKSys Argentina en 28 Julio 2021, 21:40 pm
pero no se como cerrar los perfiles uno a uno...

Hola!

En vez de usar Shell podrías usar la API CreateProcess para obtener el pid del proceso del navegador y luego cerrarlo (junto con los procesos "hijos", ya que cada tab crea un proceso nuevo).

Busca en inet cómo usar dicha API y cómo terminar un proceso y sus "hijos" (usando API's también).

Saludos!


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: EdePC en 28 Julio 2021, 22:13 pm
Ahí ya lo complicas bastante porque en realidad Shell si hace su trabajo y devuelve el PID que deberías usar para cerrar el proceso PERO Chrome administra sus propios procesos y el PID original ya ni va ha existir después.

En circunstancias normales esto debería funcionar:

Código
  1. Dim pid As Double
  2.  
  3. pid = Shell("C:\Program Files\Google\Chrome\Application\chrome.exe --profile-directory=""Profile 1""", vbNormalFocus)
  4.  
  5. Shell "TaskKill /Pid " & pid

- Pero no funciona porque Chrome administra sus propios procesos, es decir, el primer Shell llama a Chrome y recibe el PID pero luego el propio Chrome abre otros procesos con varios PID y el PID original se cierra solo.

Incluso si intentas capturar los procesos en un Proceso Padre no funciona porque Chrome recicla sus procesos activos haciendo imposible saber por ahí cual es el PID del proceso nuevo, y si cierras el proceso padre, cierras todo el Chrome XD

Tampoco veo nada significante en la línea de comandos de los procesos creados para identificar a que Perfil pertenece, habrá que pensar en otra cosa


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: yunernunez en 28 Julio 2021, 22:31 pm
Gracias MCKSys Argentina y EdePC me han orientado muchísimo..seguiré investigando


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: yunernunez en 30 Julio 2021, 05:09 am
chicos pues he seguido buscando como cerrar un perfil chrome desde visual basic y hasta los momentos no he encontrado una respuesta (o mejor decir: un código) así que pensé en una "solución gráfica", la idea es cerrar el perfil por medio de un clic en la X de la ventana del perfil. Se que hay softwares autoclickers que se programan por medio de coordenadas en pantalla, el detalle es que tendría que ejecutar dos programas  (el visual basic para abrir el perfil y el autoclicker para cerrarlo) y no esa no es la idea....buscando me encontré con este código que creo hace clic en las coordenadas dadas pero no lo comprendo, pudiera alguien explicarme como usarlo?

moverlo con la api SetCursorPos X, Y

Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

y con este api es para forzar el click

Private Declare Sub mouse_event Lib "USER32"(ByVal dwFlags As Long, ByVal dx As Long,ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

estas son las vanderas

Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4

y esto es para que presione y levante el click

mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0)
mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0)


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: Danielㅤ en 30 Julio 2021, 16:24 pm
Hola, lo que yo haría en tu caso si es que no fuese posible lograr lo que querés desde visual basic, usaría un lenguaje auxiliar, por lo que seguiría usando visual basic pero con la ayuda de otro lenguaje que si pueda hacer esa operación.

El método primero sería saber que lenguaje puede hacerlo, por ejemplo Python, C, C++, Powershell (aunque este último no sea un lenguaje pero puede tener posibles funciones) etc., luego crear el código que cumpla la función necesaria, entonces teniendo eso listo, podrías poner ese mismo código dentro de tu código vb y cuando haga falta ese código se copié por ejemplo en un directorio temporal de Windows creando un archivo para ejecutar las instrucciones y luego se borre o se borre cuando sea necesario.

En el caso de ser un programa ejecutable de por ejemplo un programa compilado como C++, se podría codificarlo en base64 y guardarlo dentro de tu código de vb, luego cuando se lo necesite usar, entonces se decodifica creando un archivo/programa ejecutable en algún directorio que puede ser en el mismo directorio dónde está tu script o en otro, por ejemplo en el directorio de archivos temporales de Windows.

Tal vez te preguntes si eso funcionaria y la respuesta es sí porque lo que un lenguaje no pueda hacer, lo hará otro que sí pueda, solamente tiene que llamar a ese otro código/programa, y el tema podríamos decir más complicado y el que más hay que tener en cuenta es el tema de la sincronización, los dos tienen que estar sincronizados y eso ya lo ves vos cómo hacerlo, podes hacerlo por ejemplo mediante archivos de texto o archivos de configuración ini, mientras uno escribe la información, el otro la lee, o hasta incluso usar sockets para la comunicación, yo en mis épocas he creado métodos como éstos y me han funcionado perfectamente.


Saludos


Título: Re: Abrir Perfiles Chrome desde Visual Basic
Publicado por: BlackZeroX en 2 Agosto 2021, 07:29 am
Hola, lo que yo haría en tu caso si es que no fuese posible lograr lo que querés desde visual basic, usaría un lenguaje auxiliar, por lo que seguiría usando visual basic pero con la ayuda de otro lenguaje que si pueda hacer esa operación.

El método primero sería saber que lenguaje puede hacerlo, por ejemplo Python, C, C++, Powershell (aunque este último no sea un lenguaje pero puede tener posibles funciones) etc., luego crear el código que cumpla la función necesaria, entonces teniendo eso listo, podrías poner ese mismo código dentro de tu código vb y cuando haga falta ese código se copié por ejemplo en un directorio temporal de Windows creando un archivo para ejecutar las instrucciones y luego se borre o se borre cuando sea necesario.

En el caso de ser un programa ejecutable de por ejemplo un programa compilado como C++, se podría codificarlo en base64 y guardarlo dentro de tu código de vb, luego cuando se lo necesite usar, entonces se decodifica creando un archivo/programa ejecutable en algún directorio que puede ser en el mismo directorio dónde está tu script o en otro, por ejemplo en el directorio de archivos temporales de Windows.

Tal vez te preguntes si eso funcionaria y la respuesta es sí porque lo que un lenguaje no pueda hacer, lo hará otro que sí pueda, solamente tiene que llamar a ese otro código/programa, y el tema podríamos decir más complicado y el que más hay que tener en cuenta es el tema de la sincronización, los dos tienen que estar sincronizados y eso ya lo ves vos cómo hacerlo, podes hacerlo por ejemplo mediante archivos de texto o archivos de configuración ini, mientras uno escribe la información, el otro la lee, o hasta incluso usar sockets para la comunicación, yo en mis épocas he creado métodos como éstos y me han funcionado perfectamente.


Saludos

Se me ocurre con winapi listas los procesos, obtener el "comando" con el que fue ejecutado y todos los PID de ese ejecución pues será de ese perfil...

Una imagen dice mil palabras (el código de abajo esta enfocado en buscar esos comandos)
(https://i.postimg.cc/cLWZD7QW/admon-taks.png) (https://postimg.cc/xc6W8zxp)

Pasos:

Listas procesos activos inspeccionando  "PED".
Si vez que tienen los parámetros del perfil los matas

Este es un visor en C/C++
C/C++ :: https://www.codeproject.com/Articles/19685/Get-Process-Info-with-NtQueryInformationProcess

Debes listar los procesos (aquí un código que te puede servir https://www.vbforums.com/showthread.php?251163-How-can-you-terminate-a-process-by-its-name&s=&highlight=terminateprocess) y obtener su handle después el handle lo puedes pasar a estos código que te dejo y que deberás adaptar según requieras.

Para inspeccionar las ejecuciones desde el handle podrías usar esto:
Código
  1. Option Explicit
  2.  
  3. Private Const ProcessBasicInformation As Long = 0
  4.  
  5. Private Type LARGE_INTEGER
  6.    lowpart                         As Long
  7.    highpart                        As Long
  8. End Type
  9.  
  10. Public Type LIST_ENTRY64
  11.    Flink                           As LARGE_INTEGER
  12.    Blink                           As LARGE_INTEGER
  13. End Type
  14.  
  15. Private Type UNICODE_STRING64
  16.    Length                          As Integer
  17.    MaxLength                       As Integer
  18.    lPad                            As Long
  19.    lpBuffer                        As LARGE_INTEGER
  20. End Type
  21.  
  22. Private Type PROCESS_BASIC_INFORMATION64
  23.    ExitStatus                      As Long
  24.    Reserved0                       As Long
  25.    PebBaseAddress                  As LARGE_INTEGER
  26.    AffinityMask                    As LARGE_INTEGER
  27.    BasePriority                    As Long
  28.    Reserved1                       As Long
  29.    uUniqueProcessId                As LARGE_INTEGER
  30.    uInheritedFromUniqueProcessId   As LARGE_INTEGER
  31. End Type
  32.  
  33. Public Type PEB64
  34.    InheritedAddressSpace           As Byte
  35.    ReadImageFileExecOptions        As Byte
  36.    BeingDebugged                   As Byte
  37.    Spare                           As Byte
  38.    lPad01                          As Long
  39.    Mutant                          As LARGE_INTEGER
  40.    ImageBaseAddress                As LARGE_INTEGER
  41.    LoaderData                      As LARGE_INTEGER
  42.    ProcessParameters               As LARGE_INTEGER
  43.    SubSystemData                   As LARGE_INTEGER
  44.    ProcessHeap                     As LARGE_INTEGER
  45.    FastPebLock                     As LARGE_INTEGER
  46.    AtlThunkSListPtr                As LARGE_INTEGER
  47.    IFEOKey                         As LARGE_INTEGER
  48.    CrossProcessFlags               As Long
  49.    ProcessBits                     As Long
  50.    KernelCallBackTable             As LARGE_INTEGER
  51.    EventLogSection                 As Long
  52.    EventLog                        As Long
  53.    FreeList                        As LARGE_INTEGER
  54.    TlsBitMapSize                   As Long
  55.    lPad02                          As Long
  56.    TlsBitMap                       As LARGE_INTEGER
  57.    TlsBitMapData(1)                As Long
  58.    ReadOnlySharedMemoryBase        As LARGE_INTEGER
  59.    ReadOnlySharedMemoryHeap        As LARGE_INTEGER
  60.    ReadOnlyStaticServerData        As LARGE_INTEGER
  61.    InitAnsiCodePageData            As LARGE_INTEGER
  62.    InitOemCodePageData             As LARGE_INTEGER
  63.    InitUnicodeCaseTableData        As LARGE_INTEGER
  64.    NumberOfProcessors              As Long
  65.    NtGlobalFlag                    As Long
  66.    CriticalSectionTimeout          As LARGE_INTEGER
  67.    HeapSegmentReserve              As LARGE_INTEGER
  68.    HeapSegmentCommit               As LARGE_INTEGER
  69.    HeapDeCommitTotalFreeThreshold  As LARGE_INTEGER
  70.    HeapDeCommitFreeBlockThreshold  As LARGE_INTEGER
  71.    NumberOfHeaps                   As Long
  72.    MaxNumberOfHeaps                As Long
  73.    ProcessHeapsList                As LARGE_INTEGER
  74.    GdiSharedHandleTable            As LARGE_INTEGER
  75.    ProcessStarterHelper            As LARGE_INTEGER
  76.    GdiDCAttributeList              As Long
  77.    lPad03                          As Long
  78.    LoaderLock                      As LARGE_INTEGER
  79.    NtMajorVersion                  As Long
  80.    NtMinorVersion                  As Long
  81.    NtBuildNumber                   As Integer
  82.    NtPlatformId                    As Integer
  83.    PlatformId                      As Long
  84.    ImageSubsystem                  As Long
  85.    ImageMajorSubsystemVersion      As Long
  86.    ImageMinorSubsystemVersion      As Long
  87.    lPad09                          As Long
  88.    AffinityMask                    As LARGE_INTEGER
  89.    GdiHandleBuffer(29)             As LARGE_INTEGER
  90.    PostProcessInitRoutine          As LARGE_INTEGER
  91.    TlsExpansionBitmap              As LARGE_INTEGER
  92.    TlsExpansionBitmapBits(31)      As Long
  93.    SessionId                       As LARGE_INTEGER
  94.    AppCompatFlags                  As LARGE_INTEGER
  95.    AppCompatFlagsUser              As LARGE_INTEGER
  96.    ShimData                        As LARGE_INTEGER
  97.    AppCompatInfo                   As LARGE_INTEGER
  98.    CSDVersion                      As UNICODE_STRING64
  99.    ActivationContextData           As LARGE_INTEGER
  100.    ProcessAssemblyStorageMap       As LARGE_INTEGER
  101.    SystemDefaultActivationData     As LARGE_INTEGER
  102.    SystemAssemblyStorageMap        As LARGE_INTEGER
  103.    MinimumStackCommit              As Long
  104.    lPad05                          As Long
  105.    FlsCallBack                     As LARGE_INTEGER
  106.    FlsListHead                     As LIST_ENTRY64
  107.    FlsBitmap                       As LARGE_INTEGER
  108.    FlsBitmapBits(3)                As Long
  109.    FlsHighIndex                    As Long
  110.    lPad06                          As Long
  111.    WerRegistrationData             As LARGE_INTEGER
  112.    WerShipAssertPtr                As LARGE_INTEGER
  113. End Type
  114.  
  115. Private Declare Function NtWow64QueryInformationProcess64 Lib "ntdll" ( _
  116.                         ByVal hProcess As Long, _
  117.                         ByVal ProcessInformationClass As Long, _
  118.                         ByRef pProcessInformation As Any, _
  119.                         ByVal uProcessInformationLength As Long, _
  120.                         ByRef puReturnLength As Long) As Long
  121. Private Declare Function NtWow64ReadVirtualMemory64 Lib "ntdll" ( _
  122.                         ByVal hProcess As Long, _
  123.                         ByVal BaseAddressL As Long, _
  124.                         ByVal BaseAddressH As Long, _
  125.                         ByRef Buffer As Any, _
  126.                         ByVal BufferLengthL As Long, _
  127.                         ByVal BufferLengthH As Long, _
  128.                         ByRef ReturnLength As LARGE_INTEGER) As Long
  129.  
  130. Sub Main()
  131.    Dim tPBI        As PROCESS_BASIC_INFORMATION64
  132.    Dim tPeb        As PEB64
  133.    Dim lStatus     As Long
  134.    Dim hProcess    As Long
  135.    Dim liRet       As LARGE_INTEGER
  136.  
  137.    ' // Your handle
  138.    hProcess = -1
  139.  
  140.    lStatus = NtWow64QueryInformationProcess64(hProcess, ProcessBasicInformation, tPBI, Len(tPBI), 0)
  141.  
  142.    If lStatus < 0 Then
  143.        MsgBox "Error 0x" & Hex$(lStatus)
  144.        Exit Sub
  145.    End If
  146.  
  147.    lStatus = NtWow64ReadVirtualMemory64(hProcess, tPBI.PebBaseAddress.lowpart, tPBI.PebBaseAddress.highpart, tPeb, Len(tPeb), 0, liRet)
  148.  
  149.    If lStatus < 0 Then
  150.        MsgBox "Error 0x" & Hex$(lStatus)
  151.        Exit Sub
  152.    End If
  153.  
  154. End Sub
  155.  


Este código los mata por nombre (busca por nombre los ejecutables obtiene su pid y los mata, en tu caso debes remover el codigo que busca por nombre y solo pasar el PID).
Código
  1. Public Function KillAppByName(MyName As String) As Boolean 'kills applications by name
  2.  
  3.    Const PROCESS_ALL_ACCESS = 0
  4.    Dim uProcess As PROCESSENTRY32
  5.    Dim rProcessFound As Long
  6.    Dim hSnapshot As Long
  7.    Dim szExename As String
  8.    Dim exitCode As Long
  9.    Dim AppKill As Long
  10.    Dim i As Integer
  11.    Dim lProcHnd As Long
  12.    Dim hWnd As Long
  13.  
  14.    On Local Error GoTo ErrTrap
  15.  
  16.    If winVersion = "WNT3" Or winVersion = "WNT4" Then Exit Function
  17.  
  18.    Const TH32CS_SNAPPROCESS As Long = 2&
  19.  
  20.    uProcess.dwSize = Len(uProcess)
  21.    hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
  22.    rProcessFound = ProcessFirst(hSnapshot, uProcess)
  23.  
  24.    Do While rProcessFound
  25.        i = InStr(1, uProcess.szexeFile, Chr(0))
  26.        szExename = LCase$(Left$(uProcess.szexeFile, i - 1))
  27.        If Right$(szExename, Len(MyName)) = LCase$(MyName) Then
  28.  
  29.            lProcHnd = OpenProcess(PROCESS_TERMINATE, 0&, uProcess.th32ProcessID)
  30.            AppKill = TerminateProcess(lProcHnd, exitCode)
  31.            Call CloseHandle(lProcHnd)
  32.  
  33.        End If
  34.        rProcessFound = ProcessNext(hSnapshot, uProcess)
  35.    Loop
  36.  
  37.    Call CloseHandle(hSnapshot)
  38.  
  39.    Exit Function
  40.  
  41. End Function
  42.  

Dulces lunas!¡.