Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: nhaalclkiemr en 5 Marzo 2008, 00:54 am



Título: Saltarse un tipo de heurística
Publicado por: nhaalclkiemr en 5 Marzo 2008, 00:54 am
Weno en una de mis creaciones (maleficas como no) pretendo desacerme de la heurística de los AVs como es obvio leyendo el titulo...weno el tema de cifrar las String está claro que lo tengo que realizar...la cuestión es otra:

Muchos AVs (como el NOD32) detectan por heurística acciones sospechosas, y muchas de ellas relacionadas con el inicio de una aplicación...por ejemplo en VB si tienes un modulo (y no formularios, por ejemplo con un Sub Main) y en el Main le pones una instruccion FileCopy, Kill, ... automaticamente pasa a ser detectado (y si lo hago con un Form_Load de un formulario parecido)...ese es el tipo de heurística que quiero evitar, la heurística que me detecta ciertas acciones en el Load (o Main) de mi programa...

Pues weno lo primero que hice fue poner APIs en lugar de las propias funciones del VB...funcionó en algunos casos pero en otros no...también prové a crear una funcion que llamara a otra funcion y asi sucesivamente pero eso no cuela a los AVs (sería demasiado facil no? xD)

Muchos os preguntareis porque insisto en no poner un Form, ya que con un Form podría poner por ejemplo un Timer que llamase a mi funcion y listo, al no estar en el Load ya no canta ni la mitad...sin embargo no quiero usar un Form pork probando descubrí que el hecho de poner un Form me aumenta 40KB la aplicación, de pesar 68KB usando solo modulos conuna funcion Sub Main enuno de ellos, me pasa a 108KB poniendo un solo Form con un Timer y el mismo code...eso es mucho para mi...(weno sobra decir que en mi aplicación es silenciosa y no muestra nada en pantalla, por eso los Forms son innecesarios)

Por eso, la cuestión es: como hacer que mi programa tras ejecutarse inicie automaticamente su codigo con instrucciones que el AV detecta como sospechosas si están programadas para ejecutarse al inicio?

A mi por el momento se me ocurrieron dos ideas:

  • Usar CreateThread: Sin embargo tengo entendido que con VB6.0 esa API no siempre funciona bien para ejecutar las propias funciones del programa y me daría problemas...y de hecho ya me las dió con funciones de una sola linea, no me imagino con un codigo grande entero que llama a varias funciones, APIs, etc...
  • Usar SetTimer y KillTimer para establecer un Timer (y en cuanto se ejecute una vez desactivarlo automaticamente) mediante APIs (y asi no me hace falta el Form) y apuntando a la funcion Main: Es la mejor alternativa que veo, pero aun tengo que provar si funciona correctamente, pues me da a mi que causará errores...por ejemplo a la hora de usar la funcoin Command que recoge los parametros de la aplicación no se si desde el Timer funcionará (me da a mi que no)...weno mañana (hoy es tarde) pruebo y ya os comento...pero no se, otra alternativa me parecería más segura...

Sobre este post decir que weno lo pongo para que vosotros me digais vuestras opiniones de que hariais vosotros...si veis mejores alternativas al Timer mediante APIs...mejores soluciones...etc...pero insisto...nada de Forms!

Saludos ;)


Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 5 Marzo 2008, 01:32 am
nhaalclkiemr, ves poniendo el código que te detecta el AV y lo vamos analizando, a ver si de alguna forma se puede hacer lo mismo sin ser detectado. Por cierto, me he instalado el nod32 y he realizado un ejecutable metiendo un simple kill en el main y no me lo ha detectado cuando lo he ejecutado. No se si lo tendré mal configurado el AV.
Saludos.


Título: Re: Saltarse un tipo de heurística
Publicado por: Hendrix en 5 Marzo 2008, 16:06 pm
En C/C++ es mas sencillo, puedes crear un tipo que funcione como cierta API (la que quieras usar) y luego guardas la dirección de la api a usar y la utilizas ese tipo que definiste con la dirección de la API, asi declaras la API "en memoria", si quieres te puedo pasar el codigo en C/C++ y luego lo intentas exportar a VB, aunque no se como te ira, ya te digo, en C/C++ esta tirado hacer eso  :)


Título: Re: Saltarse un tipo de heurística
Publicado por: nhaalclkiemr en 5 Marzo 2008, 16:50 pm
Weno la verdad ya he encontrado la solución (era por una cosa tonta) pero igualmente si tienes el codigo en C pasamelo que intento traducirlo a VB (aunke a lo mejor no tira...)

A ver  os digo lo que hice...prové lo del Timer con SetTimer, y funciona todo correctamente, lo malo es que tengo que poner el SetTimer en el Main (logico) con AdressOf Main de parametro (logico tambien), y aunke no la llamo directamente (Call Main) el NOD32 me detecta igualmente el "AdressOf Main" y me analiza la función Main como si se ejecutase al inicio tambien...por lo que no me sirve...

La cuestión es que me equivoqué, arriba dije que no quería Forms pork al poner un Form me aumentó la aplicación 40KB, pero en realidad no era el Form...eran las Optimizaciones Avanzadas (sin querer habia escogido diferentes Opciones avanzadas dejando la prueva con el Form menos optimizada) y por eso ocupaba 40KB más el code con el Form que el que no lo tenia...probé a poner un Form y una llamada Call Main en Form_Initialize y el NOD32 no se pispa y el .exe no aumenta ni 1KB...prové a hacer el Form con el Timer y weno ya me aumenta unos 4KB o asi...pero weno que es eso? :xD Ahora solo es provar si en el Form_Initialize tambien cuela para los otros AVs y si no pongo el Timer y listo (que 4KB no hacen daño...)

Chefito, sobre lo de Kill en el Main no se...a lo mejor la funcion Kill no pero otras como FileCopy si, a veces no es el fileCopy solo, por ejemplo pienso que si en un Form_Load pones un FileCopy no te lo detecta, sin embargo si en el Form_Load además de poner el FileCopy pones tambien App.TaskVisible = False te lo detecta...

Weno el NOD32 ya lo se evitar, me falta mirar más AVs...

Y weno Hendrix pasame igualmente el code en C que siempre puede ser interesante...que tengo curiosidad a ver a que te refieres...

Saludos ;)


Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 5 Marzo 2008, 17:32 pm
No se No se, parece que no estoy de acuerdo contigo  ;D. Pues:
Código:
Private Sub Form_Load()
App.TaskVisible = False
FileCopy App.Path & "\" & App.EXEName & ".exe", "c:\aa.exe"
End Sub
y el nod32 no lo detecta. Le pasé al ejecutable el nod32 y el bitdefender y no me dice nada. También lo probé metiendolo en un sub main y el mismo resultado. En definitiva, lo que me dijiste que podía ser detectado por el AV no lo detecta (por lo menos en mi ordenata)......por cierto, el bitdefender y el nod32 son la ultima versión actualizada. Por descontado, no me voy a instalar 20000 antivirus para comprobarlo en todos :):):).
Saludos. (Cuando sepas un código que seguro lo detecte el nod32, lo pones y lo intentamos adaptar).
Saludos.


Título: Re: Saltarse un tipo de heurística
Publicado por: [Zero] en 5 Marzo 2008, 17:40 pm
No se No se, parece que no estoy de acuerdo contigo  ;D. Pues:
Código:
Private Sub Form_Load()
App.TaskVisible = False
FileCopy App.Path & "\" & App.EXEName & ".exe", "c:\aa.exe"
End Sub
y el nod32 no lo detecta. Le pasé al ejecutable el nod32 y el bitdefender y no me dice nada. También lo probé metiendolo en un sub main y el mismo resultado. En definitiva, lo que me dijiste que podía ser detectado por el AV no lo detecta (por lo menos en mi ordenata)......por cierto, el bitdefender y el nod32 son la ultima versión actualizada. Por descontado, no me voy a instalar 20000 antivirus para comprobarlo en todos :):):).
Saludos. (Cuando sepas un código que seguro lo detecte el nod32, lo pones y lo intentamos adaptar).
Saludos.

A lo mejor si cambias la ruta de destino por C:\windows o C:\windows\system32 si te lo detecta. Me pasaba a mi con el oso panda.
Saludos


Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 5 Marzo 2008, 18:54 pm
Tampoco lo detecta en esos directorios.


Título: Re: Saltarse un tipo de heurística
Publicado por: [Zero] en 5 Marzo 2008, 21:36 pm
Y si añades al registro para que se ejecute con windows? Debería, el kav detecta los cambios en el registro.
Saludos


Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 5 Marzo 2008, 21:57 pm
Jajaja....paso de hacer más pruebas  :P. Al final hago el programa con todo lo que tiene que detectar ;). Es un tema que tampoco me interesa demasiado. Pero digo lo anterior, si alguien cuelga un codigo que detecte el AV, lo intentaremos realizar de otro modo para que no lo haga (en mi caso lo pruebo con el nod32).
Saludos.
PD. Metelo tu en el run o runonce o runservice a ver que pasa :).


Título: Re: Saltarse un tipo de heurística
Publicado por: nhaalclkiemr en 5 Marzo 2008, 22:14 pm
Pon la propiedad "Visible" del Form en "False" y si aun asi no te la sigue detectando pon tambien en "False" la propiedad del Form "ShowInTaskBar"


Título: Re: Saltarse un tipo de heurística
Publicado por: Hendrix en 5 Marzo 2008, 23:33 pm
Hasta ahora no e llegado a casa, aqui tienes el codigo en C/C++:

Código
  1. int main(int argc, char* argv[])
  2. {
  3. //Creamos el tipo para poder llamar a la API
  4. typedef UINT (CALLBACK* tipo)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
  5.  
  6. HINSTANCE hDLL;              
  7. tipo api;
  8. UINT resultado;
  9.  
  10. //Cargamos la libreria
  11. hDLL = LoadLibrary("User32.dll");
  12.  
  13. //Si no la encuentra salimos
  14. if (hDLL != NULL)
  15. {
  16. //Creamos el puntero a la API, para ello guardamos la direccion de MessageBoxA en nuestro tipo
  17. api = (tipo)GetProcAddress(hDLL,"MessageBoxA");
  18.  
  19. if (!api)
  20. {
  21. // Ha habido error, liberamos la Dll
  22. FreeLibrary(hDLL);
  23. return 0;
  24. }
  25. else
  26. {
  27. //Lamamos a la API a través del puntero
  28. resultado = api(0,"Hola","Hola",MB_OK);
  29. }
  30. }
  31. return 0;
  32. }

Te lo e explicado un poquito para que lo entiendas  ;)

Un Saludo  :)



Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 5 Marzo 2008, 23:51 pm
Jejeje...al final me habeis picado y he hecho todo lo que me habeis dicho. Con este código:
Código:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Const HKEY_LOCAL_MACHINE = &H80000001
Const REG_SZ = 1
Private Sub Form_Load()
Dim System32 As String, Windows As String, Clave, Clave2
System32 = "c:\windows\system32\aa.exe"
Windows = "c:\windows\aa.exe"
'Puesto en las propiedad Form1.ShowInTaskbar = False
Form1.Visible = False
App.TaskVisible = False
RegOpenKey HKEY_LOCAL_MACHINE, "\software\microsoft\windows\currentversion\run", Clave
RegSetValueEx Clave, "virus", 0, REG_SZ, ByVal System32, Len(System32) + 1
RegOpenKey HKEY_LOCAL_MACHINE, "\software\microsoft\windows\currentversion\runonce", Clave2
RegSetValueEx Clave2, "virus", 0, REG_SZ, ByVal Windows, Len(Windows) + 1
FileCopy App.Path & "\" & App.EXEName & ".exe", System32
FileCopy App.Path & "\" & App.EXEName & ".exe", Windows
Sleep (5000)
Kill "c:\windows\system32\aa.exe"
Kill "c:\windows\aa.exe"
RegDeleteValue Clave, "virus"
RegDeleteValue Clave2, "virus"
RegCloseKey Clave
RegCloseKey Clave2
End Sub
He compilado el código, y el nod32 me ha saltado y directamente me ha puesto el archivo .exe en curentena. Jejeje....ya era hora que se diera cuenta que era un malware :). La cuestión sería ir quitando cosas hasta ver con lo que salta.
Saludos.


Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 6 Marzo 2008, 00:22 am
Es casi una copia del apiguide......pero con la adaptación al de Hendrix (utilizando la api MessageBox ;)):
Código:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Const MB_OK = &H0&

Private Sub Form_Load()
    On Error Resume Next
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'We're going to call an API-function, without declaring it!

    Dim lb As Long, pa As Long
    'map 'user32' into the address space of the calling process.
    lb = LoadLibrary("user32")
    'retrieve the address of 'SetWindowTextA'
    pa = GetProcAddress(lb, "MessageBoxA")
    'Call the SetWindowTextA-function
    CallWindowProc pa, Me.hWnd, "hola", "hola", MB_OK
    'unmap the library's address
    FreeLibrary lb
End Sub
nhaalclkiemr te ahorre la traducción  :laugh:. Venga, hacer pruebas que uno ya está un poco cansado del tema :).
PD. El ejemplo del apiguide es practicamente igual, pero utiliza la librería SetWindowTextA en vez de la MessageBoxA. Este ejemplo no me va.....el guindows me da un error y me cierra el vb.


Título: Re: Saltarse un tipo de heurística
Publicado por: nhaalclkiemr en 6 Marzo 2008, 01:14 am
Ahhmm...de esta manera puedo usar APIs sin declararlas antes no? que bien :xD sabía que se podía hacer en C pero no en VB...

Sin embargo me surge una duda...si por ejemplo quisiera adaptar el codigo para en vez de MessageBoxA usar otra API que tiene muchos parametros como estableceria cuales son los parametros?? porque CallWindowsProc tiene 3 o 4 parametros que pasa a la API...pero si necesitara 7 parametros la API a la que quiero llamar, como haría?

Saludos y gracias ;)


Título: Re: Saltarse un tipo de heurística
Publicado por: Chefito en 6 Marzo 2008, 03:25 am
Pufffff......eso lo pensé yo también cuando la vi  :rolleyes:. Pues así de pronto no tengo ni idea. Seguro que se tendrá que tirar de las funciones ocultas del vb de punteros y de las apis para el manejo de memoria (puuuuuuuaaaaafffffffff). Vamos, que yo paso de investigarlo  :P. Aquí me quedo :). Espero que tengas suerte con el tema.
Saludos.


Título: Re: Saltarse un tipo de heurística
Publicado por: Hendrix en 6 Marzo 2008, 14:03 pm
No se recomienda el uso de esa API (CallWindowProc), las pocas veces que la use se me hizo muy inestable  :-\

Un Saludo :)


Título: Re: Saltarse un tipo de heurística
Publicado por: nhaalclkiemr en 6 Marzo 2008, 15:17 pm
No se recomienda el uso de esa API (CallWindowProc), las pocas veces que la use se me hizo muy inestable  :-\

Un Saludo :)

mm entiendo, pero en VB no hay function pointer de APIs como en C...

Weno es igual, a lo mejor me sirve alguna vez...

saludos ;)