Llamar a api sin declararlas

Iniciado por fary, 4 Agosto 2010, 21:48 PM

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

fary

Bueno esto puede servir para esquivar algunos av, no es un codigo tan avanzado como los de Karcrack ni tan dificil peeeeero funciona perfectamente ;)

Vamos a hacer un simple MessageBox, Código:

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
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

Private Const MB_ICONEXCLAMATION = &H30&

Private Sub Form_Load()
    Dim id As Long
    Dim direccion As Long
   
    id = LoadLibrary("user32") 'Cargamos la libreria
    direccion = GetProcAddress(id, "MessageBoxA") 'obtenemos la direccion em memoria
   
    CallWindowProc direccion, Me.hWnd, "cuerpo", "Titulo", MB_ICONEXCLAMATION ' llamamos a la funcion
   
    FreeLibrary id ' liberamos la dll
End Sub


Bueno el code esta explicado pero si tienen alguna duda solo pregunten, si quisieramos  utilizar una api con mas parametros tendriamos que usar un array :).

salu2! y espero que les sea de ayuda!
Un byte a la izquierda.

Karcrack

Con este codigo no puedes llamar a APIs con un numero de parametros diferentes a 4 :P

Intenta hacer sonar un Beep (API Beep@KERNEL32)... es muy probable que explote...

Explica eso de Array para hacer una llamada a URLDownloadToFile, por favor :rolleyes:

fary

Cita de: Karcrack en  5 Agosto 2010, 17:21 PM
Con este codigo no puedes llamar a APIs con un numero de parametros diferentes a 4 :P

Intenta hacer sonar un Beep (API Beep@KERNEL32)... es muy probable que explote...

Explica eso de Array para hacer una llamada a URLDownloadToFile, por favor :rolleyes:

Si que explota... jajaja  ;D

Lo de usar api con mas parametros lo vi en algun lado, voy a buscarlo y aora pongo el ejemplo.

salu2!
Un byte a la izquierda.

BlackZeroX

#3
The Dark Shadow is my passion.

Karcrack

El tema esta en que si necesitas mas parametros no vas a poder pushearlos simplemente con un array, has de usar ASM para realizar la llamada..

fary

Cita de: Karcrack en  5 Agosto 2010, 19:23 PM
El tema esta en que si necesitas mas parametros no vas a poder pushearlos simplemente con un array, has de usar ASM para realizar la llamada..

um... puede ser  :-\
Un byte a la izquierda.

Karcrack

Creo que con este codigo lo veras mas claro:


Cita de: Karcrack en  1 Febrero 2010, 17:31 PM
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




Tienes el codigo en ASM comentado al lado de cada linea ;)

fary

jojojojojo esto si que es interezante  :o
Un byte a la izquierda.