Recomendaciones para evadir heuristica

Iniciado por Vaagish, 12 Abril 2013, 07:27 AM

0 Miembros y 1 Visitante están viendo este tema.

Vaagish

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!

Karcrack

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.

Vaagish

#2
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

Vaagish

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!! :)

Karcrack

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 ;)

Vaagish

#5
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!!

Vaagish

Listooo !!! Solucionado !!!! :D

Gracias! Gracias!

Vaagish


.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 !!

Karcrack

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 :)

Arkangel_0x7C5

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