Ayuda[Loadlibrary] Cargar apis sin declararlas.

Iniciado por The Swash, 29 Enero 2010, 17:40 PM

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

The Swash

Bueno amigos, sin mas remedio creo que tengo que acudir a su ayuda resulta que de casualidad busque y me tope con esta api que puede cargar junto a otras 2 apis una api sin declararla. Cual es mi problema? mi problema es que no sabria como cargar una api que tenga mas parametros que los de callwindowProc.

Este es un ejemplo funcionando
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Const MB_ICONEXCLAMATION = &H30&
Private Sub Form_load()
Dim hRet As Long
  hRet = GetProcAddress(LoadLibrary("user32"), "MessageBoxW")
   If hRet > 0 Then
    CallWindowProc hRet, Me.hWnd, ByVal StrPtr("xD"), StrPtr(App.Title), MB_ICONEXCLAMATION
   End If
End Sub


Ahora por ejemplo quisiera trabajar con URLDownloadToFile pero explota la APP, quien tenga idea le agradezco..

Karcrack

El problema que tienes es que URLDownloadToFile requiere 5 parametros y solo le pasas, 4, cuando intente leer el 5º hay muchas posibilidades de que falle...

Fijate en algun CallAPIByName y veras lo que hacen :P Usan codigo en ASM para pushear tantos parametros como sea necesario...

Podrias meter el codigo en ASM que pusheara los parametros necesarios en un bytearray y luego cargarlo con CallWindowProc...

Ahora luego pongo un ejemplo ;)

The Swash

Gracias por su respuesta Dr. Karcrack, de acuerdo a lo que dice tiene compelta razon, usan Asm para parchar los parametros adicionales o faltantes.

Googleando encontre un source que ya tenia mi idea xP me ganaron hace un par de años

Aqui se los dejo y espero les sirve, creditos no son mios OpenSC
http://www.sendspace.com/file/he7h1z

Karcrack

Este es el ejemplo que te dije :xD
Código (vb) [Seleccionar]
Option Explicit
'KERNEL32
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcW" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Function Invoke(ByVal lpCode As Long, ParamArray vParams() As Variant) As Long
    Dim i           As Long
    Dim lPtr        As Long
    Dim bvASM(&HFF) As Long
   
    lPtr = VarPtr(bvASM(&H0))
   
    Call AddByte(&H58, lPtr)                    '//POP EAX
    Call AddLong(&H59595959, lPtr)              '//POP ECX (x4)
    Call AddByte(&H50, lPtr)                    '//PUSH EAX
   
    For i = UBound(vParams) To LBound(vParams) Step -1
        Call AddByte(&H68, lPtr)                '//PUSH ________
        Call AddLong(CLng(vParams(i)), lPtr)    '//____ XXXXXXXX
    Next i
   
    Call AddCall(lpCode, lPtr)                  '//CALL lpCode
    Call AddByte(&HC3, lPtr)                    '//RET
    Invoke = CallWindowProc(VarPtr(bvASM(&H0)), ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&)
End Function

Private Sub AddCall(ByVal lpPtrCall As Long, ByRef lPtr As Long)
    Call AddByte(&HE8, lPtr)                    '//CALL ________
    Call AddLong(lpPtrCall - lPtr - 4, lPtr)    '//____ XXXXXXXX
End Sub

Private Sub AddLong(ByVal lLong As Long, ByRef lPtr As Long)
    Call CopyMemory(ByVal lPtr&, lLong, &H4)
    lPtr = lPtr + &H4
End Sub

Private Sub AddByte(ByVal bByte As Byte, ByRef lPtr As Long)
    Call CopyMemory(ByVal lPtr&, bByte, &H1)
    lPtr = lPtr + &H1
End Sub



Ejemplo de uso:
Código (vb) [Seleccionar]
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Sub Form_Load()
    Dim hMod    As Long
   
    hMod = GetProcAddress(LoadLibrary("KERNEL32"), "Beep")
    Call Invoke(hMod, 200, 500)
End Sub