elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 01:10  


Tema destacado: Grupo de Facebook de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  Obtener puntero de funcion dentro de un form o class.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Obtener puntero de funcion dentro de un form o class.  (Leído 2,177 veces)
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Obtener puntero de funcion dentro de un form o class.
« en: 29 Abril 2011, 04:33 »

Hola, estoy tratando de obtener el puntero de una funcion que esta dentro de un form o class.
La cual no puedo mover a un modulo y usar AddressOf porque es usada por varios hilos, necesito cada funcion independiente. Pero para hacer ello tiene que estar dentro de un class o form, y no puedo obtener su puntero  :-\

Intente esto:

http://www.programmersheaven.com/mb/VBasic/237946/237949/re-hot-to-find-the-address-of-a-function/

Código
Call CallWindowProc(ByVal GetDWORD(ObjPtr(Me) + ((FunctionIndex - 1) * 4) + 12), 0, 0, 0, 0)

Agradeceria de su ayuda  :P


« Última modificación: 29 Abril 2011, 04:42 por F3B14N » En línea
F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #1 en: 29 Abril 2011, 04:45 »

Aqui parece que se obtiene algo parecido: http://cobein.com/wp/?p=236#more-236

Pero no logro obtener el puntero  :-\ Gracias


En línea
Karcrack


Desconectado Desconectado

Mensajes: 2.192


Se siente observado ¬¬'


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #2 en: 30 Abril 2011, 17:15 »

Lo estas haciendo bien, para obtener el puntero has de leer la vTable.... Pero estas leyendo mal el puntero... el puntero a la funcion no se encuentra en el Offset 0xC, sino en el 0x1C... es decir, el puntero estaría aquí:
Código:
ObjPtr(oObjeto) + (Indice * 4) + &H1C

Creo que así podrás obtener el puntero :D
En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #3 en: 30 Abril 2011, 17:44 »

Lo estas haciendo bien, para obtener el puntero has de leer la vTable.... Pero estas leyendo mal el puntero... el puntero a la funcion no se encuentra en el Offset 0xC, sino en el 0x1C... es decir, el puntero estaría aquí:
Código:
ObjPtr(oObjeto) + (Indice * 4) + &H1C

Creo que así podrás obtener el puntero :D

Gracias por tu respuesta karcrack, no lo logré, probé de estas dos formas y mas variantes tambien, pero parece que el puntero no es el correcto.

cls
Código
Option Explicit
 
Public Function llamame(ByVal jj, ByVal dd, ByVal tt, ByVal jaja) As Long
   MsgBox "hola"
End Function
 
Public Sub oo()
   Dim dd As Long
   Dim jj As Long
 
   dd = GetDWORD(ObjPtr(Me))
   jj = GetDWORD(dd + (1 * 4) + &H1C)
   MsgBox jj
   Call CallWindowProc(ByVal jj, 0, 0, 0, 0)
End Sub
 
Private Function GetDWORD(ByVal lAddr As Long) As Long
   Call NtWriteVirtualMemory(-1, GetDWORD, ByVal lAddr, 4, ByVal 0&)
End Function

cls
Código
Option Explicit
 
Public Function llamame(ByVal jj, ByVal dd, ByVal tt, ByVal jaja) As Long
   MsgBox "hola"
End Function
 
Public Sub oo()
   Dim dd As Long
 
   dd = GetDWORD(ObjPtr(Me) + (1 * 4) + &H1C)
   MsgBox dd
   Call CallWindowProc(ByVal dd, 0, 0, 0, 0)
End Sub
 
Private Function GetDWORD(ByVal lAddr As Long) As Long
   Call NtWriteVirtualMemory(-1, GetDWORD, ByVal lAddr, 4, ByVal 0&)
End Function

El intento dos devuelve 3  :-X. Las apis usadas las puse en otro modulo, y a ese class lo llame desde un form. Voy a informarme de la vTable, pero no hay nada mejor que una ayuda de un experto :P

Saludos
En línea
Karcrack


Desconectado Desconectado

Mensajes: 2.192


Se siente observado ¬¬'


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #4 en: 30 Abril 2011, 18:09 »

El indice de la primera funcion es 0... de todas formas ahora abro el OllyDbg y le doy un vistazo ;)
En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #5 en: 30 Abril 2011, 18:17 »

El indice de la primera funcion es 0... de todas formas ahora abro el OllyDbg y le doy un vistazo ;)

Ya habia probado con 0 tambien, pero no va :P

Código
Option Explicit
Private Declare Function NtWriteVirtualMemory Lib "NTDLL" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
Public Function llamame()
   MsgBox "hola"
End Function
 
Public Sub oo()
   Dim lVTE As Long
   Dim lPtr As Long
 
   lVTE = GetDWORD(ObjPtr(Me))
   lPtr = GetDWORD(lVTE + &H1C)
   Call CallWindowProc(ByVal lPtr, 0, 0, 0, 0)
End Sub
 
Private Function GetDWORD(ByVal lAddr As Long) As Long
   Call NtWriteVirtualMemory(-1, GetDWORD, ByVal lAddr, 4, ByVal 0&)
End Function

lPtr parece ser el puntero correcto. Pero da error 'No se establecio la variable object', pareciera que ObjPtr devuelve el puntero de la clase no inicializada, en vez de la clase establecida en el objecto y a eso se debe ese error!!?
El ejemplo de cobein, sobreescribe por el puntero a un ShellCode y por eso no hay error!?

Será posible esto?  :-(
En línea
Karcrack


Desconectado Desconectado

Mensajes: 2.192


Se siente observado ¬¬'


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #6 en: 30 Abril 2011, 18:24 »

Has de tener en cuenta que la forma en la que se llaman las funciones de las clases no es push,push,call... (Que es como el CallWindowProc hace) si no que son cosas raras de COM y yo-que-se :xD
Es decir, aunque consigas el puntero correcto no lo podras llamar asi... Al menos hasta donde yo se
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #7 en: 30 Abril 2011, 22:00 »

.
Quisas ayuden estos....

Cls
Ctl

En ambos se hace una sub-clasificacion pero hara eso se debe obtener el puntero a la función... pero bueno hay esta el código, igual ayuda en algo.

por otro lado un tienes la funcion CallByname de vb6 y tambien tienes la libreria TLI.

Dulces Lunas!¡.
« Última modificación: 30 Abril 2011, 22:02 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
raul338
Moderador
***
Desconectado Desconectado

Mensajes: 2.371


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 #8 en: 3 Mayo 2011, 21:56 »

Nadie destripo el clsSubClass de Paul Caton (la version modificada por LaVolpe muy usado por Leandro y por mi)?? :huh: . En la cual hay una funcion scb_GetCallBackAddr (o similar, estoy en el movil) y scb_ReleaseCallback que justamente devuelven un "AddressOf" del ordinal (nro de funcion en orden descendente, la ultima es 1, la anteultima es 2 y asi) de un objeto (por defecto es el que lo llama) y ademas solo hay que especificar el nro de parametros (se hace magia interna con Asm). Lo unico es que todos los parametros deben ser tipo long y la funcion debe devolver long tambien (los parametros en su mayoria son punteros si es que no son numericos).

Cuando tenga internet en casa (por eso estoy muy desaparecido :xD) subire un ejemplo y varios proyectos que tengo listos
En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: Obtener puntero de funcion dentro de un form o class.
« Respuesta #9 en: 4 Mayo 2011, 00:18 »

Nadie destripo el clsSubClass de Paul Caton (la version modificada por LaVolpe muy usado por Leandro y por mi)?? :huh: . En la cual hay una funcion scb_GetCallBackAddr (o similar, estoy en el movil) y scb_ReleaseCallback que justamente devuelven un "AddressOf" del ordinal (nro de funcion en orden descendente, la ultima es 1, la anteultima es 2 y asi) de un objeto (por defecto es el que lo llama) y ademas solo hay que especificar el nro de parametros (se hace magia interna con Asm). Lo unico es que todos los parametros deben ser tipo long y la funcion debe devolver long tambien (los parametros en su mayoria son punteros si es que no son numericos).

Cuando tenga internet en casa (por eso estoy muy desaparecido :xD) subire un ejemplo y varios proyectos que tengo listos

Creo que hablás de esto: http://siccs.googlecode.com/svn-history/r2/trunk/classes/ClsRueda.cls. Ya habia logrado solucionarlo, pero muy buen codigo. Quizas le sirva a alguien.

Saludos y muchas gracias :D
En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


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

Not Found

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

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 693


Seguime


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

@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
Moderador
***
Desconectado Desconectado

Mensajes: 2.371


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 »

@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 »

Código
Option Explicit
 
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function SetWindowLongA Lib "USER32" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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
Private Const GWL_WNDPROC As Long = -4
Private Const WM_DESTROY As Long = &H2
Private Const WM_MOUSEMOVE As Long = &H200
 
Private PrevWndProc As Long
Private bvASM(103) As Byte
 
Public Function WindowProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   WindowProc = CallWindowProcA(PrevWndProc, Hwnd, Msg, wParam, lParam)
 
   If Msg = WM_DESTROY Then
       Call StopSubclassing(Me.Hwnd)
   ElseIf Msg = WM_MOUSEMOVE Then
       Me.Caption = Timer
   End If
 
End Function
 
Private Sub SetSubclassing(Obj As Object, Hwnd As Long)
   Dim pASMWrapper As Long
   Dim pVar As Long
   Dim pObj As Long
   Dim CallbackFunction As Long
   Dim i As Long
 
   pASMWrapper = VarPtr(bvASM(0))
   pObj = ObjPtr(Obj)
 
   Call CopyMemory(pVar, ByVal pObj, 4)
   pVar = (pVar + 1784) 'Form
   
   Call CopyMemory(CallbackFunction, ByVal pVar, 4)
 
   For i = 0 To 55
       bvASM(i) = Choose(i + 1, &H90, &HFF, &H5, &H0, &H0, &H0, &H0, &H6A, &H0, &H54, &HFF, &H74, &H24, &H18, &HFF, &H74, &H24, _
                                &H18, &HFF, &H74, &H24, &H18, &HFF, &H74, &H24, &H18, &H68, &H0, &H0, &H0, &H0, &HB8, &H0, &H0, _
                                &H0, &H0, &HFF, &HD0, &HFF, &HD, &H0, &H0, &H0, &H0, &HA1, &H0, &H0, &H0, &H0, &H85, &HC0, &H75, _
                                &H4, &H58, &HC2, &H10, &H0, &HA1, &H0, &H0, &H0, &H0, &H85, &HC0, &H74, &H4, &H58, &HC2, &H10, _
                                &H0, &H58, &H59, &H58, &H58, &H58, &H58, &H68, &H0, &H80, &H0, &H0, &H6A, &H0, &H68, &H0, &H0, _
                                &H0, &H0, &H51, &HB8, &H0, &H0, &H0, &H0, &HFF, &HE0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0)
   Next i
 
   'Zahler Variable setzen
   pVar = pASMWrapper + 96
   Call LongToByte(pVar, bvASM, 3)
   Call LongToByte(pVar, bvASM, 40)
   Call LongToByte(pVar, bvASM, 58)
 
   'Flag Variable setzen
   pVar = pASMWrapper + 100
   Call LongToByte(pVar, bvASM, 45)
 
   'Wrapper Adresse setzen
   pVar = pASMWrapper
   Call LongToByte(pVar, bvASM, 84)
 
   'Instanzzeiger setzen
   pVar = pObj
   Call LongToByte(pVar, bvASM, 27)
 
   'Funktionszeiger setze
   pVar = CallbackFunction
   Call LongToByte(pVar, bvASM, 32)
 
   'VirtualFree Adresse setzen
   'pVar = GetProcAddress(GetModuleHandle("KERNEL32"), "VirtualFree")
   'Call LongToByte(pVar, bvASM, 90)
       
   PrevWndProc = SetWindowLongA(Hwnd, GWL_WNDPROC, pASMWrapper)
End Sub
 
Private Sub StopSubclassing(Hwnd)
   Call SetWindowLongA(Hwnd, GWL_WNDPROC, PrevWndProc)
End Sub
 
Private Sub LongToByte(ByVal lLong As Long, ByRef bReturn() As Byte, Optional i As Integer = 0)
   bReturn(i) = lLong And &HFF
   bReturn(i + 1) = (lLong And 65280) / &H100
   bReturn(i + 2) = (lLong And &HFF0000) / &H10000
   bReturn(i + 3) = ((lLong And &HFF000000) \ &H1000000) And &HFF
End Sub
 
Private Sub Form_Load()
   Call SetSubclassing(Me, 0, Me.Hwnd)
End Sub
 

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 por F3B14N » En línea
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 693


Seguime


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

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 por LeandroA » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
manejo de argumentos en funcion dentro de funcion ???
PHP
SpiderNet 2 1,429 Último mensaje 30 Septiembre 2008, 03:01
por SpiderNet
Puntero a función miembro
Programación C/C++
SirLanceCC 12 1,304 Último mensaje 16 Diciembre 2008, 22:12
por ^Tifa^
Error en asignar la función a un "PUNTERO a FUNCIÓN"
Programación C/C++
sysing 3 823 Último mensaje 27 Enero 2009, 07:48
por sysing
puntero a funcion
Programación C/C++
kondrag_X1 2 934 Último mensaje 30 Abril 2011, 19:49
por Leo Gutiérrez.
F1 - Problema con puntero a Función C#
.NET
Maurice_Lupin 0 65 Último mensaje 17 Mayo 2012, 16:14
por Maurice_Lupin
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines