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:
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!
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:
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!
.
Call API By Name Usin vtable Patch (http://foro.elhacker.net/programacion_visual_basic/call_api_by_name_usin_vtable_patch-t226177.0.html;msg1075076#msg1075076)
Dulces Lunas!¡.
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..
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 :-\
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
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:
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 ;)
jojojojojo esto si que es interezante :o