VB.NET Overlay in Games Full Screen

Iniciado por **Aincrad**, 22 Octubre 2018, 16:27 PM

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

**Aincrad**

Hola, Bueno mi duda es como haría yo para Sobreponer Un formulario encima de un juego Direcx En pantalla Completa, El compañero @Elektro lo logro con la api de SharpDX, Bueno yo he logrado casi lo mismo pero Con una api Direxc , he logrado hasta ahora sobreponer texto y dibujar en juegos en pantalla completa que usan direcx 9 ,  Ya puedo Simplemente dibujar un menu d3d y listo creo las funciones y hago un hack, pero no logro ni tengo idea de como sobreponer el Formulario. Necesito ayuda en eso.

La api que estoy usando :

DX9-Overlay-API

Documentación




Bueno y como siempre, yo no planteo nada sin algo de codigo :

Wrapper :

DX9Overlay.vb --- Clase


Código (vbnet) [Seleccionar]
Imports System
Imports System.Runtime.InteropServices

Namespace DX9OverlayAPI
   Class DX9Overlay
       Public Const PATH As String = "dx9_overlay.dll"
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextCreate(ByVal font As String, ByVal fontSize As Integer, ByVal bBold As Boolean, ByVal bItalic As Boolean, ByVal x As Integer, ByVal y As Integer, ByVal color As UInteger, ByVal text As String, ByVal bShadow As Boolean, ByVal bShow As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode)>
       Public Shared Function TextCreateUnicode(ByVal font As String, ByVal fontSize As Integer, ByVal bBold As Boolean, ByVal bItalic As Boolean, ByVal x As Integer, ByVal y As Integer, ByVal color As UInteger, ByVal text As String, ByVal bShadow As Boolean, ByVal bShow As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextDestroy(ByVal id As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextSetShadow(ByVal id As Integer, ByVal b As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextSetShown(ByVal id As Integer, ByVal b As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextSetColor(ByVal id As Integer, ByVal color As UInteger) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextSetPos(ByVal id As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextSetString(ByVal id As Integer, ByVal str As String) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode)>
       Public Shared Function TextSetStringUnicode(ByVal id As Integer, ByVal str As String) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function TextUpdate(ByVal id As Integer, ByVal font As String, ByVal fontSize As Integer, ByVal bBold As Boolean, ByVal bItalic As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode)>
       Public Shared Function TextUpdateUnicode(ByVal id As Integer, ByVal font As String, ByVal fontSize As Integer, ByVal bBold As Boolean, ByVal bItalic As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxCreate(ByVal x As Integer, ByVal y As Integer, ByVal w As Integer, ByVal h As Integer, ByVal dwColor As UInteger, ByVal bShow As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxDestroy(ByVal id As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetShown(ByVal id As Integer, ByVal bShown As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetBorder(ByVal id As Integer, ByVal height As Integer, ByVal bShown As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetBorderColor(ByVal id As Integer, ByVal dwColor As UInteger) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetColor(ByVal id As Integer, ByVal dwColor As UInteger) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetHeight(ByVal id As Integer, ByVal height As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetPos(ByVal id As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function BoxSetWidth(ByVal id As Integer, ByVal width As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function LineCreate(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal width As Integer, ByVal color As UInteger, ByVal bShow As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function LineDestroy(ByVal id As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function LineSetShown(ByVal id As Integer, ByVal bShown As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function LineSetColor(ByVal id As Integer, ByVal color As UInteger) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function LineSetWidth(ByVal id As Integer, ByVal width As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function LineSetPos(ByVal id As Integer, ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ImageCreate(ByVal path As String, ByVal x As Integer, ByVal y As Integer, ByVal rotation As Integer, ByVal align As Integer, ByVal bShow As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ImageDestroy(ByVal id As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ImageSetShown(ByVal id As Integer, ByVal bShown As Boolean) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ImageSetAlign(ByVal id As Integer, ByVal align As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ImageSetPos(ByVal id As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ImageSetRotation(ByVal id As Integer, ByVal rotation As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function DestroyAllVisual() As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function ShowAllVisual() As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function HideAllVisual() As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function GetFrameRate() As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function GetScreenSpecs(<Out> ByRef width As Integer, <Out> ByRef height As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function SetCalculationRatio(ByVal width As Integer, ByVal height As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function SetOverlayPriority(ByVal id As Integer, ByVal priority As Integer) As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Function Init() As Integer
       End Function
       <DllImport(PATH, CallingConvention:=CallingConvention.Cdecl)>
       Public Shared Sub SetParam(ByVal _szParamName As String, ByVal _szParamValue As String)
       End Sub
   End Class
End Namespace


En el Form1, Un ejemplo de como Dibujar texto, Cuadro o linea :

Código (vbnet) [Seleccionar]
Imports System
Imports DX9OverlayAPI

Public Class Form1

   Shared overlayText As Integer = -1
   Shared overlayBox As Integer = -1
   Shared overlayLine As Integer = -1

   Private Sub texto()
       DX9Overlay.SetParam("process", "hl2.exe")
       DX9Overlay.DestroyAllVisual()
       overlayText = DX9Overlay.TextCreateUnicode("Arial", 12, False, False, 200, 200, 4278255615, "Hello world!", True, True)
   End Sub

   Private Sub linea()
       DX9Overlay.SetParam("process", "hl2.exe")
       DX9Overlay.DestroyAllVisual()
       overlayLine = DX9Overlay.LineCreate(0, 0, 300, 300, 5, 4294967295, True)
   End Sub

   Private Sub caja()
       DX9Overlay.SetParam("process", "hl2.exe")
       DX9Overlay.DestroyAllVisual()
       overlayBox = DX9Overlay.BoxCreate(200, 200, 100, 100, 1358889215, True)
   End Sub

   Private Sub eliminarTodo()
       DX9Overlay.TextDestroy(overlayText)
       DX9Overlay.BoxDestroy(overlayBox)
       DX9Overlay.LineDestroy(overlayLine)
   End Sub

End Class






Y bueno la .DLL no la agregan a referencias, solo la colocan en donde esta su .exe . osea en la carpeta .\bin\Debug\  DLL

Gracias de antemano, solo quiero superponer el Formulario no dibujar y no se como hacer eso.


PD : @Elektro Pasaste de Mod. Global a Colaborador? como @Shell Root? Colaborador no es un rango menor al q tenias? , que paso? tu eres el que mas ayuda al foro y te bajan de rango. están bien pendejos.





Eleкtro

#1
Cita de: **Aincrad** en 22 Octubre 2018, 16:27 PMPD : @Elektro Pasaste de Mod. Global a Colaborador? como @Shell Root? Colaborador no es un rango menor al q tenias? , que paso? tu eres el que mas ayuda al foro y te bajan de rango.

están bien pendejos.


( Si lo dice Spidey, es cierto. )

Pues así ha sido, tuve que soportar tonterías de chiquillos que se creen reyes del mambo, bueno, de un único chiquillo en particular, no culpo a nadie más. Abuso de autoridad y totalitarismo al estilo Pedro Sanchez (el presidente de España), y esas cosas, el pan de cada día en esta sociedad putrefacta en la que vivimos, la cual afecta a todos los rincones del planeta incluyendo esta querida comunidad de elhacker.net... nada ni nadie se salva de acabar propagando su granito de contaminación y toxicidad a los demás... (de hecho, incluso sin querer hacerlo creo que lo acabo de hacer yo también xD)

Ah, si, lo que yo quería comentar a este tema era...: ¿por qué no usaste SharpDX?, es un wrapper de DirectX, lo mejorcito que hay para .NET. Yo no tuve problema para superponer/dibujar un Form sobre la superficie de un video juego en pantalla completa. Si no recuerdo mal te mostré el código al completo (creo que si, ¿no?), ¿que ocurrió pues?, ¿no lo supiste adaptar para tus propósitos?, ¿no te sirvió?.

Saludos!








**Aincrad**

Cita de: Eleкtro (sin pilas) en 21 Noviembre 2018, 03:56 AM
Ah, si, lo que yo quería comentar a este tema era...: ¿por qué no usaste SharpDX?, es un wrapper de DirectX, lo mejorcito que hay para .NET. Yo no tuve problema para superponer/dibujar un Form sobre la superficie de un video juego en pantalla completa. Si no recuerdo mal te mostré el código al completo (creo que si, ¿no?), ¿que ocurrió pues?, ¿no lo supiste adaptar para tus propósitos?, ¿no te sirvió?.

Saludos!




Bueno lo único que me mostraste fue el vídeo de como funcionaba y no se ve claramente el código.

Estuve Investigando mucho sobre este asunto y es mas complicado de lo que parece, se supone que los juegos Direcx "Secuestran" por así decirlo el monitor y para poder dibujar/ Sobreponer necesitas usar la api de direcx (D3D9.DLL) o En su equivalente usar SharpDX un wrapper de Direcx , Después de eso tengo que conectar con la Función de Direcx Edn Scene para poder Dibujar sobre la pantalla.


Al hacer esta Investigación en la cual dure mas de 2 semanas, me he dado cuenta que nadien ha podido lograr lo que tu hiciste en vb.net (Sobreponer Un formulario con controles).


ese es otro problema, el Sobreponer Controles / Objetos COM .  en pocas palabras :,v ya me he rendido con esto, Incluso mi ultimo hack no lo complete por esto mismo.

Logre hacer un Overlay decente, sin retraso, con seguimiento de ventana, etc .. pero el problemas es ese de no poder sobreponer el formulario sobre el juego en pantalla completa.















Serapis

A ver, es que si está en pantalla completa, el foco se centra exclusivamente sobre el hDC que tiene el foco...

Se me ocurre, que lo cambies para que no esté en pantalla completa (SetWindowLong, con el estilo apropiado), y que aún así se baje la barra de herramientas (la systray) y la ventana con solo un 2 píxeles menos de ancho y alto que el escritorio... así no está en pantalla completa, pero lo parece y por tanto tolera otra ventana sin exclusividad.

Eleкtro

#4
Cita de: **Aincrad** en 21 Noviembre 2018, 05:10 AM

Estuve Investigando mucho sobre este asunto y es mas complicado de lo que parece, se supone que los juegos Direcx "Secuestran" por así decirlo el monitor y para poder dibujar/ Sobreponer necesitas usar la api de direcx (D3D9.DLL) o En su equivalente usar SharpDX un wrapper de Direcx , Después de eso tengo que conectar con la Función de Direcx Edn Scene para poder Dibujar sobre la pantalla.

Solo conozco el modo de empleo de las librerías de DirectX en el nivel de abstracción que provee SharpDX. Sobre el funcionamiento "interno" por así decirlo (las llamadas realizadas a funciones de la API de Direct-3D, 2D, DXGI y etc. ) no tengo ni pajolera idea. No soy desarrollador de videojuegos ni de HUDs/Cheats/Trainers/LoQueSea.

CitarAl hacer esta Investigación en la cual dure mas de 2 semanas, me he dado cuenta que nadien ha podido lograr lo que tu hiciste en vb.net (Sobreponer Un formulario con controles).

Te has equivocado. Lo que viste en aquél video que te mostré era el juego ARK, en modo pantalla completa sin bordes.

Yo tampoco lo logré hacer en pantalla completa "real" y también me pasé semanas investigando y preguntando a profesionales, para ser más específico incluso le llegué a preguntar al creador del HUD 'TurboHUD' para Diablo 3 ( @KillerJhon: https://www.ownedcore.com/forums/diablo-3/turbohud/ ), quien me orientó un poco con el uso básico de SharpDX y aparte me dijo que NO era posible renderizar el Form en pantalla completa "real". Y si lo dice alguien como él, pues será por algo.

Y es que por lo que he llegado a ver no en pocas ocasiones, suele ser un requisito de lo más común que la ventana del juego esté en modo a pantalla completa pero sin bordes (full-screen borderless) para que el HUD/cheto funcione bien, para que se pueda renderizar, ya que la mayoría de HUDs/chetos hoy en día no pueden funcionar a pantalla completa "real".

No se por que motivo ellos, los profesionales, no pueden lograrlo, lo que si se que el modo pantalla completa "real" es un modo exclusivo donde la GPU "toma el control" por así decirlo y se encarga directamente del renderizado; supongo que habría que dibujar directamente en el buffer de la GPU, y supongo que esto es lo que resultará tan complicado, no lo se a ciencia cierta, solo es una hipótesis sin mucho fundamento. No se exactamente como funciona, pero se que es complicado cuando los profesionales tampoco lo pueden lograr, o quizás si que sepan como hacerlo pero prefieren no hacerlo por el costoso trabajo que implicaría.

Sin embargo, yo creo que si que se debe poder hacer, puesto que hace años he jugado a juegos en pantalla completa "real" con HUDs, sin ir más lejos el Counter-Strike.

Un saludo.








**Aincrad**

He encontrado una solución a este problema para los Counter Strike. (no lo he probado en el Global Offensive) por mi pc kk.

Bueno como mencione antes Los juegos Direcx "Secuestran" (literalmente) la pantalla, pero me había olvidado que Counter Strike posee la opción de cambiar de Direcx a OpenGL.

Bueno solo cambian en Opciones de Video , ponen el usar OpenGL, y si sirve, lo malo es que al presionar la tecla designada para aparecer el hack en mi caso "Insert" el juego se minimiza, pero eso lo puedo solucionar. XD





Me Imagino que este método funcionara para todos los juegos que puedan usar OpenGL.




Respuestas:

P:  Hey pero da mucha flojera y a cambiar la configuraciones del juego.

R: Muchos Juegos tienen argumentos comand-line que puedes usar en tu launcher. Por ejemplo Counter Strike Source Y EL 1.6 :

Puedes usar el argumento : -gl y el juego iniciara con OpenGL

Aunque la Idea Principal es lograrlo poner arriba de un juego direcx esto es complicado. y no muchos lo han logrado. (Creo que nadien  :silbar: )




Imagen:









BloodSharp

#6
Cita de: **Aincrad** en 23 Noviembre 2018, 01:44 AMAunque la Idea Principal es lograrlo poner arriba de un juego direcx esto es complicado. y no muchos lo han logrado. (Creo que nadien  :silbar: )

Yo no te recomendaría trabajar de esa manera externa :P (al menos para empezar a hackear un juego), calculo que estarás usando las versiones piratas por este comentario:

Cita de: **Aincrad** en 23 Noviembre 2018, 01:44 AMCounter Strike posee la opción de cambiar de Direcx a OpenGL.

...según recuerdo las últimas versiones de steam no vienen más con el dx antiguo.

Cita de: **Aincrad** en 23 Noviembre 2018, 01:44 AMBueno solo cambian en Opciones de Video , ponen el usar OpenGL, y si sirve, lo malo es que al presionar la tecla designada para aparecer el hack en mi caso "Insert" el juego se minimiza, pero eso lo puedo solucionar. XD

Yo te recomiendo crear una dll e inyectarla sobre el proceso y hookear DX/OGL según sea el caso trabajando de manera interna en el juego, por otro lado si vás a la larga a utilizar el juego original con VAC y o trucho con algún anticheat de tercero, te recomiendo buscar info acerca de ese anticheat primero, aparte de analizarlo por cuenta propia que suma mucha más experiencia...

Esto es hookeando DX9 en el csgo:



y esto es hookeando OpenGL en el cs 1.6:




B#



**Aincrad**

#7
Primero Gracias por tu respuesta, Bueno creo que no has leído de que trata este tema, lo que estoy tratando de hacer es  Mostrar un Formulario con controles (Objetos COM) encima de un juego direcx .

El cianosfera hack tengo entendido que funciona dibujando sobre el juego usando direcx y tambien IMGUI o Eso me dijeron cuando pregunte en el foro unknowncheats la verdad no estoy seguro . (https://github.com/ocornut/imgui) y de paso conecta con End Scene, eso es lo que yo podría hacer, pero el desafió aquí es mostrar un form encima del juego.





BloodSharp

#8
Cita de: **Aincrad** en 23 Noviembre 2018, 02:40 AM
El cianosfera hack tengo entendido que funciona dibujando sobre el juego usando direcx y tambien IMGUI (https://github.com/ocornut/imgui) y de paso conecta con End Scene, eso es lo que yo podría hacer, pero el desafió aquí es mostrar un form encima del juego.

Exacto hookeo EndScene, Reset (para prevenir que se rompa el juego) y el WndProc para el teclado/mouse (para la versión de OpenGL tuve que crear un backend de WINAPI+OpenGL desde cero), aunque también tenía pensado para el csgo implementar una gui desde cero al final...

Mmm, ¿probaste con la propiedad TopMost?


B#



**Aincrad**

Cita de: BloodSharp en 23 Noviembre 2018, 02:51 AM
Exacto hookeo EndScene, Reset (para prevenir que se rompa el juego) y el WndProc para el teclado/mouse (para la versión de OpenGL tuve que crear un backend de WINAPI+OpenGL desde cero), aunque también tenía pensado para el csgo implementar una gui desde cero al final...

Mmm, ¿probaste con la propiedad TopMost?


B#

Si, pero la verdad nada sirve, tu dibujas sobre el juego ?? , como le haces??