Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: The Swash en 29 Enero 2010, 17:40 pm



Título: Ayuda[Loadlibrary] Cargar apis sin declararlas.
Publicado por: The Swash en 29 Enero 2010, 17:40 pm
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
Código:
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..


Título: Re: Ayuda[Loadlibrary] Cargar apis sin declararlas.
Publicado por: Karcrack en 29 Enero 2010, 17:50 pm
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 ;)


Título: Re: Ayuda[Loadlibrary] Cargar apis sin declararlas.
Publicado por: The Swash en 1 Febrero 2010, 16:13 pm
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
Código:
http://www.sendspace.com/file/he7h1z


Título: Re: Ayuda[Loadlibrary] Cargar apis sin declararlas.
Publicado por: Karcrack en 1 Febrero 2010, 17:31 pm
Este es el ejemplo que te dije :xD
Código
  1. Option Explicit
  2. 'KERNEL32
  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 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
  5.  
  6. Public Function Invoke(ByVal lpCode As Long, ParamArray vParams() As Variant) As Long
  7.    Dim i           As Long
  8.    Dim lPtr        As Long
  9.    Dim bvASM(&HFF) As Long
  10.  
  11.    lPtr = VarPtr(bvASM(&H0))
  12.  
  13.    Call AddByte(&H58, lPtr)                    '//POP EAX
  14.    Call AddLong(&H59595959, lPtr)              '//POP ECX (x4)
  15.    Call AddByte(&H50, lPtr)                    '//PUSH EAX
  16.  
  17.    For i = UBound(vParams) To LBound(vParams) Step -1
  18.        Call AddByte(&H68, lPtr)                '//PUSH ________
  19.        Call AddLong(CLng(vParams(i)), lPtr)    '//____ XXXXXXXX
  20.    Next i
  21.  
  22.    Call AddCall(lpCode, lPtr)                  '//CALL lpCode
  23.    Call AddByte(&HC3, lPtr)                    '//RET
  24.    Invoke = CallWindowProc(VarPtr(bvASM(&H0)), ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&)
  25. End Function
  26.  
  27. Private Sub AddCall(ByVal lpPtrCall As Long, ByRef lPtr As Long)
  28.    Call AddByte(&HE8, lPtr)                    '//CALL ________
  29.    Call AddLong(lpPtrCall - lPtr - 4, lPtr)    '//____ XXXXXXXX
  30. End Sub
  31.  
  32. Private Sub AddLong(ByVal lLong As Long, ByRef lPtr As Long)
  33.    Call CopyMemory(ByVal lPtr&, lLong, &H4)
  34.    lPtr = lPtr + &H4
  35. End Sub
  36.  
  37. Private Sub AddByte(ByVal bByte As Byte, ByRef lPtr As Long)
  38.    Call CopyMemory(ByVal lPtr&, bByte, &H1)
  39.    lPtr = lPtr + &H1
  40. End Sub

Ejemplo de uso:
Código
  1. Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  2. Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  3.  
  4. Private Sub Form_Load()
  5.    Dim hMod    As Long
  6.  
  7.    hMod = GetProcAddress(LoadLibrary("KERNEL32"), "Beep")
  8.    Call Invoke(hMod, 200, 500)
  9. End Sub