Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: Vaagish en 12 Abril 2013, 07:27 AM

Título: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 12 Abril 2013, 07:27 AM
Buenas amigos Foreros!! Espero anden bien :)

Les cuento.. Estoy desarrollando un pequeño troyano en asm, con funciones basicas,, lo justo y necesario.. Pero la cosa se esta complicando con los antivirus..
Yo tengo una tecnica para ir haciendo estas cosas.. voy creando partes del codigo y las voy probando en, por ejemplo, Novirusthanks... Bien, la cosa es que ya tengo algunas cosas "funcionando", por ejemplo, que la aplicacion se autocopie en el disco duro.. (deteccion por heuristica), tambien logre escribir en el registro de windows, para que se autoinicie.. (deteccion por virus), y asi la lista sigue un poco mas,, por ejemplo al usar la API getcomputername..

Al parecer,, todo lo basico que un malware debe hacer, es detectado por uno o por otro antivirus..
He leido algunos hilos, foros, wikipedia, etc.. de cosas asi como el polimorfismo, encriptacion.. etc, etc

De estas tecnicas la unica que podria manejar (por ahora quizas) es la encriptacion..

Alguien tiene alguna idea de como se podria evadir un poco mejor ( sin llegar al extremo del polimorfismo ) a los AV ? Y de ser posible algun ejemplo practico, un pseudocode o idea teorica.. todo sirve..
Muchas gracias por leer toda esta maza que acabo de escribir!! jeje

Saludos!
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Karcrack en 12 Abril 2013, 13:02 PM
La clave es cargar las APIs de forma dinámica. Si abres tu binario con cualquier editor de PE podrás ver que hace directamente las importaciones en la IAT. Un AV no tiene ninguna dificultad en revisar esa lista y empezar a sospechar.
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 12 Abril 2013, 19:54 PM
Bien,, buen consejo.. Voy a buscar info para hacer tal cosa en asm. Pero,, de casualidad podrias explicarme mas o menos como es la cosa? Porque la verdad, he realizado algun programita similar al que quiero hacer ahora, pero en vb y alguno mas sencillo en c++, pero en asm ( a pesar de que puede ser muy parecido la estructura quizas con asm ) nunca cargue dinamicamente las apis  :silbar:
Las declaraba y listo..

Gracias!!!!

EDITADO:

CitarCall Invoke("USER32", &HBC4DA2BE, 0, StrPtr("Soy Karcrack :D"), StrPtr("Ejemplo"), 0)

Impeca,, ya tengo para empezar.. jajaja

Gracias KarcracK
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 12 Abril 2013, 23:36 PM
Bueno,, luego de unas pares de horas buscando como hacer para llamar a las apis dinamicamente, no he podido siquiera encontrar mucha info..
Esta el manual de Karcrack pero la verdad no logro captar el mecanismo.. Si pudiera alguien explicar le estaria muy agradecido!! :)
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Karcrack en 13 Abril 2013, 23:58 PM
Si estás programando en C no tendrás que complicarte tanto la vida como toca hacer en VB6.

La forma más simple de llamar a una función de forma dinámica es obteniendo su puntero con LoadLibrary() y GetProcAddress(). Algo así:

Código (cpp) [Seleccionar]
FARPROC fnc = GetProcAddress(LoadLibrary("KERNEL32"), "ExitProcess");
__asm{
   push 0
   call [fnc]
}

(Puede que no compile tal cual, lo acabo de escribir sin más. Creo que la idea queda clara.)

Suerte ;)
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 15 Abril 2013, 19:17 PM
Gracias Karcrack otra vez!! Estoy programando en masm.. creo que entiendo,, ahora me voy a poner con eso..

Tnks!




Bueno,, estoy en esto de la carga dinamica de apis,, podrias decirme si voy bien, o si lo que estoy haciendo tiene sentido ? jaja ( Es que soy nuevo en asm )

.386
.model, etc, etc...

include windows.inc
include kernel32.inc    ---> Incluyo a kernel32 para poder utilizar LoadLibrary :/
includelib kernel32.lib

.code
Inicio:

invoke LoadLibrary, addr Lib --> "user32" (Calculo que el handle me queda en eax)
mov Hand, eax --> Hand deberia ser una estructura de tipo handle, supongo.. pero no se declararla..
invoke GetProcAddress, Hand, addr Func --> "MessageBox" (Calculo que lo que retorne, queda en eax)

push 0
push offset [Mensaje]
push offset [Titulo]
push 0

call eax ( Puede ser esto posible ?? )

invoke ExitProcess, 0

end Inicio

Bueno,, estoy muy mariado o algo de sentido tiene esto ?? Graciasss!!
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 15 Abril 2013, 22:57 PM
Listooo !!! Solucionado !!!! :D

Gracias! Gracias!
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 16 Abril 2013, 01:43 AM

.386
.model flat, stdcall
option casemap:none

include     \masm32\include\windows.inc
include     \masm32\include\kernel32.inc
includelib  \masm32\lib\kernel32.lib

bufSize = MAX_COMPUTERNAME_LENGTH + 1

.data

format1   db 'Computer Name is = %s',0
capt        db 'Hello',0

buffer      db 100 dup(?)
bSize       dd bufSize
getName  db bufSize dup(?)

;Nombres de los Dll utilizados y sus funciones

Lib db "user32.dll", 0
Lib2 db "kernel32.dll",0

Func         db "MessageBoxA", 0
Func2        db "wsprintfA", 0
Func3        db "GetComputerName", 0
Func4        db "ExitProcess", 0

DinamicApi Proto :DWORD, :DWORD

.data?

Hand dd ?

.code

start:

invoke GetComputerName, addr getName, addr bSize

;Error al usar la libreria kernel32.dll
;invoke DinamicApi, addr Lib2, addr Func3
;PUSH offset [bSize]
;PUSH offset [getName]
;call Hand

;**********************************************************************

invoke DinamicApi, addr Lib, addr Func2

PUSH offset [getName]
PUSH offset [format1]
PUSH offset [buffer]

call Hand

;**********************************************************************

invoke DinamicApi, addr Lib, addr Func
   
PUSH MB_OK
  PUSH offset [capt]
  PUSH offset [buffer]
  PUSH NULL
   
    call Hand

;**********************************************************************

invoke FreeLibrary, addr Hand

invoke DinamicApi, addr Lib2, addr Func4
PUSH 0
    call Hand
   
    ;**********************************************************************

DinamicApi proc Libreria:DWORD, Funcion:DWORD

invoke LoadLibrary, Libreria
invoke GetProcAddress, eax, Funcion
mov Hand, eax

ret

DinamicApi endp

END start


Bueno, algo asi quedo el code,, el unico problema es cuando quiero utilizar la API Kernel32, modulo o Dll (Como le quieran llamar)
El problema es que LoadLibrary se carga incluyendo a Kernel32,, entonces supongo yo que no puede autollamarse,, Me explico????
Y otra consulta.. Como puedo ofuscar los strings "user32", "messageboxA", etc, etc.. porque eso queda a plena vista del ollydbg, supongo que para un AV no es mayor problema leer esos string tambien..

Saludos !!
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Karcrack en 16 Abril 2013, 07:36 AM
Cita de: Vaagish en 16 Abril 2013, 01:43 AM
El problema es que LoadLibrary se carga incluyendo a Kernel32,, entonces supongo yo que no puede autollamarse,, Me explico????
No entendí. Si que puedes hacer LoadLibraryA("kernel32") si es lo que preguntas. Con esto obtendrías la dirección base de la DLL sin tener realmente que cargarla de nuevo. La forma correcta sería GetModuleHandle() ya que sabes que ya está cargada.

Cita de: Vaagish en 16 Abril 2013, 01:43 AM
Y otra consulta.. Como puedo ofuscar los strings "user32", "messageboxA", etc, etc.. porque eso queda a plena vista del ollydbg, supongo que para un AV no es mayor problema leer esos string tambien..
Ese sería el siguiente paso a la indetección. Cifrar cadenas sospechosas :)
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Arkangel_0x7C5 en 16 Abril 2013, 11:37 AM
el se referira a como se llama usa LoadLibrary de forma dinamica sin importarla.

La respuesta es que tendrias que usar una implementacion propia de GetModuleHandle y GetProcAddress
Título: Re: Recomendaciones para evadir heuristica
Publicado por: mr.blood en 16 Abril 2013, 16:57 PM
Creo que te interesara. (http://www.portalhacker.net/index.php/topic,160069.0.html)

Aunque para comprenderlo tendras que conocer el formato PE, porque tendras que hacer tu propio GetProcAddress. Esto se hace leyendo de las DLL la sección de exportacion ;).

Sa1uDoS
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 16 Abril 2013, 19:22 PM
Huu buenisimo!! Gracias amigos! Tengo para seguir aprendiendo jejeje

Una consulta.. el codigo de Karc que puso el enlace mr.blood, ese code lo que hace es "cifrar" y "descifrar" la cadena, por ejemplo "MessageBoxA", no??
(Podria ser cualquier otra cadena, no?) O tiene algo que ver con los ordinales de las apis? porque intente con el programita que hizo karc tambien, el HashGenerator, pero no me reconoce los hash el asm.. o por ende,, no lo estaba implementando bien.. :/

Gracias a todos!!




EDITADO: Me faltaba esto ayer, me habia olvidado..

CitarSi que puedes hacer LoadLibraryA("kernel32")

Bien, entiendo que se debe poder.. el problema es que al hacer esto:

invoke loadlibrary, "Kernel32" -> Me dice que no se reconoce loadlibrary, porque loadlibrary esta dentro de Kernel32, con lo que para que la reconozca tendria que declarar Kernel32 al inicio del code :/
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Karcrack en 16 Abril 2013, 20:04 PM
Cita de: Vaagish en 16 Abril 2013, 19:22 PM
invoke loadlibrary, "Kernel32" -> Me dice que no se reconoce loadlibrary, porque loadlibrary esta dentro de Kernel32, con lo que para que la reconozca tendria que declarar Kernel32 al inicio del code :/
El nombre de la función es LoadLibraryA() o LoadLibraryW() la primera es ANSI y la segunda UNICODE. El ensamblador no sabe a dónde apuntar si le dices loadlibrary. El nombre de las funciones es sensible a mayúsculas y minúsculas.


El enlace que comparte mDrinky es una muestra de cómo obtener el puntero a la función sin usar GetProcAddress(); recorriendo manualmente la EAT de la librería. Eso sí, el código está algo limitado y no considera funciones con ordinales o forwarding.


Una función hash es aquella que obtiene un identificador único de tamaño fijo de ciertos datos. En el link de mDrinky un tamaño de 4 bytes aunque las colisiones son altas.
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 16 Abril 2013, 20:25 PM
Hola Karc!

Gracias por tu tiempo y paciencia.. Pero sigo sin entender,, como puedo llamar a LoadLibraryA, si el ensamblador me pide que incluya a kernel32 para poder hacer un invoke a getmodulehandle, a loadlibrary, o a getprocaddress,, no se si se entiende..

O sea,, cualquier funcion que quiera utilizar para poder cargar a kernel32, esta dentro de kernel32...

Me hace acordar a la pregunta: ¿Que fue primero, el huevo o la gallina?
Título: Re: Recomendaciones para evadir heuristica
Publicado por: mr.blood en 16 Abril 2013, 20:50 PM
Por eso en tu exe importas la libreria kernel32 y las funciones necesarias. Lee sobre el formato PE.

Sa1uDoS
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Vaagish en 16 Abril 2013, 21:07 PM
CitarPor eso en tu exe importas la libreria kernel32 y las funciones necesarias. Lee sobre el formato PE.

O sea que no safamos de importar a kernel32 de forma estatica, al menos una vez, al inicio del programa,, no?

Ahora leo sobre los PE,, Tnks!!
Título: Re: Recomendaciones para evadir heuristica
Publicado por: Flamer en 16 Abril 2013, 21:52 PM
pienso que tienes que compilar tu exe y con un editor PE revisar el IAT para saber la direccion de kernel32 y poderla invocar desde hay

saludos flamer y una cosa nose casi de este tema asi que puede que este equibocado