elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Obtener puntero de funcion dentro de un form o class.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Obtener puntero de funcion dentro de un form o class.  (Leído 13,516 veces)
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #10 en: 4 Mayo 2011, 03:56 am »

Not Found

The requested URL /svn/!svn/bc/2/trunk/classes/ClsRueda.cls. was not found on this server.

Dulces Lunas!¡.


En línea

The Dark Shadow is my passion.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #11 en: 4 Mayo 2011, 04:50 am »

@BlackZerox: Quitale el punto al final

creo que lo mejor que veas estos links
http://www.activevb.de/tutorials/tut_subclass_asm/tut_subclass_asm.html

y descargate este .zip que esta muy bueno.

http://www.activevb.de/rubriken/klassen/windows/csubclasser/subclasser.zip

pd: yo estoy utilzando estas clases y uc pero me me suelen crashear cuando llama a VirtualFree, creo que esto ocurre cuando llega un msg a WindowProc  y llame a VirtualFree, no quiero dar un ejemplo exacto para no irme por las ramas pero si alguien le encuentra una solución o quiere que entre en detalles que chifle.

Saluods.



En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #12 en: 4 Mayo 2011, 19:14 pm »

@BlackZerox: Quitale el punto al final

creo que lo mejor que veas estos links
http://www.activevb.de/tutorials/tut_subclass_asm/tut_subclass_asm.html
No se aleman pero por lo que vi. Es similar a un codigo que vi de "AND ray" implementando las novedades de win7 en vb (busquen "iTaskBarList3" en planet source code) que llamaba a una interfaz (no probe con objetos) a partir de su ordinal y un maximo de 15 parametros (segun recuerdo) pero no se podia obtener el valor devuelto. Usaba un ASM similar
En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #13 en: 5 Mayo 2011, 17:22 pm »

Código
  1. Option Explicit
  2.  
  3. Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  4. Private Declare Function SetWindowLongA Lib "USER32" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  5. Private Declare Function CallWindowProcA Lib "USER32" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  6. Private Const GWL_WNDPROC As Long = -4
  7. Private Const WM_DESTROY As Long = &H2
  8. Private Const WM_MOUSEMOVE As Long = &H200
  9.  
  10. Private PrevWndProc As Long
  11. Private bvASM(103) As Byte
  12.  
  13. Public Function WindowProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  14.    WindowProc = CallWindowProcA(PrevWndProc, Hwnd, Msg, wParam, lParam)
  15.  
  16.    If Msg = WM_DESTROY Then
  17.        Call StopSubclassing(Me.Hwnd)
  18.    ElseIf Msg = WM_MOUSEMOVE Then
  19.        Me.Caption = Timer
  20.    End If
  21.  
  22. End Function
  23.  
  24. Private Sub SetSubclassing(Obj As Object, Hwnd As Long)
  25.    Dim pASMWrapper As Long
  26.    Dim pVar As Long
  27.    Dim pObj As Long
  28.    Dim CallbackFunction As Long
  29.    Dim i As Long
  30.  
  31.    pASMWrapper = VarPtr(bvASM(0))
  32.    pObj = ObjPtr(Obj)
  33.  
  34.    Call CopyMemory(pVar, ByVal pObj, 4)
  35.    pVar = (pVar + 1784) 'Form
  36.  
  37.    Call CopyMemory(CallbackFunction, ByVal pVar, 4)
  38.  
  39.    For i = 0 To 55
  40.        bvASM(i) = Choose(i + 1, &H90, &HFF, &H5, &H0, &H0, &H0, &H0, &H6A, &H0, &H54, &HFF, &H74, &H24, &H18, &HFF, &H74, &H24, _
  41.                                 &H18, &HFF, &H74, &H24, &H18, &HFF, &H74, &H24, &H18, &H68, &H0, &H0, &H0, &H0, &HB8, &H0, &H0, _
  42.                                 &H0, &H0, &HFF, &HD0, &HFF, &HD, &H0, &H0, &H0, &H0, &HA1, &H0, &H0, &H0, &H0, &H85, &HC0, &H75, _
  43.                                 &H4, &H58, &HC2, &H10, &H0, &HA1, &H0, &H0, &H0, &H0, &H85, &HC0, &H74, &H4, &H58, &HC2, &H10, _
  44.                                 &H0, &H58, &H59, &H58, &H58, &H58, &H58, &H68, &H0, &H80, &H0, &H0, &H6A, &H0, &H68, &H0, &H0, _
  45.                                 &H0, &H0, &H51, &HB8, &H0, &H0, &H0, &H0, &HFF, &HE0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0)
  46.    Next i
  47.  
  48.    'Zahler Variable setzen
  49.    pVar = pASMWrapper + 96
  50.    Call LongToByte(pVar, bvASM, 3)
  51.    Call LongToByte(pVar, bvASM, 40)
  52.    Call LongToByte(pVar, bvASM, 58)
  53.  
  54.    'Flag Variable setzen
  55.    pVar = pASMWrapper + 100
  56.    Call LongToByte(pVar, bvASM, 45)
  57.  
  58.    'Wrapper Adresse setzen
  59.    pVar = pASMWrapper
  60.    Call LongToByte(pVar, bvASM, 84)
  61.  
  62.    'Instanzzeiger setzen
  63.    pVar = pObj
  64.    Call LongToByte(pVar, bvASM, 27)
  65.  
  66.    'Funktionszeiger setze
  67.    pVar = CallbackFunction
  68.    Call LongToByte(pVar, bvASM, 32)
  69.  
  70.    'VirtualFree Adresse setzen
  71.    'pVar = GetProcAddress(GetModuleHandle("KERNEL32"), "VirtualFree")
  72.    'Call LongToByte(pVar, bvASM, 90)
  73.  
  74.    PrevWndProc = SetWindowLongA(Hwnd, GWL_WNDPROC, pASMWrapper)
  75. End Sub
  76.  
  77. Private Sub StopSubclassing(Hwnd)
  78.    Call SetWindowLongA(Hwnd, GWL_WNDPROC, PrevWndProc)
  79. End Sub
  80.  
  81. Private Sub LongToByte(ByVal lLong As Long, ByRef bReturn() As Byte, Optional i As Integer = 0)
  82.    bReturn(i) = lLong And &HFF
  83.    bReturn(i + 1) = (lLong And 65280) / &H100
  84.    bReturn(i + 2) = (lLong And &HFF0000) / &H10000
  85.    bReturn(i + 3) = ((lLong And &HFF000000) \ &H1000000) And &HFF
  86. End Sub
  87.  
  88. Private Sub Form_Load()
  89.    Call SetSubclassing(Me, 0, Me.Hwnd)
  90. End Sub
  91.  

Gracias por la data Leandro, ahi deje el codigo un poco mas limpio para quien lo necesite, igualmente simplificar mucho el asm.

Saludos
« Última modificación: 5 Mayo 2011, 17:29 pm por F3B14N » En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #14 en: 5 Mayo 2011, 19:27 pm »

muy bueno F3B14N, veo que eliminaste VirtualAlloc y VirtualFree con lo que se termino el problema que mencionaba anteriormente al parecer todo funciona de lujo  :), además se simplifico mucho mas.

Gracias por compartirlo.

PD: fijate quizas te guste mas para crear el ASM(), creo que asi lo hacia Cobein.

Código:
        Dim sCode As String

   
        sCode = "90FF05000000006A0054FF742418FF742418FF742418FF7424186800000000B800000000FFD0FF0D00000000A10000000085C075" & _
                "0458C21000A10000000085C0740458C2100058595858585868008000006A00680000000051B800000000FFE00000000000000000"
               
        For i = 0 To Len(sCode) - 1 Step 2
            bvASM(i / 2) = CByte("&h" & Mid$(sCode, i + 1, 2))
        Next
Saludos.
« Última modificación: 5 Mayo 2011, 19:32 pm por LeandroA » En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #15 en: 6 Mayo 2011, 17:13 pm »

muy bueno F3B14N, veo que eliminaste VirtualAlloc y VirtualFree con lo que se termino el problema que mencionaba anteriormente al parecer todo funciona de lujo  :), además se simplifico mucho mas.

Gracias por compartirlo.

PD: fijate quizas te guste mas para crear el ASM(), creo que asi lo hacia Cobein.

Código:
        Dim sCode As String

   
        sCode = "90FF05000000006A0054FF742418FF742418FF742418FF7424186800000000B800000000FFD0FF0D00000000A10000000085C075" & _
                "0458C21000A10000000085C0740458C2100058595858585868008000006A00680000000051B800000000FFE00000000000000000"
               
        For i = 0 To Len(sCode) - 1 Step 2
            bvASM(i / 2) = CByte("&h" & Mid$(sCode, i + 1, 2))
        Next
Saludos.

Por nada Leandro, aqui esta aun mas simple :-X :

Código
  1. Option Explicit
  2.  
  3. Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  4. Private Declare Function SetWindowLongA Lib "USER32" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  5. Private Declare Function CallWindowProcA Lib "USER32" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  6. Private Const GWL_WNDPROC As Long = -4
  7. Private Const WM_DESTROY As Long = &H2
  8. Private Const WM_MOUSEMOVE As Long = &H200
  9.  
  10. Private PrevWndProc As Long
  11. Private bvASM(40) As Byte
  12.  
  13. Public Function WindowProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  14.    WindowProc = CallWindowProcA(PrevWndProc, Hwnd, Msg, wParam, lParam)
  15.  
  16.    If Msg = WM_DESTROY Then
  17.        Call StopSubclassing(Me.Hwnd)
  18.    ElseIf Msg = WM_MOUSEMOVE Then
  19.        Me.Caption = Timer
  20.    End If
  21. End Function
  22.  
  23. Private Sub SetSubclassing(Obj As Object, Hwnd As Long)
  24.    Dim WindowProcAddress As Long
  25.    Dim pObj As Long
  26.    Dim pVar As Long
  27.  
  28.    Dim i As Long
  29.  
  30.    For i = 0 To 40
  31.        bvASM(i) = Choose(i + 1, &H55, &H8B, &HEC, &H83, &HC4, &HFC, &H8D, &H45, &HFC, &H50, &HFF, &H75, &H14, _
  32.                                 &HFF, &H75, &H10, &HFF, &H75, &HC, &HFF, &H75, &H8, &H68, &H0, &H0, &H0, &H0, _
  33.                                 &HB8, &H0, &H0, &H0, &H0, &HFF, &HD0, &H8B, &H45, &HFC, &HC9, &HC2, &H10, &H0)
  34.    Next i
  35.  
  36.    pObj = ObjPtr(Obj)
  37.  
  38.    Call CopyMemory(pVar, ByVal pObj, 4)
  39.    Call CopyMemory(WindowProcAddress, ByVal (pVar + 1784), 4)
  40.  
  41.    Call LongToByte(pObj, bvASM, 23)
  42.    Call LongToByte(WindowProcAddress, bvASM, 28)
  43.  
  44.    PrevWndProc = SetWindowLongA(Hwnd, GWL_WNDPROC, VarPtr(bvASM(0)))
  45. End Sub
  46.  
  47. Private Sub StopSubclassing(Hwnd)
  48.    Call SetWindowLongA(Hwnd, GWL_WNDPROC, PrevWndProc)
  49. End Sub
  50.  
  51. Private Sub LongToByte(ByVal lLong As Long, ByRef bReturn() As Byte, Optional i As Integer = 0)
  52.    bReturn(i) = lLong And &HFF
  53.    bReturn(i + 1) = (lLong And 65280) / &H100
  54.    bReturn(i + 2) = (lLong And &HFF0000) / &H10000
  55.    bReturn(i + 3) = ((lLong And &HFF000000) \ &H1000000) And &HFF
  56. End Sub
  57.  
  58. Private Sub Form_Load()
  59.    Call SetSubclassing(Me, 0, Me.Hwnd)
  60. End Sub
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #16 en: 7 Mayo 2011, 12:02 pm »

Simplemente asombroso la verdad acostumbrado a utilizar la clase de Paul Caton  que son muchisimas lineas, con esto esta barbaro.

para informacion a todos, si quieren utilizarlo desde un modulo clase cambiar este valor en esta linea
Código:
Call CopyMemory(WindowProcAddress, ByVal (pVar + 1784), 4)
para un modulo clase cambiar 1784 por 28
y para un User Control  por 1956

Seguramente me surjan algunas dudas mas adelante sobre como implementar un subclass y un Api Timer en un mismo modulo o bien dos Sub para distintos hilos.
si tenes idea postealo para agendarlo.

Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #17 en: 8 Mayo 2011, 02:22 am »

.
ja ja ja por lo menos no me funciona este codigo creando una ventana con CreateWindowEx y despues sud-clásificandola TODO desde el modulo de clase xP.

cambiando como ya menciono LeandroA: 1784 por 28 en la linea ya indicada anteriormente.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #18 en: 8 Mayo 2011, 04:26 am »

.
ja ja ja por lo menos no me funciona este codigo creando una ventana con CreateWindowEx y despues sud-clásificandola TODO desde el modulo de clase xP.

cambiando como ya menciono LeandroA: 1784 por 28 en la linea ya indicada anteriormente.

Dulces Lunas!¡.

jejerejerejoju
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #19 en: 8 Mayo 2011, 06:39 am »

 :¬¬ :¬¬ :¬¬
En línea

The Dark Shadow is my passion.
Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
puntero a funcion
Programación C/C++
kondrag_X1 2 3,609 Último mensaje 30 Abril 2011, 19:49 pm
por leogtz
F1 - Problema con puntero a Función C#
.NET (C#, VB.NET, ASP)
Maurice_Lupin 0 2,185 Último mensaje 17 Mayo 2012, 16:14 pm
por Maurice_Lupin
Como obtener posicion mouse dentro de scrollpane?
Java
juancaa 2 3,780 Último mensaje 25 Junio 2012, 11:44 am
por juancaa
copiar contenido dentro de un div class con webbrowser?
.NET (C#, VB.NET, ASP)
housedir 1 2,829 Último mensaje 6 Agosto 2012, 22:58 pm
por seba123neo
[Resuelto] Obtener dentro de función referencia a llamante
PHP
Usuario Invitado 2 2,294 Último mensaje 20 Enero 2015, 20:37 pm
por Usuario Invitado
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines