Hola, vengo a pedirles que me orienten :P
Como puedo hacer para saber un valor de un elemento que tiene un programa. Porejemplo, dentro de un programa existe un textbox con un valor que aumenta cada 1 segundo, desde mi programa como puedo obtener el valor de ese textbox?. El programa "contador" no es mio y por lo tanto no tengo el codigo... y tampoco se que nombre tendra ese textbox :S. Bueno eso es lo que necesito saber, ojala me puedan ayudar :) Gracias de antemano
.
* Inyecta una dll... y realizas una subclasificacion al control mediante memoria compartida, dicha dll deberia enviarte los datos a tu programa ( SendMessage() o postMessage() ), es algo complejo... creo que la dll deberias hacerla en C/C++ por que la verdad nunca he visto inyecciones con dll creadas con vb6... aun con el tutorial de elguille para crear dll Standart.
Dulces Lunas!¡.
podes hacer un simple EnumChildWindows de la ventana padre de ese textbox, o de toda la ventana del programa, y obtener los valores de los controles, en uno de ellos estara el valor de ese textbox, lo actualizas constantemente y listo.
muchas gracias a ambos por su respuesta :), la verdad es que se ve un poco complejo :S y con C++ no estoy muy familiarizado :(. Como es eso de EnumChildWindows?, con este se podria obtener el valor del textbox con el contador??. Muchas gracias...
cuando no puedas resolver algo con el vb6 debes averiguar sobre las funciones de windows ( APIs de windows):
'FindWindow: Busca una ventana por su classname o por su windowname(barra de titulo)
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'parametros:
'lpClassName: nombre de la clase
'windowname: barra de titulo
'EnumChildWindows: Enumera las ventanas hijas (command, textbox,etc) de una ventana padre.
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'parametros:
'hwndParent: hwnd ventana padre
'lpEnumFunc: direccion de la funcion que recibira los hwnd de las ventanas hijas, por cada ventana hija
encontrada esta llamara a la funcion pasada
'SendMessage: Envia un mensaje a un hwnd (los mensajes son un monton)
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'hwnd: hwnd donde se envia el mensaje
'wMsg: mensaje que se va enviar (en este caso WM_GETTEXT)
'wParam: creo que iria el tamaño de la cadena inicializada
'lParam: variable donde se guardara el texto obtenido
Form1:
'agregar estos controles
'1 label con el caption "Titulo Ventana"
'1 textbox (text1) al lado derecho del label
'1 command (command1) debajo del textbox
'1 listbox (list1) al lado derecho del command1
Option Explicit
Private Sub Command1_Click()
Dim hwnd As Long, Titulo As String
Titulo = Text1.Text
'busca la ventana pasandole la barra de titulo
' si lo encuentra devolvera el HWND de la ventana ,sino 0
hwnd = FindWindow(vbNullString, Titulo)
If hwnd <> 0 Then
List1.Clear
Contador = 0
'enumera las ventanas hijas pasandole el HWND de la ventana padre y la direccion de la funcion
'que va recibir los HWND de las ventanas hijas (AddressOf EnumChildProc)
Call EnumChildWindows(hwnd, AddressOf EnumChildProc, ByVal 0&)
Else
MsgBox "No se encontro la ventana", vbCritical, ""
End If
End Sub
Private Sub Form_Load()
Command1.Caption = "Enumerar Ventanas Hijas"
Label1.Caption = "Titulo ventana: "
End Sub
en un module bas: module1
Option Explicit
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_GETTEXT = &HD
Public Contador As Long
'funcion encargada de recibir cada HWND de las ventanas hijas
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim Texto As String, Pos As Long
'crea un espacios de 1000 caracteres para que almacene ahi el texto obtenido
Texto = Space(1000)
'aki obtiene el texto del HWND de la ventana hija y lo almacena en variable "Texto"
Call SendMessage(hwnd, WM_GETTEXT, 1000, ByVal Texto)
'busca el caracter nulo (este indica el fin de la cadena)
Pos = InStr(1, Texto, Chr(0))
'si lo encuentra coge los caracteres excepto el nulo
If Pos > 0 Then Texto = Left(Texto, Pos - 1)
'contador para saber el orden de la ventana hija
Contador = Contador + 1
'agrega el HWND y el texto de la ventana hija recibida
Form1.List1.AddItem Contador & "- hWnd Hija: " & hwnd & " / Texto: " & Texto
EnumChildProc = 1
End Function
con este codigo sabras los HWND de las ventanas hijas y sabras el orden que tiene la ventana de la q kieres obtener el texto, con ese ejempo puedes hacer otro codigo para que tome el dato que kieres de la ventana hijas que kieres.
para mas info busca info sobre las apis de windows en VB6.
.
la opcion con EnumChildWindows vas a tener que estar Refreshcando con algun timer, con la que te mensione yo (Subclasificar+inyeccion) no harias esto, claro que la opcion de usar EnumChildWindows es menos complejo que la que te propongo y menos codigo claro... aunq ue depende para que quieras los datos externos... y el tiempo de actualizacion del control, si es VARIADO yo te recomendaria la subclasificacion de lo contrario si sigue un patron con algun timer...
@alxspy
Usa las variantes para String... Left$(),
Dulces Lunas!¡.
muchas gracias :) me gusto tu code alxspy, pero lo probe con un jugo y no obtiene los valores de las ventanas hijas, en el caso de los juegos onlines como se podria obtenerlos?. Muchas gracias, me gusta mas la idea de hacerlo inyectando el juego con una dll como dice BlackZero pero no me veo capaz de hacerlo solo :S.
ese problemilla igual lo tenia yo al intentar obtener los HWND de las ventanas del GunBound, pues pasa que en los juegos esas no son ventanas sino solo son graficos.
sabes si existe alguna manera de obtener el texto de un textbox en un juego online??
uhmm tengo poco conocimiento sobre manejo de la memoria , lo que intentaria : usar el ReadProcessMemory para buscar el dato en el proceso (el juego), en el link hay un ejemplo de como puedes buscar una cadena en un proceso :
http://foro.elhacker.net/analisis_y_diseno_de_malware/ocultar_proceso_en_taskmgr_sin_hooks_parte2-t99549.0.html
weno ese te puede servir de ejemplo para hacer un nuevo codigo que busque el dato en el proceso que kieras, asi obtendrias la direccion de memoria de ese dato que buscas, y pues luego con un timer lees a cada momento esa direccion de memoria en la que encontraste ese datoy y listo.
sino puedes revisar este post que trata de inyeccion de una dll en el que cambian el comportamiento del juego de windows "buscaminas" (para mi esto es avansado):
http://foro.elhacker.net/asm/tutoinyeccion_dll_%E2%80%93_full_api-t282673.0.html
ultimo recurso busca el "cheat engine" que es un programa que busca datos en la memoria de un proceso.
Gracias, lo voy a probar aver que tal me va xD, el cheat engine ya es obsoleto en los juegos online... me parecia tambien buena idea lograr crear un programa similar al cheat engine en vb6.0 asi de esta manera poder hacerlo indetectable pero todavia no lo logro xD
SCORPION que quieres hacer?
por lo que entiendo, cambiar una variable en memoria de un juego en el navegador, asi como hace el cheat engine con los juegos en flash.
Wenas... no seria cambiar un dato solo leer un dato, miren es asi: como la mayoria de los juego online existe una barra que es la vida del personaje, yo lo que necesito es captar ese valor. Otro dato similar que necesito captar es cuando una ventana dentro del juego esta abierta y cuando no. Eso es lo que necesitaria... Aclaro que el juego no es de navegador. Muchas gracias por su tiempo :)
no me pueden ayudar?
Deberias usar el Cheat Engine y de ahi hacer el codigo :)
es que en estos juego no se puede usar el cheat engine, ya es demasiado viejo par los juegos online xD
Si lo pones asi seria muy dificil, es web? Usa un control para navegar por ahi. Es flash o Exe? usa cheat engine (a menos que tenga alguna proteccion) :P
La mas dificil, complicada y a veces innecesaria: OCR :P
em si es exe, y tiene proteccion themida :S, bueno y el cheat engine no funciona en estos juegos.. :( poreso yo lo que intentaba hacer es buscar en memoria los datos del juego para asi obtener el dato que necesito, y aclaro no necesito modificarlos... Muchas gracias. espero que me puedan ayudar
holas de nuevo, pero que juego es?
por que dices que no funciona el cheat engine? lo detecta como hack o simplemente no encuentra los datos que buscas?
Hola, en ningun juego online EXE se puede usar el cheat engine, si tienes abirto el cheat engine el juego no abre, y si abres el cheat engine con el juego abierto, el juego se cierra...
Se me ocurrio una forma de hacerlo "Poco profesional" xD
Estuve tratando de obtener un dato del juego atraves de los colores en ciertas coordenadas, es decir en la coordenada X=168 e Y=68 si existe el color rojo es porque todavia tiene XX de vida, bueno realice el programa, pero lo que sucedio es que una ves que abro el juego la API GetPixel o GetWindowsDC parece dejar de funcionar y deja de captar los colores :S. La verdad que nose que proteccion tendra el juego que desactiva algunas apis, al igual que sendkey tampoco funciona.. :S, si alguien tiene alguna idea me ayuda...
Podes probar con alternativas al Cheat Engine :P
a que te referis con alternativas al cheat engine? a programas similares como el moonlignt?, porque es dificil que alla uno que no sea detectado ya que a estos juegos lo actualizan periodicamente para hacer detectados los nuevos "hack" que salgan...
Ingenieria inversa... antes de programar deberas aplicar esto para ver como calcular la dirrecion de la sección que deseas leer.
Prueba con un editor Hexadecimal; Hoy en dia cualquier editor hexadecimal desente te permite leer la memoria de un proceso X... y bueno abria que ver si el bloque a leer es estatica o dinamica, si es lo segundo vas a tener que analizar mas a detalle, si es lo primero lo tendras muy facil.
Edito:
Cuando regrese reviso mi disco duro para ver si aun tengo la version Modificada del Cheat Engine ( No lo detecta ningun juego xP ).
*Intenta cambiarle el Title a la ventana del cheat Engine... seguro los juegos usan FindWindow para ver si esta abierto este programa...
Dulces Lunas!¡.
Hola!, muy buena idea xD no se me habia ocurrido lo del titulo de la ventana, ahora lo probare :P, y con respecto a lo hexadecimal, el 10 editor tiene esta opcion de leer la memoria de un proceso?, es un muy buen editor asi que supongo que lo debe tener xD
EDITO:
¿porque puede ser que dejen de funcionar las API's GetPixel y/o GetWindowsDC? Mientras no entro al juego funciona perfectamente mi programa pero en cuanto abro el juego dejan de funcionar... u.u. No me imagino que puede ser :S
Cita de: ŞCØRPIØN-X3 en 15 Julio 2011, 03:50 AM
EDITO:
¿porque puede ser que dejen de funcionar las API's GetPixel y/o GetWindowsDC? Mientras no entro al juego funciona perfectamente mi programa pero en cuanto abro el juego dejan de funcionar... u.u. No me imagino que puede ser :S
Hay algunas protecciones de software que "impiden" el uso de esas funciones :P
Intente cambiando el titulo del cheat engine y cambiando los datos del fabricante y la version pero no consegui nada :S igual lo sigue detectando u.u. Hay algun code por hay de un programa estilo cheat engine en vb6?? porque ya no se me ocurre nada para hacer indetectable el cheat engine.
Citarholas de nuevo, pero que juego es?
el link que te puse de ejemplo en que resulto? (readprocessmemory), leia algo de datos o te devolvia nulo o nada?
hay 2 codigos fuentes del cheat engine pero esta en delphi, ahi podrias ver como funciona.
edit:
tambien intente cambiando el titulo, nombre del programa pero nada.
y si cambias el titulo de este post por otro que lleve la palabra "cheat", aqui hay usuarios que saben eso de buscar en la memoria y hacer cheat y podrian darte una ayuda con eso, y kizas de paso hacen un tutorial sobre eso y aprendemos xD.
DumpMemory.... creo que lo hizo MadAntraX... revisa en recopilacion de enlaces interesantes ( Los temas pegados ) hay debera estar.
Dulces Lunas!¡.
Cita de: alxspy en 15 Julio 2011, 18:47 PM
tambien intente cambiando el titulo, nombre del programa pero nada.
y si cambias el titulo de este post por otro que lleve la palabra "cheat", aqui hay usuarios que saben eso de buscar en la memoria y hacer cheat y podrian darte una ayuda con eso, y kizas de paso hacen un tutorial sobre eso y aprendemos xD.
xD jaja no me referia al titulo del post :P, me referia al texto de la barra de titulo del cheat engine xD, me dijieron que pruebe con eso para ver si con otro titulo el juego aun me lo detectaba :P.
y con respecto a los links, no son lo que yo buscaba, uno de ellos lo que hace es que el proceso del programa no figure en el administrador de tareas... y en el segundo link se hace uso de un debugger (ollydbg) el cual no se puede ejecutar mientras este el juego abierto :S, el juego no permite la ejecucion de ningun debugger :S
..Investigare un poco mas sobre esa API
-----------------------------------------------------------
BlackZeroX ahora me pondre a ver lo que me dijiste ;)
-----------------------------------------------------------
Acabo de hacer varias pruebas con el proceso del juego y tuve malos resultados :S, al leer la memoria del proceso que supuestamente es del juego, me da 0 Bytes, es decir que no encuentra nada en memoria :S. El juego crea dos procesos:
- XTrap : Proceso del sistema de seguridad
. AikaEN : Supuestamente el proceso del juego xD
Probe leer la memoria del proceso AikaEN usando el DuMper de MadAntrax pero no encuentra datos en la memoria, tambien probe con 2 editores hexadecimales, abriendo el proceso pero tambien me devuelven 0 bytes :S
ya nose que puede ser me da a pensar que el proceso tiene alguna "seguridad" contra lectura :S. El proceso tiene un uso de memoria de 881.928 KB
EDIT: Useless, ya ví que no te sirve cheat engine :P
mmm ninguna idea de como hacerlo?