Hola.. nose si me explique bien en el titulo.. pero lo que estoy haciendo
es un programa "Gamer" parecido al IGZones o al antiguo Zone(Recuerdan? que la gente se unia a una partida y luego el Zones ejecutaba el Age Of Empires-Ejemplo- y creaba automaticamente una partida multijugador y entraban los demas) bueno yo creo que ejecutaba el juego y le mandaba la funcion de crear una partida y a los otros de unirse a tal...
Queria saber si alguien conoce esas funciones pero para el juego Baldurs Gate y si hay alguna manera de averiguarlas.
Desde ya, Muchas Gracias...
Un Saludo
Ranslsad
Bueno... si he entendido bien tu pregunta esto debería ir en Ingeniería Inversa, a no ser que el 'Baldurs Gate' sea Open Source y este en VB... :rolleyes:
De otra forma tendrás que destripar el juego...
si le pasas parametros al exe al modo de ejecutar y de tal modo el exe leyera estos?
Compila este source un modulo sin form (proceso inicial "Sub Main()")
sub main()
msgbox command$
end sub
Ejecuta el Exe de la siguiente forma
"C:\APP.exe" parametros
dependiendo de dichos parametros indicados en la ruta del exe se ejecutara una accion determinada algo asi como
ping 127.0.0.1 -n 100
Seria una forma y de seguro hay otrass pero no se, igual se podria crear un temporal con la configuracion y el exe leyera dicho temporal pero a mi me covese mas el anterior.
Saludos, Dulces Lunas
Si BlackZeroҖ
eso es lo que buscaba.. pero..?
hay alguna forma de averiguar los parametros posibles que tenga el juego?...
Desde ya, gracias
Un Saludo
Ranslsad
bueno eso ya lo tendrias que saber, de ultima podes usar programas que te averiguan los parametros con los que le programa se ejecuto...de ahi podes sacar los parametros que acepta el programa...
saludos.
Cita de: seba123neo en 12 Mayo 2009, 02:08 AM
de ultima podes usar programas que te averiguan los parametros con los que le programa se ejecuto...de ahi podes sacar los parametros que acepta el programa...
Mas o menos eso ando buscando.. pero no se por donde buscar....
busco en google con "Parametros" y voy jugando con las palabras pero no me guio bien...
Pro eso estoy pidiendo que me guien un poquitin :P
Salu2
Ranslsad
Hazle Ingenieria inversa... a ver si los cojes....
Saludos.
Cita de: Pein en 12 Mayo 2009, 19:45 PM
Hazle Ingenieria inversa... a ver si los cojes....
Saludos.
:huh: :huh: :huh: :huh:
Igual me quede :P
Salu2
Ranslsad
Para saber con qué parametros se lanza una aplicación programa algo que printee los parámetros con los que se lanza y lo sustituyes por el exe al que le quieres averiguar los parámetos, lo hice una vez para saber con que parámetros se llamaba al compilador de vb, igual te sirve :P.
Saludos
Cita de: Hacker_Zero en 12 Mayo 2009, 20:49 PM
Para saber con qué parametros se lanza una aplicación programa algo que printee los parámetros con los que se lanza y lo sustituyes por el exe al que le quieres averiguar los parámetos, lo hice una vez para saber con que parámetros se llamaba al compilador de vb, igual te sirve :P.
Saludos
De verdad que no entiendo a que se refieren... si entiendo .. pero no el que hacer...
pueden insultarme si quieren.. pero no entiendo hehe...
Salu2
Ranslsad
este modulo lo hizo cobein , aca lo pongo porque no encontre el proyecto para bajarlo...todos los creditos a el..
'---------------------------------------------------------------------------------------
' Module : mReadCommandLine
' DateTime : 26/12/2007 22:48
' Author : Me and some others :D
' Mail : cobein27@hotmail.com
' Purpose : Read command line parameters from an external proc
' Requirements: None
'---------------------------------------------------------------------------------------
Option Explicit
Private Type OBJECT_ATTRIBUTES
Length As Long
RootDirectory As Long
ObjectName As Long
Attributes As Long
SecurityDescriptor As Long
SecurityQualityOfService As Long
End Type
Private Type CLIENT_ID
UniqueProcess As Long
UniqueThread As Long
End Type
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 260
End Type
Private Declare Function NtOpenProcess Lib "NTDLL.DLL" (ByRef ProcessHandle As Long, ByVal AccessMask As Long, ByRef ObjectAttributes As OBJECT_ATTRIBUTES, ByRef ClientID As CLIENT_ID) As Long
Private Declare Function NtClose Lib "NTDLL.DLL" (ByVal ObjectHandle As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Const TH32CS_SNAPPROCESS = &H2
Public Function ProcessCommandLine(ByVal lProcessId As Long) As String
Dim tCLIENT_ID As CLIENT_ID
Dim tOBJECT_ATTRIBUTES As OBJECT_ATTRIBUTES
Dim lRet As Long
Dim sData As String
Dim lProcess As Long
Dim lAddress As Long
Dim lRead As Long
tOBJECT_ATTRIBUTES.Length = Len(tOBJECT_ATTRIBUTES)
tCLIENT_ID.UniqueProcess = lProcessId
lRet = NtOpenProcess(lProcess, &H10, tOBJECT_ATTRIBUTES, tCLIENT_ID)
If lProcess = 0 Then Exit Function
lAddress = GetProcAddress(GetModuleHandle("kernel32"), "GetCommandLineA")
Call CopyMemory(lAddress, ByVal lAddress + 1, &H4)
If ReadProcessMemory(lProcess, ByVal lAddress, lAddress, 4, lRead) Then
sData = String(260, vbNullChar)
If ReadProcessMemory(lProcess, ByVal lAddress, ByVal sData, 260, lRead) Then
ProcessCommandLine = Left(sData, InStr(sData, vbNullChar) - 1)
End If
End If
Call NtClose(lProcess)
End Function
Public Function ObtenerPID(ByVal sEXE As String) As Long
Dim bCopied As Long, lSnapShot As Long
Dim sName As String
Dim tPE As PROCESSENTRY32
lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If lSnapShot < 0 Then Exit Function
tPE.dwSize = Len(tPE)
bCopied = Process32First(lSnapShot, tPE)
Do While bCopied
sName = Left$(tPE.szExeFile, InStr(tPE.szExeFile, Chr(0)) - 1)
sName = Mid(sName, InStrRev(sName, "\") + 1)
If InStr(sName, Chr(0)) Then
sName = Left(sName, InStr(sName, Chr(0)) - 1)
End If
bCopied = Process32Next(lSnapShot, tPE)
If StrComp(sEXE, sName, vbTextCompare) = 0 Then
ObtenerPID = tPE.th32ProcessID
Exit Do
End If
Loop
End Function
eso obtiene los comandos...para hacer funcionarlo tenes que pasarle el PID del proceso que queres saber...para eso hay api's busca que hay en internet...
saludos.
Cita de: seba123neo en 13 Mayo 2009, 01:59 AM
eso obtiene los comandos...para hacer funcionarlo tenes que pasarle el PID del proceso que queres saber...para eso hay api's busca que hay en internet...
saludos.
Bueno gracias .. pero igual no supe utilizarlo.. por ahora
conseguir averiguar el PID del Exe con Este codigo:
En Modulo:
Option Explicit
Public theid As Integer
Public Const NORMAL_PRIORITY_CLASS As Long = &H20
Public Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Public Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadID As Long
End Type
Public Declare Function CreateProcess Lib "kernel32" Alias _
"CreateProcessA" (ByVal lpAppName As String, _
ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, _
ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _
ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
' Returns 0 when successful, process ID and handle are in ProcessInfo
Public Function StartProcess(ByRef sCommandLine As String, _
ByRef ProcessInfo As PROCESS_INFORMATION) As Long
Dim ret As Long
Dim sWokingDir As String
Dim Start As STARTUPINFO
If Len(sCommandLine) > 0 Then
' Initialize the STARTUPINFO structure:
Start.cb = Len(Start)
sWokingDir = App.Path
' Start the process
ret = CreateProcess(vbNullString, sCommandLine, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, sWokingDir, Start, ProcessInfo)
If ret <> 0 Then
' Success
StartProcess = 0
Else
' Failed to start process
Debug.Print "StartProcess failed: LastDllError = " & _
Err.LastDllError
StartProcess = 1
End If
End If
End Function
' Close process and thread handles, must be called when no longer needed
Public Sub ReleaseProcessData(ByRef ProcessInfo As PROCESS_INFORMATION)
If ProcessInfo.hProcess <> 0 Then
'CloseHandle ProcessInfo.hThread
'CloseHandle ProcessInfo.hProcess
'ProcessInfo.hProcess = 0
'ProcessInfo.hThread = 0
End If
End Sub
En Form:
Option Explicit
Private Sub Command1_Click()
Dim ProcessInfo As PROCESS_INFORMATION
StartProcess "C:\Archivos de programa\Black Isle\BGII - SoA\baldur.exe", ProcessInfo
Text1.Text = "Process ID: " & ProcessInfo.dwProcessId
Text1.Text = Text1.Text & vbNewLine & "Process handle: " & ProcessInfo.hProcess
ReleaseProcessData ProcessInfo
End Sub
Con eso saco el ID del exe...
Y nose si soy un poco Ignorante o no me doy cuenta,
pero a tu codigo intente de llamarlo asi:
Private Sub Command2_Click()
ProcessCommandLine(theid)
End Sub
Pero nada sucede... Quizas no se le llame asi o quizas si.. pero nose...
Yo en teoria lo que intento de conseguir es por ejemplo:
Ejecutar Baldurs Gate II Shadows Of Amn y que directamente al ejecutar el juego entre a una partida multijugador como ya dije antes estilo (Zone o el Nuevo IGZones)
Si alguien lo conoce seguro que saben a que me refiero(jugar age of empires en internet)
PD: llame a la funcion asi:
MsgBox ProcessCommandLine(theid)
Mmm pero me muestra la direccion del Juego(Dir del Exe)
PD2: Me di cuenta que el archivo Baldur.exe es un launcher y el archivo BGMain.exe es el juego en Si... pero al intentar de ejecutar ese exe me tira el siguiente error:
(http://img204.imageshack.us/img204/7126/ftoerrorbg.jpg)
Quizas haya que ejecutar ese exe con un parametro.. ahora me queda averiguar como averiguarlo hehe.
PD3: Si voy a la carpeta y hago doble click sobre el archivo BGMain.exe.. si se abre...
PD4: Bueno he ejecutado el BGMain.exe normal, he conseguido su PID y he hecho un timer con la siguiente funcion:
List1.AddItem ProcessCommandLine(theid)
la cual funcionaba mientras yo en el juego toqueteaba botones y eso.. pero no muestra nada...
No se como hacer funcionar este codigo :-\
Desde ya, gracias y sepan disculpar mi ignorancia :huh:
Salu2
Ranslsad
ahi edite el post anterior y agrege para obtener el PID de un proceso segun su nombre...y lo unico que tendrias que hacer es:
MsgBox ProcessCommandLine(ObtenerPID("calc.exe"))
saludos.
OTra forma aparte de la que te proporsionaron es sustituir el EXE de tu juego por un EXE que le haga de intermediario es decir algo asi:
Modulo:
Sub Main()
Dim RutEXE As String, RutEXEParam As String
' Un Fix si App.patch devuelve \ al final, claro ejemplo C:\ u otra unidad.
RutEXE = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
RutEXEParam = RutEXE & "APP.exe " & Command$
Open RutEXE & "Log_Parametros.log" For Binary As 1
Seek 1, LOF(1) + 1
Put 1, , RutEXEParam & vbNewLine
Close 1
Shell RutEXEParam, vbNormalFocus
End Sub
Es facil compila este codigo con el mismo nombre y en dado caso extensión si es requerido por el exe a ver sus parametros directamente
El Archivo que es lanzado habitualmente es un EXE cambiale el nombre a App.exe y este que has compilado ponlo en su lugar, todo ira normal como si nada solo que ese exe intermediario registrara TODOS los parametros antes de ejecutar el eXE Original pedido por tu launcher. es a prueba de error.¡!
Cita de: ░▒▓BlackZeroҖ▓▒░ en 14 Mayo 2009, 07:44 AM
OTra forma aparte de la que te proporsionaron es sustituir el EXE de tu juego por un EXE que le haga de intermediario es decir algo asi:
Modulo:
Sub Main()
Dim RutEXE As String, RutEXEParam As String
' Un Fix si App.patch devuelve \ al final, claro ejemplo C:\ u otra unidad.
RutEXE = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
RutEXEParam = RutEXE & "APP.exe " & Command$
Open RutEXE & "Log_Parametros.log" For Binary As 1
Seek 1, LOF(1) + 1
Put 1, , RutEXEParam & vbNewLine
Close 1
Shell RutEXEParam, vbNormalFocus
End Sub
Es facil compila este codigo con el mismo nombre y en dado caso extensión si es requerido por el exe a ver sus parametros directamente
El Archivo que es lanzado habitualmente es un EXE cambiale el nombre a App.exe y este que has compilado ponlo en su lugar, todo ira normal como si nada solo que ese exe intermediario registrara TODOS los parametros antes de ejecutar el eXE Original pedido por tu launcher. es a prueba de error.¡!
Bueno les comento como hice todo....
Primero baje el GameSpy que tiene los comandos para tal juego =)
Luego utilice el codigo de ░▒▓BlackZeroҖ▓▒░ [Te amo :P] que es la caña!!
Y ya tengo el comando!!!!
Gracias a todos!!!!!
Salu2
Ranslsad