NanoInvoke - La forma mas rapida de llamar a una API
La shellcode de unos 90bytes se encarga de recorrer el SAFEARRAY de VARIANTs metiendo en el stack los parámetros para el API. Además busca en la IAT del proceso la importación de DllFunctionCall() para obtener el puntero del API.
'USER32 Private Declare Function CallWindowProcW Lib "USER32" (ByRef first_asm As Currency, ByRef params() As Variant, ByVal lib As String, ByVal fnc As String, Optional ByVal null0 As Long = 0) As Long '--------------------------------------------------------------------------------------- ' Author : Karcrack ' Date : 12092013 ' Credits: sonykuccio (http://hackhound.org/forums/topic/2790-vb6asm-%C2%B5callapi/) '--------------------------------------------------------------------------------------- Public Function NanoInvoke(ByRef sLib As String, ByRef sFnc As String, ParamArray params() As Variant) As Long Dim asm(11) As Currency Dim p() As Variant If UBound(params) >= 0 Then p = params asm(0) = -881438862054780.1504@: asm(1) = -140193315782017.312@: asm(2) = 93112413858165.2867@: asm(3) = 593189448021741.0902@ asm(4) = 843045704464075.3748@: asm(5) = -4834317066834.7356@: asm(6) = 260429944098681.7488@: asm(7) = 537140947255014.6699@ asm(8) = 7683543183094.8624@: asm(9) = 598313605633923.5838@: asm(10) = -200740417519275.4208@: asm(11) = 109.8337@ NanoInvoke = CallWindowProcW(asm(0), p, sLib, sFnc) End Function ' ASM Code: pastebin.com/5gnLv7xn
Modo de Uso:
Call NanoInvoke("user32", "MessageBoxW", 0, StrPtr("test"), StrPtr("karcrack"), 0) Call NanoInvoke("kernel32", "ExitProcess", 0)
ASM Code:
use32 pushad mov esi, $401000 ;WARNING: DEFAULT IMAGEBASE + SECTION SIZE @@: lodsd ;EAX = [EDI];EDI+=4 test eax, eax ;Did we reach the end? je .exit cmp DWORD[eax], $83EC8B55 jne @B cmp DWORD[eax+4], $8D560CEC jne @B ;> Opcode matching, is it DllFunctionCall()? cdq ;EDX = 0 push edx ;v push edx ;v push edx ;> buffer push esp ;Pointer to buffer push $40000 ;Reserved push DWORD[esp+$40] ;Fnc push DWORD[esp+$40] ;Lib push esp ;APICall structure made in stack call eax ;DllFunctionCall(APICall) add esp, 7*4 ;Clear stack mov edx, [esp+$24] ;&SAFEARRAY mov edx, [edx] ;SAFEARRAY test edx, edx jz .call mov ecx, [edx+$10] ;SAFEARRAY size Elements mov esi, [edx+$C] ;SAFEARRAY.pvData imul edi, ecx, $10 ;v add esi, edi ;>last variant @@: sub esi, $10 ;ESI = prev variant mov ebx, [esi+$8] ;EAX = VARIANT.lVal push ebx loopne @B ;Repeat .call:call eax .exit:mov [esp-$1C], eax ;Save return popad ret 4*4
Código realizado por Karcrack