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, 08:54  


Tema destacado: Grupo de Facebook de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  otra forma de llamar a una funcion de una DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: otra forma de llamar a una funcion de una DLL  (Leído 346 veces)
AlxSpy

Desconectado Desconectado

Mensajes: 137


Ver Perfil
otra forma de llamar a una funcion de una DLL
« en: 12 Julio 2011, 16:33 »

consiste en escribir una funcion de usuario publica con los parametros que tendria la funcion api, luego  sobreescribir el inicio de esa funcion con la instruccion en ensablador "jmp" (salto a una direccion) para saltar a una direccion que seria la direccion de la api que queremos llamar, luego al llamar a esa funcion de usuario ejecutariamos la api, ejemplo de como llamar a ShowWindow sin haberlo puesto en la sección Declaraciones:

en un form1: (abrir el notepad para ocultarlo y volverlo visble)

form1
Código
'form1
'agregar controles:
'1 command1
'1 command2

Option Explicit
 
 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
 
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
 
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
 
 
 
Dim hModule As Long
Dim DirProc As Long
Dim DirMiFun As Long
Dim Codigo(1 To 20) As Byte
Dim Distancia As Long
Dim ViejaProte As Long
 
Const jmp = &HE9
 
Const PAGE_EXECUTE_READWRITE As Long = &H40
 
 
Private Sub Command1_Click()
   Dim hwnd As Long
   hwnd = FindWindow("notepad", vbNullString)
   If hwnd = 0 Then
       MsgBox "No se encontro el notepad", vbCritical, ""
       Exit Sub
   Else
       Call MostrarVentana(hwnd, 5)
   End If
End Sub
 
Private Sub Command2_Click()
   Dim hwnd As Long
   hwnd = FindWindow("notepad", vbNullString)
   If hwnd = 0 Then
       MsgBox "No se encontro el notepad", vbCritical, ""
       Exit Sub
   Else
       Call MostrarVentana(hwnd, 0)
   End If
End Sub
 
Private Sub Form_Load()
   hModule = GetModuleHandle("user32")
   DirProc = GetProcAddress(hModule, "ShowWindow")
   DirMiFun = ObtenerMiDir(AddressOf MostrarVentana)
   Distancia = DirProc - DirMiFun - Len(Distancia) - 1
   'intenta cambiar los atributos de esa zona de memoria para sobreescribirlo
   'si se sobreescribe sin cambiar los atributos la aplicacion se cerrara
   If VirtualProtect(ByVal DirMiFun, 1 + Len(Distancia), PAGE_EXECUTE_READWRITE, ViejaProte) <> 0 Then
       Codigo(1) = jmp
       Call CopyMemory(Codigo(2), Distancia, Len(Distancia))
       Call CopyMemory(ByVal DirMiFun, Codigo(1), 1 + Len(Distancia))
       MsgBox "Listo", vbInformation, ""
   Else
       MsgBox "No se pudo cambiar los atributos de la region de memoria: " & DirMiFun & " (MostrarVentana)", vbCritical, ""
   End If
   Command1.Caption = "notepad visible"
   Command2.Caption = "notepad oculto"
End Sub
 
Private Function ObtenerMiDir(FunAddress As Long) As Long
   ObtenerMiDir = FunAddress
End Function
 


module1.bas
Código
Option Explicit
 
 
Public Function MostrarVentana(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
   'esto es nada mas para que tenga un sitio donde sobreescribir, por
   'seguridad sin que vaya afectar a otras instrucciones
   Dim algo As Boolean
   algo = True
   algo = False
End Function
 


edit:
para que funcione compilen el proyecto.


« Última modificación: 12 Julio 2011, 17:04 por alxspy » En línea
raul338
Moderador
***
Desconectado Desconectado

Mensajes: 2.372


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: otra forma de llamar a una funcion de una DLL
« Respuesta #1 en: 12 Julio 2011, 16:48 »

No me funcionó en windows 7 :P


En línea

AlxSpy

Desconectado Desconectado

Mensajes: 137


Ver Perfil
Re: otra forma de llamar a una funcion de una DLL
« Respuesta #2 en: 12 Julio 2011, 16:50 »

compila el proyecto, lo probe en XP y 7 y si me anda.
En línea
raul338
Moderador
***
Desconectado Desconectado

Mensajes: 2.372


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: otra forma de llamar a una funcion de una DLL
« Respuesta #3 en: 12 Julio 2011, 16:57 »

Es verdad, funciona compilado :¬¬
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
llamar funcion
Desarrollo Web
aRTeX 5 642 Último mensaje 4 Junio 2005, 01:23
por MinusFour
llamar a una funcion
Programación Visual Basic
EpicMetal 1 412 Último mensaje 13 Febrero 2006, 23:29
por Kizar
Llamar a una funcion
Programación Visual Basic
Kizar 3 469 Último mensaje 15 Diciembre 2006, 20:22
por ~~
Llamar a una funcion
Programación General
Kizar 3 522 Último mensaje 19 Diciembre 2006, 23:19
por Hendrix
Llamar a una funcion dentro de una funcion
Java
Kerber0 3 8,809 Último mensaje 22 Noviembre 2008, 04:40
por joseprox
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines