Autor
|
Tema: Llamar a api sin declararlas (Leído 3,061 veces)
|
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: 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!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Con este codigo no puedes llamar a APIs con un numero de parametros diferentes a 4 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
|
|
|
En línea
|
|
|
|
fary
|
Con este codigo no puedes llamar a APIs con un numero de parametros diferentes a 4 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 Si que explota... jajaja Lo de usar api con mas parametros lo vi en algun lado, voy a buscarlo y aora pongo el ejemplo. salu2!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
|
|
« Última modificación: 5 Agosto 2010, 18:32 pm por BlackZeroX »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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..
|
|
|
En línea
|
|
|
|
fary
|
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
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Creo que con este codigo lo veras mas claro:
Este es el ejemplo que te dije 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
|
|
|
En línea
|
|
|
|
fary
|
jojojojojo esto si que es interezante
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
|
|