Otra alternativa a para ocultar una api de los AV

Iniciado por LeandroA, 13 Septiembre 2010, 09:48 AM

0 Miembros y 4 Visitantes están viendo este tema.

LeandroA

Hola me resulto curioso esto de declarar a las apis por su ordinal y bueno de la cosa es que los AV no detectan estas apis, lo malo es que dependiendo de la versión de la dll el ordinal puede cambiar. pero es otra buena alternativa.

una pequeña muestra


Option Explicit
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "#216" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Declare Function URLDownloadToFile_Seven Lib "urlmon" Alias "#217" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Declare Function GetProcAddressXP Lib "kernel32.dll" Alias "#409" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetProcAddressVISTA Lib "kernel32.dll" Alias "#548" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetProcAddressSEVEN Lib "kernel32.dll" Alias "#580" (ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Declare Function LoadLibraryXP Lib "kernel32.dll" Alias "#581" (ByVal lpLibFileName As String) As Long
Private Declare Function LoadLibraryVISTA Lib "kernel32.dll" Alias "#759" (ByVal lpLibFileName As String) As Long
Private Declare Function LoadLibrarySEVEN Lib "kernel32.dll" Alias "#827" (ByVal lpLibFileName As String) As Long

Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As tOSVERSIONINFO) As Long

Private Type tOSVERSIONINFO
    dwOSVersionInfoSize         As Long
    dwMajorVersion              As Long
    dwMinorVersion              As Long
    dwBuildNumber               As Long
    dwPlatformId                As Long
    szCSDVersion                As String * 128
End Type

Dim OSV As tOSVERSIONINFO


Public Function DownloadFile(URL As String, LocalFilename As String) As Boolean
    If OSV.dwMajorVersion >= 7 Then
        DownloadFile = URLDownloadToFile_Seven(0, URL, LocalFilename, 0, 0) = 0
    Else
        DownloadFile = URLDownloadToFile(0, URL, LocalFilename, 0, 0) = 0
    End If
End Function

Private Function GetProcAddress(ByVal hModule As Long, ByVal lpProcName As String) As Long
    Select Case OSV.dwMajorVersion
        Case 5
            GetProcAddress = GetProcAddressXP(hModule, lpProcName)
        Case 6
            GetProcAddress = GetProcAddressVISTA(hModule, lpProcName)
        Case 7
            GetProcAddress = GetProcAddressSEVEN(hModule, lpProcName)
    End Select
End Function

Private Function LoadLibrary(ByVal lpLibFileName As String) As Long
    Select Case OSV.dwMajorVersion
        Case 5
            LoadLibrary = LoadLibraryXP(lpLibFileName)
        Case 6
            LoadLibrary = LoadLibraryVISTA(lpLibFileName)
        Case 7
            LoadLibrary = LoadLibrarySEVEN(lpLibFileName)
    End Select
End Function


Private Sub Form_Initialize()
    OSV.dwOSVersionInfoSize = Len(OSV)
    Call GetVersionEx(OSV)
End Sub

Private Sub Form_Load()
    Dim hMod As Long
   

    DownloadFile "http://www.allapi.net", App.Path & "\allapi.htm"
   
    hMod = LoadLibrary("user32.dll")
    MsgBox GetProcAddress(hMod, "MessageBoxA")
    FreeLibrary hMod
   
End Sub


no estoy seguro si con los cambios de los SPx pueda cambiar yo solo compare por la version del SO

Saludos.

azul27

Lo cierto es que no entiendo el funcionamiento y me interesa mucho.. si pudieras
poner otro ejemplo, expicado sería de gran ayuda

Gracias!

fary

Cita de: azul27 en 13 Septiembre 2010, 13:07 PM
Lo cierto es que no entiendo el funcionamiento y me interesa mucho.. si pudieras
poner otro ejemplo, expicado sería de gran ayuda

Gracias!

Fijate bien como declara las api:

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

@LeandroA donde puedo ver ls ordinales de las api?

salu2!
Un byte a la izquierda.

Karcrack

#3
El problema de los ordinales es que no son estaticos :-\... y claro, no sabemos cuando cambian... Asi que bien, se puede hacer la comprobacion que tu haces, pero para bien tendriamos que tener una buena lista de ordinales, ya que posiblemente tambien varien en las versiones para servidores y esas cosas....

Una formas mas bonita de sacar el MajorVersion:
Código (vb) [Seleccionar]
'KERNEL32
Private Declare Function GetVersion Lib "KERNEL32" () As Long

Sub Main()
    MsgBox (GetVersion And &HFF)
End Sub

Sin estructuras ni leches :P

Date cuenta que el MajorVersion para XP es el mismo que para W$2000 y W$2003... asi que hay que filtrar con mas detalle...
http://msdn.microsoft.com/en-us/library/ms724832(v=VS.85).aspx

Saludos :)

burbu_1

Muy buena Leandro  ;-) ;-) ;-), es un poco más jaleo que usar esos fantásticos Invoke que andan por ahí, pero seguro que resulta muy útil.

Una pregunta que igual se sale un poco del tema.... por qué se pone ese símbolo # delante del ordinal. Lo había visto con números muy grandes pero estos son bajitos  :huh:


Cita de: Drinky94 en 13 Septiembre 2010, 15:09 PM
donde puedo ver ls ordinales de las api?
Con el PE Explorer abres la dll , miras las funciones que exporta y ahí aparecen



Karcrack

Cita de: burbu_1 en 13 Septiembre 2010, 17:50 PM
Una pregunta que igual se sale un poco del tema.... por qué se pone ese símbolo # delante del ordinal. Lo había visto con números muy grandes pero estos son bajitos  :huh:
Cuando la almohadilla (#) va detras de un numero esto significa que es un Double... Pero fijate que lo que hay ahi es una cadena de texto "#XXX"... Y puesto asi lo que hace es especificar que se cargue la funcion por ordinal y no por nombre...

LeandroA

las ordinales se pueden obtener del mismo Link.exe de visual basic fijate este ejemplo

http://www.recursosvisualbasic.com.ar/htm/listado-api/163-exportar-funciones-api-de-dll.htm

@Karcrack esta mucho mas piola con GetVersion  ;)

yo solo lo testie con xp sp3 (vista y Seven en la pc virtual no se que spx) como ya dije no se si varian con las modificaciones de los spx, pero bueno esto es para usar solo con las apis problematicas con respecto a los AV

Dessa

Interesante Leandro, cada vez mas seguido estoy viendo codes con esta manera de declarar, me imaginé que venía por el lado de los AV ... confimado entonces.

Hice una comparacion rápida con Con XP-PRO SP2 y SP3, en kernel32:

LoadLibrary = 578 (SP2)
LoadLibrary = 581 (SP3)

GetProcAddress = 408 (SP2)
GetProcAddress = 409 (SP3)


Karcrack: muy bonita esa Getversion, no habrá algo igual de bonita para la Minor ?



Adrian Desanti

Karcrack

Cita de: Dessa en 14 Septiembre 2010, 04:21 AM
Karcrack: muy bonita esa Getversion, no habrá algo igual de bonita para la Minor ?
(GetVersion() And &HFF00&) \ &H100

Dessa

Buena Karcrack, mirá si será bonita... que hasta funciona en Windows millenium !!!

Adrian Desanti