Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Miseryk

#61
Parece ser un tema complicado, no ví resultados en internet, pero hay que tener algo en cuenta, primero se registra una clase con "RegisterClassEx"

Código (cpp) [Seleccionar]

ATOM WINAPI RegisterClassEx(
  _In_  const WNDCLASSEX *lpwcx
);


Así que si la querés cambiar tenés que ir pensando en crear una a donde apuntar, ya que las clases son importantes porque los botones, textboxes son de tales características debido a su clase.

Luego podrías ver que hace internamente CreateWindow o CreateWindowEx, debe apuntar a un string o un puntero de la estructura ésa.

Ahora estoy un tanto ocupado haciendo funcionar "ZwQueryVirtualMemory", pero luego me pongo a debuggear CreateWindow y tratar de cambiar la clase, te conviene hacerlo en C++ y cuando lo logres lo pasás a VB6.
#62
Bueno, éste es un tema que ví en foro.elhacker.net/programacion_visual_basic/abrir_ejecutable_en_un_form_iquestes_posible_abrir_chrome-t429104.0.html para obtener el path de un archivo en ejecución sin hooks, aparentemente vé de donde se abrió, ahora posteo el código y un par de ejemplos:

Código (vb) [Seleccionar]

Option Explicit

Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Declare Function LoadLibraryA Lib "kernel32" (ByVal lpLibFileName As String) As Long

Public Const PROCESS_ALL_ACCESS = &H1F0FFF  'Specifies all possible access flags for the process object.
Public Const PROCESS_CREATE_THREAD = &H2   'Enables using the process handle in the CreateRemoteThread function to create a thread in the process.
Public Const PROCESS_DUP_HANDLE = &H40  'Enables using the process handle as either the source or target process in the DuplicateHandle function to duplicate a handle.
Public Const PROCESS_QUERY_INFORMATION = &H400 'Enables using the process handle in the GetExitCodeProcess and GetPriorityClass functions to read information from the process object.
Public Const PROCESS_SET_INFORMATION = &H200  'Enables using the process handle in the SetPriorityClass function to set the priority class of the process.
Public Const PROCESS_TERMINATE = &H1 'Enables using the process handle in the TerminateProcess function to terminate the process.
Public Const PROCESS_VM_OPERATION = &H8 'Enables using the process handle in the VirtualProtectEx and WriteProcessMemory functions to modify the virtual memory of the process.
Public Const PROCESS_VM_READ = &H10     'Enables using the process handle in the ReadProcessMemory function to read from the virtual memory of the process.
Public Const PROCESS_VM_WRITE = &H20 'Enables using the process handle in the WriteProcessMemory function to write to the virtual memory of the process.
Public Const SYNCHRONIZE = &H100000   'Enables using the process handle in any of the wait functions to wait for the process to terminate.

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

'The WideCharToMultiByte function maps a wide-character string to a new character string.
'The function is faster when both lpDefaultChar and lpUsedDefaultChar are NULL.

'CodePage
Private Const CP_ACP = 0 'ANSI
Private Const CP_MACCP = 2 'Mac
Private Const CP_OEMCP = 1 'OEM
Private Const CP_UTF7 = 65000
Private Const CP_UTF8 = 65001

'dwFlags
Private Const WC_NO_BEST_FIT_CHARS = &H400
Private Const WC_COMPOSITECHECK = &H200
Private Const WC_DISCARDNS = &H10
Private Const WC_SEPCHARS = &H20 'Default
Private Const WC_DEFAULTCHAR = &H40

Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long

Public Function ByteArrayToString(Bytes() As Byte) As String
Dim iUnicode As Long, i As Long, j As Long

On Error Resume Next
i = UBound(Bytes)

If (i < 1) Then
    'ANSI, just convert to unicode and return
    ByteArrayToString = StrConv(Bytes, vbUnicode)
    Exit Function
End If
i = i + 1

'Examine the first two bytes
CopyMemory iUnicode, Bytes(0), 2

If iUnicode = Bytes(0) Then 'Unicode
    'Account for terminating null
    If (i Mod 2) Then i = i - 1
    'Set up a buffer to recieve the string
    ByteArrayToString = String$(i / 2, 0)
    'Copy to string
    CopyMemory ByVal StrPtr(ByteArrayToString), Bytes(0), i
Else 'ANSI
    ByteArrayToString = StrConv(Bytes, vbUnicode)
End If
End Function

Public Function StringToByteArray(strInput As String, Optional bReturnAsUnicode As Boolean = True, Optional bAddNullTerminator As Boolean = False) As Byte()
Dim lRet As Long
Dim bytBuffer() As Byte
Dim lLenB As Long

If bReturnAsUnicode Then
    'Number of bytes
    lLenB = LenB(strInput)
    'Resize buffer, do we want terminating null?
    If bAddNullTerminator Then
        ReDim bytBuffer(lLenB)
    Else
        ReDim bytBuffer(lLenB - 1)
    End If
    'Copy characters from string to byte array
    CopyMemory bytBuffer(0), ByVal StrPtr(strInput), lLenB
Else
    'METHOD ONE
'        'Get rid of embedded nulls
'        strRet = StrConv(strInput, vbFromUnicode)
'        lLenB = LenB(strRet)
'        If bAddNullTerminator Then
'            ReDim bytBuffer(lLenB)
'        Else
'            ReDim bytBuffer(lLenB - 1)
'        End If
'        CopyMemory bytBuffer(0), ByVal StrPtr(strInput), lLenB
   
    'METHOD TWO
    'Num of characters
    lLenB = Len(strInput)
    If bAddNullTerminator Then
        ReDim bytBuffer(lLenB)
    Else
        ReDim bytBuffer(lLenB - 1)
    End If
    lRet = WideCharToMultiByte(CP_ACP, 0&, ByVal StrPtr(strInput), -1, ByVal VarPtr(bytBuffer(0)), lLenB, 0&, 0&)
End If

StringToByteArray = bytBuffer
End Function


Código (vb) [Seleccionar]

Option Explicit

Private Sub Command1_Click()
Dim handle_Process As Double

handle_Process = OpenProcess(PROCESS_ALL_ACCESS, False, Val(Text1.Text))

If handle_Process <> 0 Then
    Dim zBytes(256) As Byte
   
    Dim lb As Long
   
    lb = LoadLibraryA("KERNEL32.DLL")
   
    If lb = 0 Then
        lb = &H77C50000
    End If

    'kernel32.dll+C6320
    '0x77D16320
    If ReadProcessMemory(handle_Process, lb + &HC6320, zBytes(0), 256, 0&) <> 0 Then
        Clipboard.SetText ByteArrayToString(zBytes)
        MsgBox Clipboard.GetText
    Else
        MsgBox "Error al ejecutar ReadProcessMemory. (" & Err.LastDllError & ")"
    End If

    Call CloseHandle(handle_Process)
Else
    MsgBox "Error al ejecutar OpenProcess. (" & Err.LastDllError & ")"
End If
End Sub

Private Sub Form_Load()
Text1.Text = GetCurrentProcessId()
End Sub


TaskMgr:
opera.exe 236 C:\Program Files\Opera\20.0.1387.91\opera.exe
OUTPUT: C:\Program Files\Opera\

McTray.exe 1796 C:\Program Files\McAfee\Common Framework\McTray.exe
OUTPUT: C:\Program Files\McAfee\Common Framework\

Project1.exe 2368 (éste) C:\Users\***00001**\Desktop\Program Opened from\Project1.exe
OUTPUT: C:\Users\***00001**\Desktop\Program Opened from\

TeamViewer.exe 3308 C:\Program Files\TeamViewer\Version9\TeamViewer.exe
OUTPUT: C:\Windows\system32\ (muestra este output porque se cargó como servicio y aparentemente se abre desde ese path)

cheatengine-i386.exe 4320 C:\Misery-PC\Descargas\CE 6.3\CE 6.3\cheatengine-i386.exe
OUTPUT: C:\Misery-PC\Descargas\CE 6.3\CE 6.3\

UdaterUI.exe 5216 C:\Program Files\McAfee\Common Framework\UdaterUI.exe
OUTPUT: C:\Program Files\McAfee\Common Framework\

notepad++.exe 7464 C:\Program Files\Notepad++\notepad++.exe
OUTPUT: C:\Users\***00001**\Desktop\GOTTA DO\ (abrí un txt desde ese lugar)

Si bien no muestra el path del ejecutable, muestra el path de donde se abrió, seguramente que por el address KERNEL32.DLL+offset debe estar el path original del .exe, cualquier cosa nueva la posteo.

Saludos.
#63
Por cierto, mi GetModuleFileName no falla, porque se está llamando desde el mismo programa, seguramente GetModuleFileName debe leer la posición de memoria local en relación a ese HMODULE, por éso nunca va a leer otro programa. Cuando llegue a casa veo este tema.
#64
Cita de: okik en  4 Febrero 2015, 15:13 PM
¿Sin hardcodear? jajaja, ¿Eso está en el diccionario? ¿Qué significa? Es igual, lo supongo :P

"sin hardcodear" otra forma que hay de obtener el /Program files/ del sistema que tenía por ahí guardada y que estaba buscando es esta:

Código (vb) [Seleccionar]
Private Sub Command1_Click()
Dim X As Variant
Dim Y As Variant
  Set X = CreateObject("Wscript.Shell")
   Set Y = X.Environment("Process")
   Print Y("PROGRAMFILES")
End Sub



En cuanto  a lo que has posteado  Miseryk , lo de GetModuleHandle no lo he probado y no se muy bien como va. He probado lo siguiente:
Código (vbnet) [Seleccionar]
Dim hModule%, Buffer$, Length%, Msg$
        hModule% = GetModuleHandle("notepad.exe")
        Buffer$ = Space$(255)
        Length% = GetModuleFileName(hModule%, Buffer$, Len(Buffer$))
        Buffer$ = Left$(Buffer$, Length%)
        Msg$ = Buffer$
        Msgbox Msg$
:

Pero me da el directorio de VB6.EXE y no el del notepad.exe en este caso, ni siquiera estando en ejecución. He probado sustituyendo hModule% por el hande de la aplicación (en ejecución). Pero nada, que tampoco.

Al usar NULL supongo que tu vas por C++ y no VB, ya que NULL  no es válido en VB6, en sustitución sería vbNull


Bueno, como en internet son todos unos perdedores de *****, me imaginé que el path debía estar adentro de cada EXE, y por lo que pude ver en todos los programas abiertos en W7 32 bits, encontré un addres que contiene el path el cual es: (FUNCIONA CON EL 90% de los programas como OPERA, WINAMP, VB6, la ***** del McAfee, etc), también por lo que pude ver es que si abrís un proyecto de VB6, te toma el path de donde se abrió ese proyecto, muy loco, pero sinó vá a mostrar lo que vos andás buscando.

kernel32.dll+C6320 (UNICODE)

Agregala al cheatengine y andá attachando cada EXE y vás a ver que se carga el path de ese EXE. (Y)

PD: en algunos EXEs del systema no toma el path, pero funcionó con Winlogon y demás.

PD2: si el programa está hecho con una dll en especial, también hay un path con el que funciona el cual es:

msvcrt.dll+A3878 (MULTIBYTE)

PD3: el que quiera ayudar es bienvenido xDDDD la verdad que no me lo puse a ver bien, habría que investigar como funciona el taskmgr y copiar su funcionalidad.

Saludos.
#65
Cita de: okik en  4 Febrero 2015, 13:53 PM
Si claro que se puede. Se me ocurren varias maneras.

Pero antes de nada permíteme corregir unas líneas del código que te he dado antes. Hice un copia y pega de mi propio código en Form_Unload y se han colado un par de líneas que no tienen utilidad ahí, se trata de la variable hWndChild   que fue un intento de introducir sólamente la Web en el Picture, funcionaba con el Notepad por ejemplo, pero no con Google Chrome. Lo borré en otras partes del código, pero no en el Form_Load, se me pasó. También está lo de Espera(5) que si que es necesario más arriba, porque hay que esperar a que se cargue Google Chrome antes de introducirlo en el Picture, pero para cerrar no hace falta.

Código (vb) [Seleccionar]
Private Sub Form_Unload(Cancel As Integer)
   Dim hwnd As Long
   Dim hWndChild As Long  '<---- BORRAR ESTA LÍNEA
   'Espera (5) '<---- BORRAR ESTA LÍNEA
   hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
   Call Cerrar_Google(hwnd) 'cierra Google
End Sub


Debería ser así:

Código (vb) [Seleccionar]
Private Sub Form_Unload(Cancel As Integer)
   Dim hwnd As Long
   hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
   Call Cerrar_Google(hwnd) 'cierra Google
End Sub


En cuanto a lo de
- Primera opción: Crear un código de busqueda de Chrome.exe y obtener su directorio (ideal para programas que al actualizarse van cambiando la ubicación) por ejemplo si fuera "\Google\Chrome\Application\V0014\Chrome.exe" y al actualizarse cambiara a  "\Google\Chrome\Application\V00321\Chrome.exe". Que no es el caso. Te lo digo por si alguna vez te encuentras alguna cosa así.

- Segunda opción: Obtener mediante la función Environ el directorio de \program files\ del sistema:
Código (vb) [Seleccionar]
Private Sub Command1_Click()
Print Environ("programfiles")
End Sub

y luego añades el resto  "\Google\Chrome\Application\chrome.exe"
Código (vb) [Seleccionar]
Print Environ("programfiles") & "\Google\Chrome\Application\chrome.exe"

- Tercera opción: accediendo al registro de windows





Sin hardcodear:

Código (cpp) [Seleccionar]

GetModuleFileName(NULL, EXEFullPath, MAX_PATH);


El NULL es el baseaddress, yo lo llamo desde un hook (DLL) y cuando pasa por una función mia, estoy seguro que es del thread del mismo exe y no de mi thread de la DLL.

PD: éso si está en ejecución, de lo contrario es fijarse en el Registro en donde está la lista de todos los programas instalados.
#66
Programación Visual Basic / Re: Uso de TLB
2 Enero 2015, 20:37 PM
Cita de: Elargrt en 29 Diciembre 2014, 02:42 AM
Holas,alguien me enseñaria o me pasara algun link de  como usar TLB para llamar a las Api's(VB6) :huh: ??

Saludos

Qué sería TBL?
#67
Programación Visual Basic / Re: delimitador vbcrlf
15 Diciembre 2014, 13:18 PM
Código (vb) [Seleccionar]

Private Sub Command1_Click()
Dim zBytes() As Byte

zBytes = StrConv(Text1.Text, vbFromUnicode)
Stop
End Sub
#68
Programación Visual Basic / Re: delimitador vbcrlf
10 Diciembre 2014, 13:15 PM
Lo último que haría, es copiar el código de la página a un textbox y con un botón pasaría de letras a bytes y analizaría que es lo que "simula" (o lo que es) un cambio de línea.

Saludos.
#69
Programación Visual Basic / Re: delimitador vbcrlf
9 Diciembre 2014, 16:24 PM
Cita de: elezekiel en  9 Diciembre 2014, 00:50 AM
hola gente, estoy manejando una cadena que obtengo de la fuente de una pagina en html y lo printeo en un richtextbox, lo que quiero es que el salto de linea sea el delimitador usado en un split o for each, me da igual, el problema es que no me lo toma.. es como si fuera un string solo.

Código (vb) [Seleccionar]
NumberFile = FreeFile
For Each daTos In Split(txtUrl.Text, vbNewLine + vbCrLf)
Open App.Path & "/Date1.txt" For Output As #NumberFile
Print #NumberFile, daTos
Next daTos
Close #NumberFile


Mi idea es el codigo html obtenido de la pagina guardarlo en un txt de la misma forma con los saltos de linea y eso pero no puedo.. me lo guarda pero es uuna cadena sola que sale con cuadrados q creo que son el salto de linea.

se agradece!
saluddd

Intentá con el delimitador Chr(13) => Split(..., Chr(13))
#70
Bases de Datos / Re: [AYUDA] SQL Query
28 Noviembre 2014, 14:29 PM
Bueno, por los pocos ejemplos que encontré era de la manera la cual pregunté, aunque al SO no le gusta y explota, pero bueno ahora sé como se puede optimizar, gracias (Y)

Saludos.