elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas  (Leído 21,382 veces)
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
[ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« en: 9 Abril 2010, 16:17 pm »

Existen gran cantidad de códigos por la red (algunos míos :rolleyes:) que permiten llamar APIs de forma Dinámica... es decir sin declararlas...

Que tiene este de especial? Que las llama mediante un Hash... Tal y como hacen los Shellcodes ;-)

Aquí un ejemplo de llamada:
Código
  1. Call Invoke("USER32", &HBC4DA2BE, 0, StrPtr("Soy Karcrack :D"), StrPtr("Ejemplo"), 0)

&HBC4DA2BE es el Hash de la cadena "MessageBoxW", para generar los Hashes se utiliza el siguiente algoritmo:
Código
  1. ;ESI = Puntero cadena
  2. compute_hash:
  3. xor edi, edi     ;EDI = 0
  4. xor eax, eax   ;EAX = 0
  5. cld
  6. compute_hash_again:
  7. lodsb                ;AL = BYTE[ESI] , ESI = ESI + 1
  8. test al, al
  9.       jz compute_hash_finished
  10. ror edi, 0xD
  11. add edi, eax
  12.       jmp compute_hash_again
  13. compute_hash_finished:
  14. ;EDI = El Hash de la cadena

De todas formas he hecho una pequeña herramienta para que genera los Hashes :D
Citar
Código:
http://www.box.net/shared/0ld4yy6bmy
Codigo Fuente incluido ;)


Bueno, aquí esta el código principal:
Código
  1. '---------------------------------------------------------------------------------------
  2. ' Module    : kInvoke
  3. ' Author    : Karcrack
  4. ' Date      : 09/04/2010
  5. ' Purpose   : Call APIs By Hash
  6. '---------------------------------------------------------------------------------------
  7.  
  8. Option Explicit
  9.  
  10. 'USER32
  11. Private Declare Function CallWindowProcW Lib "USER32" (ByVal lpCode As Long, Optional ByVal lParam1 As Long, Optional ByVal lParam2 As Long, Optional ByVal lParam3 As Long, Optional ByVal lParam4 As Long) As Long
  12.  
  13. Private Const THUNK_GETAPIPTR       As String = "E82200000068A44E0EEC50E84300000083C408FF742404FFD0FF74240850E83000000083C408C3565531C0648B70308B760C8B761C8B6E088B7E208B3638471875F3803F6B7407803F4B7402EBE789E85D5EC35552515356578B6C241C85ED74438B453C8B54057801EA8B4A188B5A2001EBE330498B348B01EE31FF31C0FCAC84C07407C1CF0D01C7EBF43B7C242075E18B5A2401EB668B0C4B8B5A1C01EB8B048B01E85F5E5B595A5DC3"
  14. Private Const THUNK_CALLCODE        As String = "<PUSHES>B8<API_PTR>FFD0C3"
  15. Private ASM_GETAPIPTR(0 To 170)     As Byte
  16. Private ASM_CALLCODE(0 To 255)      As Byte
  17.  
  18. Public Function Invoke(ByVal sDLL As String, ByVal hHash As Long, ParamArray vParams() As Variant) As Long
  19.    Dim vItem                       As Variant
  20.    Dim lAPI                        As Long
  21.    Dim sThunk                      As String
  22.  
  23.    Call PutThunk(THUNK_GETAPIPTR, ASM_GETAPIPTR)
  24.    lAPI = CallWindowProcW(VarPtr(ASM_GETAPIPTR(0)), StrPtr(sDLL), hHash)
  25.  
  26.    If lAPI Then
  27.        For Each vItem In vParams
  28.            sThunk = "68" & GetLng(CLng(vItem)) & sThunk
  29.        Next vItem
  30.  
  31.        sThunk = Replace$(Replace$(THUNK_CALLCODE, "<PUSHES>", sThunk), "<API_PTR>", GetLng(lAPI))
  32.        Call PutThunk(sThunk, ASM_CALLCODE)
  33.        Invoke = CallWindowProcW(VarPtr(ASM_CALLCODE(0)))
  34.    Else
  35.        Invoke = -1
  36.        Err.Raise -1, , "Bad Hash or wrong DLL"
  37.    End If
  38. End Function
  39.  
  40. Private Function GetLng(ByVal lLng As Long) As String
  41.    Dim lTMP                        As Long
  42.  
  43.    lTMP = (((lLng And &HFF000000) \ &H1000000) And &HFF&) Or ((lLng And &HFF0000) \ &H100&) Or ((lLng And &HFF00&) * &H100&) Or ((lLng And &H7F&) * &H1000000) ' by Mike D Sutton
  44.    If (lLng And &H80&) Then lTMP = lTMP Or &H80000000
  45.  
  46.    GetLng = String$(8 - Len(Hex$(lTMP)), "0") & Hex$(lTMP)
  47. End Function
  48.  
  49. Private Sub PutThunk(ByVal sThunk As String, ByRef bvRet() As Byte)
  50.    Dim i                           As Long
  51.  
  52.    For i = 0 To Len(sThunk) - 1 Step 2
  53.        bvRet((i / 2)) = CByte("&H" & Mid$(sThunk, i + 1, 2))
  54.    Next i
  55. End Sub
  56.  

Aquí tenéis el código de ejemplo con todos los códigos de ASM utilizados :D:
Código:
http://www.box.net/shared/qgzqkoc4nn

Cualquier duda preguntad ;)

Saludos ;D


En línea

[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #1 en: 9 Abril 2010, 16:26 pm »

Bien hecho  ;-).

Saludos


En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
ssccaann43 ©


Desconectado Desconectado

Mensajes: 792


¬¬


Ver Perfil
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #2 en: 9 Abril 2010, 18:55 pm »

Sorprendido...! Vaya karcrack, muy buenos tus aportes...!
En línea

- Miguel Núñez
Todos tenemos derechos a ser estupidos, pero algunos abusan de ese privilegio...
"I like ^TiFa^"
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #3 en: 10 Abril 2010, 08:35 am »

Existen gran cantidad de códigos por la red (algunos míos :rolleyes:) que permiten llamar APIs de forma Dinámica... es decir sin declararlas...

Que modesto nos salio... JAAAaajajaja!¡.

lo de hash y ASM recuerdo que me lo menciono mi primo que ya tiene 30 y pico de años... jamas le entendi ni jota... me lo decia en su lenguaje... ASM!¡.

Este tipo de cosillas se queman muuy rapido, pero bueno!¡.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #4 en: 11 Abril 2010, 01:37 am »

Muy bueno Kar, che hay una duda con esto del callApi que me carcome no pude lograr nunca pasar estas funciones, vos que la tenes mas clara capas que las sacas.

Código
  1. Option Explicit
  2. Private Declare Function RtlGetCompressionWorkSpaceSize Lib "NTDLL" (ByVal flags As Integer, WorkSpaceSize As Long, UNKNOWN_PARAMETER As Long) As Long
  3. Private Declare Function NtAllocateVirtualMemory Lib "ntdll.dll" (ByVal ProcHandle As Long, BaseAddress As Long, ByVal NumBits As Long, regionsize As Long, ByVal flags As Long, ByVal ProtectMode As Long) As Long
  4. Private Declare Function RtlCompressBuffer Lib "NTDLL" (ByVal flags As Integer, ByVal BuffUnCompressed As Long, ByVal UnCompSize As Long, ByVal BuffCompressed As Long, ByVal CompBuffSize As Long, ByVal UNKNOWN_PARAMETER As Long, OutputSize As Long, ByVal WorkSpace As Long) As Long
  5. Private Declare Function RtlDecompressBuffer Lib "NTDLL" (ByVal flags As Integer, ByVal BuffUnCompressed As Long, ByVal UnCompSize As Long, ByVal BuffCompressed As Long, ByVal CompBuffSize As Long, OutputSize As Long) As Long
  6. Private Declare Function NtFreeVirtualMemory Lib "ntdll.dll" (ByVal ProcHandle As Long, BaseAddress As Long, regionsize As Long, ByVal flags As Long) As Long
  7.  
  8. Public Function Compress(Data() As Byte, Out() As Byte) As Long
  9.    Dim WorkSpaceSize As Long
  10.    Dim WorkSpace As Long
  11.    ReDim Out(UBound(Data) * 1.13 + 4)
  12.  
  13.    RtlGetCompressionWorkSpaceSize 2, WorkSpaceSize, 0
  14.    NtAllocateVirtualMemory -1, WorkSpace, 0, WorkSpaceSize, 4096, 64
  15.    RtlCompressBuffer 2, VarPtr(Data(0)), UBound(Data) + 1, VarPtr(Out(0)), (UBound(Data) * 1.13 + 4), 0, Compress, WorkSpace
  16.    NtFreeVirtualMemory -1, WorkSpace, 0, 16384
  17.    ReDim Preserve Out(Compress)
  18.  
  19. End Function
  20.  
  21. Public Function DeCompress(Data() As Byte, dest() As Byte) As Long
  22.    If UBound(Data) Then
  23.        Dim lBufferSize As Long
  24.        ReDim dest(UBound(Data) * 12.5)
  25.        RtlDecompressBuffer 2, VarPtr(dest(0)), (UBound(Data) * 12.5), VarPtr(Data(0)), UBound(Data), lBufferSize
  26.        If lBufferSize Then
  27.            ReDim Preserve dest(lBufferSize - 1)
  28.            DeCompress = lBufferSize - 1
  29.        End If
  30.    End If
  31. End Function
  32.  

Saludos.
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #5 en: 11 Abril 2010, 13:44 pm »

Simplemente hay que tener en cuenta que todos los parámetros se pasaran tal cual es el Long... osea, hacerlo como si fuese todo ByVal

Aqui lo tienes modificado :D:
Código
  1. Option Explicit
  2.  
  3. Private Const sDLL      As String = "NTDLL"
  4.  
  5. Public Function Compress(Data() As Byte, Out() As Byte) As Long
  6.    Dim WorkSpaceSize   As Long
  7.    Dim WorkSpace       As Long
  8.    ReDim Out(UBound(Data) * 1.13 + 4)
  9.                ' v--RtlGetCompressionWorkSpaceSize
  10.    Invoke sDLL, &HA7DA59A7, 2, VarPtr(WorkSpaceSize), VarPtr(0)
  11.                ' v--NtAllocateVirtualMemory
  12.    Invoke sDLL, &HD33BCABD, -1, VarPtr(WorkSpace), 0, VarPtr(WorkSpaceSize), 4096, 64
  13.                ' v--RtlCompressBuffer
  14.    Invoke sDLL, &HD8ACBF8E, 2, VarPtr(Data(0)), UBound(Data) + 1, VarPtr(Out(0)), (UBound(Data) * 1.13 + 4), 0, VarPtr(Compress), WorkSpace
  15.                ' v--NtFreeVirtualMemory
  16.    Invoke sDLL, &HDB63B5AB, -1, VarPtr(WorkSpace), VarPtr(0), 16384
  17.    ReDim Preserve Out(Compress)
  18.  
  19. End Function
  20.  
  21. Public Function DeCompress(Data() As Byte, dest() As Byte) As Long
  22.    If UBound(Data) Then
  23.        Dim lBufferSize As Long
  24.        ReDim dest(UBound(Data) * 12.5)
  25.                    ' v--RtlDecompressBuffer
  26.        Invoke sDLL, &HFD46A728, 2, VarPtr(dest(0)), (UBound(Data) * 12.5), VarPtr(Data(0)), UBound(Data), VarPtr(lBufferSize)
  27.        If lBufferSize Then
  28.            ReDim Preserve dest(lBufferSize - 1)
  29.            DeCompress = lBufferSize - 1
  30.        End If
  31.    End If
  32. End Function

En resumen, solo hay que tener en cuenta si en la declaracion del API que estas llamando de forma dinamica un parametro tiene ByRef o bien no tiene ByVal, en este caso se utilizará VarPtr() :D

Luego estan las cadenas, que es recomendable trabajar con las variantes UNICODE de las APIs, y enviar el puntero usando StrPtr() siempre se puede pasar la cadena a ANSI y punto... pero es mas trabajo ;)
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #6 en: 11 Abril 2010, 20:15 pm »

muy bien  :D, habia echo un monton de pruebas y me explotaba el vb, seguramente devia estar pasando mal algun valor con byval, y para los long no usaba varptr.

Gracias. y te felicito nuevamente.
En línea

tr1n1t1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #7 en: 12 Abril 2010, 02:00 am »

Buen trabajo, no termina una sorpresa. Yo estaba tratando de usarlo con tu forma sin éxito. ¿Me puede ayudar por favor?

Código:
Option Explicit
'---------------------------------------------------------------------------------------
' Module    : mAPIObfuscation
' Author    : Karcrack
' Now$      : 29/08/2009  13:54
' Used for? : Obfuscate API Declaration
'---------------------------------------------------------------------------------------

'MSVBVM60
Private Declare Sub CopyBytes Lib "MSVBVM60" Alias "__vbaCopyBytes" (ByVal Size As Long, Dest As Any, Source As Any)
'KERNEL32
Private Declare Function WriteProcessMemory Lib "KERNEL32" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function IsBadReadPtr Lib "KERNEL32" (ByRef lp As Any, ByVal ucb As Long) As Long

Public Function DeObfuscateAPI(ByVal sLib As String, ByVal sFunc As String) As Boolean
    Dim lAddr           As Long
    Dim sBuff           As String * &H200
    Dim lLib            As Long
    Dim lFunc           As Long

    If App.LogMode = 0 Then GoTo OUT
    
    lAddr = App.hInstance& - Len(sBuff)
    
    Do
        lAddr = lAddr + Len(sBuff)
        If IsBadReadPtr(ByVal lAddr, Len(sBuff)) <> 0 Then GoTo OUT
        Call CopyBytes(Len(sBuff), ByVal sBuff$, ByVal lAddr&)
        lLib = InStr(1, sBuff, sLib, vbBinaryCompare)
        lFunc = InStr(1, sBuff, sFunc, vbBinaryCompare)
    Loop Until (lLib <> 0) And (lFunc <> 0)
    
    lLib = lAddr + lLib - 1
    lFunc = lAddr + lFunc - 1
    
    If WriteProcessMemory(-1, ByVal lLib&, ByVal E(sLib), Len(sLib), ByVal 0&) = 0 Then GoTo OUT
    If WriteProcessMemory(-1, ByVal lFunc&, ByVal E(sFunc), Len(sFunc), ByVal 0&) = 0 Then GoTo OUT
    
    DeObfuscateAPI = True: Exit Function
OUT:
    DeObfuscateAPI = False: Exit Function
End Function

No entiendo cómo pasar punteros

Código:
Public Function DeObfuscateAPI(ByVal sLib As String, ByVal sFunc As String) As Boolean
    Dim lAddr           As Long
    Dim sBuff           As String * &H200
    Dim lLib            As Long
    Dim lFunc           As Long

    If App.LogMode = 0 Then GoTo OUT
   
    lAddr = App.hInstance& - Len(sBuff)
   
    Do
        lAddr = lAddr + Len(sBuff)
        If Invoke("KERNEL32", &H6E824142, ByVal lAddr, Len(sBuff)) <> 0 Then GoTo OUT
        Call Invoke("MSVBVM60", &H6A5B5999, Len(sBuff), ByVal sBuff$, ByVal lAddr&)
        lLib = InStr(1, sBuff, sLib, vbBinaryCompare)
        lFunc = InStr(1, sBuff, sFunc, vbBinaryCompare)
    Loop Until (lLib <> 0) And (lFunc <> 0)
   
    lLib = lAddr + lLib - 1
    lFunc = lAddr + lFunc - 1
   
    If Invoke("KERNEL32", &HD83D6AA1, -1, ByVal lLib&, ByVal E(sLib), Len(sLib), ByVal 0&) = 0 Then GoTo OUT
    If Invoke("KERNEL32", &HD83D6AA1, -1, ByVal lFunc&, ByVal E(sFunc), Len(sFunc), ByVal 0&) = 0 Then GoTo OUT
   
    DeObfuscateAPI = True: Exit Function
OUT:
    DeObfuscateAPI = False: Exit Function
End Function
« Última modificación: 12 Abril 2010, 02:20 am por tr1n1t1 » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #8 en: 12 Abril 2010, 02:19 am »

@tr1n1t1: Estas muy confundido, ese codigo que has pegado, es para otro porposito, ese codigo cifra la declaracion habitual de un API en VB, en cambio con el kInvoke se llama al API sin tener que usar ese declaracion.
En línea

tr1n1t1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: [ASM+VB6][INVOKE] Llamas APIs sin declararlas - kInvoke.bas
« Respuesta #9 en: 12 Abril 2010, 02:25 am »

Thanks for your answer karcrack, I know that, I'm just trying to create a module to obfuscate apis that uses only CallWindowProcW merging your codes. I need that because I'm not being able to use Invoke on this line:

Código:
sMSVBVM60 = "MSVBVM60.DLL"

Do While i < tIMAGE_NT_HEADERS.FileHeader.NumberOfSections - 1

--->Invoke sMSVBVM60, &H6A5B5999, Len(tIMAGE_SECTION_HEADER), VarPtr(tIMAGE_SECTION_HEADER), VarPtr(bvBuff(tIMAGE_DOS_HEADER.e_lfanew + SIZE_NT_HEADERS + SIZE_IMAGE_SECTION_HEADER * i))

Invoke sNTDLL, &HC5108CC2, tPROCESS_INFORMATION.hProcess, .ImageBase + tIMAGE_SECTION_HEADER.VirtualAddress, VarPtr(bvBuff(tIMAGE_SECTION_HEADER.PointerToRawData)), tIMAGE_SECTION_HEADER.SizeOfRawData, 0

        i = i + 1

Loop

Como se puede ver soy tu admirador  ;D
« Última modificación: 12 Abril 2010, 02:37 am por tr1n1t1 » En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda[Loadlibrary] Cargar apis sin declararlas.
Programación Visual Basic
The Swash 3 5,294 Último mensaje 1 Febrero 2010, 17:31 pm
por Karcrack
[VB6-SRC] mZombieInvoke - Llama APIs sin declararlas « 1 2 »
Programación Visual Basic
Karcrack 11 8,729 Último mensaje 14 Agosto 2010, 21:14 pm
por wh0!
Ayuda con el metodo Invoke y varias Dudas Sockets
.NET (C#, VB.NET, ASP)
CATBro 2 2,855 Último mensaje 28 Octubre 2011, 07:00 am
por CATBro
[HELP] Invoke APIs
Programación Visual Basic
Swellow 1 1,741 Último mensaje 4 Mayo 2012, 10:01 am
por Swellow
[C++ Template] Hasheado de APIs en compile-time - Invoke
Análisis y Diseño de Malware
Karcrack 4 3,453 Último mensaje 24 Enero 2013, 22:13 pm
por Karcrack
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines