elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Interceptar borrado de archivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Interceptar borrado de archivo  (Leído 8,096 veces)
alicia19es

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Interceptar borrado de archivo
« en: 28 Diciembre 2013, 02:11 am »

Hola a todos, estoy dando los ultimos toques a una aplicación realizada en vb.net.
La aplicación detecta la introducción de usb en el pc y realiza una copia en el disco de archivos segun unos filtros determinados, comprobando previamente que ya no exista mediante codificacion md5.
Pero quiero ir un poco más allá, y he pensado en que se realice una copia del fichero que el usuario intente eliminar, ya que esta eliminacion puede deberse a dos motivos:
  • 1. A que el archivo no le valga
  • 2. Que el archivo sea digámoslo "comprometido" y le interese eliminarlo
He estado haciendo pruebas con el systemfilewatcher, pero solo detecta los eventos una vez producidos, por lo que cuando intento copiar el archivo, este ya no existe.
La pregunta es, ¿Existe alguna forma de interceptar ese intento de borrado para realizar una copia previa de dicho archivo?

Gracias.


En línea

alicia19es

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #1 en: 28 Diciembre 2013, 13:08 pm »

Bueno, no consigo encontrar nada por ahí referente al tema.
Pienso que quizás podría intentar algo como capturar el proceso y los argumentos que utiliza Windows cuando recibe la orden de borrado de archivos.
Pero ¿como se llama ese proceso?¿Cómo interceptarlo?, etc...
Si alguien tiene alguna idea, por favor, que lo postee.
Gracias y saludos


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #2 en: 28 Diciembre 2013, 14:26 pm »

No es nada facil, debes crear o bien un Hook Global (API Hook), o bien un driver (File System Filter Driver).

La función (indocumentada) NtSetFileInformation de la WinAPI es llamada para eliminar un archivo, con la estructura FileDispositionInformation ,
aunque también debes mirar la función DeleteFile, y no se si habrá otras, y luego está el uso de la interface ICopyHook que exclusívamente previene de la eliminación mediante la Shell.

Para intentar hookear la API puedes utilizar la librería Deviare, o EasyHook, mhook (c++), u otras. Hay varios ejemplos en Google tanto para VBNET como C#, aunque parece que todas las librerías tienen sus desventajas y bugs.

EDITO: En este ejemplo puedes hacerte una idea del modo de empleo de Easyhook junto a lo necesario para hookear dicha functión NtSetFileInformation.

Saludos.
« Última modificación: 28 Diciembre 2013, 15:10 pm por ElektroSoft » En línea

ThinkByYourself

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #3 en: 28 Diciembre 2013, 14:31 pm »

Puedes hacerloo bien... o puedes buscar el camino corto.

No sé si se podrá pero a lo mejor puedes listar (en un bucle infinito) los ficheros del directorio que se supone que tiene que guardar lo que haya en el usb, y cuando se liste algo diferente que nada PUM!!!!!!!! Bacap al canto, cifrado y ocultamiento. Dime si te sirve, no sería la primera vez que lo he pensado! Un saludo!
En línea

No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.
alicia19es

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #4 en: 28 Diciembre 2013, 17:18 pm »

Muchas gracias a los dos.
En principio quiero hacerlo bien, pero me parece Elektrosoft que eso puede sobrepasar mi nivel de conocimientos. De todas formas lo miraré.
Una pregunta: ¿Con kernel.dll y user32.dll no podría conseguir algo? Por ejemplo con las deletefile, etc...?
Gracias
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #5 en: 28 Diciembre 2013, 19:12 pm »

user32.dll ... deletefile ...

Esa es precísamente una de las funciones que nombré: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363915%28v=vs.85%29.aspx

Iguálmente deberías hookear esa función para interceptar cuando el SO llama a la función, pero ya puestos mejor prueba con NtSetFileInformation (se encuentra en la ntdll.dll) porque según he leido es la función por la que pasa cualquier método de eliminación (y otros), aunque está indocumentada así que mucha información no tengo, pero DeleteFile ahora que lo leo la documentación es posible que no tenga nada que ver con tu propósito puesto que no tiene parámetros para enviar a la papelera, es una función que debe estar limitada a la Shell (supongo).

Saludos
« Última modificación: 28 Diciembre 2013, 19:51 pm por ElektroSoft » En línea

alicia19es

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #6 en: 28 Diciembre 2013, 21:00 pm »

Hola ElectroSoft, gracias por la ayuda.
En principio voy a descartar el hacerlo mediante la interface ICopiHook y el DeleteFile del kernel.dll, ya que si solo intercepta el borrado mediante shell, pues creo que no me vale.
Mi intención es que intecepte los eventos habituales de un borrado de archivo, seleccionarlo y pulsa la tecla suprimir, quizás se pueda inteceptar esas pulsaciones y actuar en consecuencia, aunque tendría que realizar un bucle infinito, algo que no me gusta demasiado.
He estado un par de hora  investigando sobre la función NtSetFileInformation, pero la verdad es que hay bien poco.
Alguna orientación más que me puedas dar. Tus consejos son bienvenidos, gracias a ellos voy viendo por donde tirar.
Saludos y gracias de nuevo.



He localizado este enlace donde se puede extraer alguna informacion, ahora es necesario descifrarlo  :rolleyes:
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/NtDeleteFile.html



[MOD]: No hagas doble post, utiliza el botón 'MODIFICAR'.
« Última modificación: 29 Diciembre 2013, 02:04 am por ElektroSoft » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #7 en: 29 Diciembre 2013, 01:34 am »

No se si te das cuenta de la cantidad de conocimientos que se requieren para llevar a cabo esta tarea, además de la experiencia en intentos fallidos, si ...porque hookear APIS es lo que tiene, que por alguna chorrada insignificante un hook puede ir perféctamente en Windows XP, pero no funcionar en otra versión de Windows, y lo mismo con las arquitecturas, además entre las diferentes versiones de windows pueden modificar los parámetros de "X" funciones. Fíjate si es dificil que resulta necesario utilizar librerías de terceros para realizar estos hooks de forma decente los cuales ya se encargan de inyectar y etc...

Este campo no lo he tocado prácticamente nada, no vayas a pensar que soy un experto en el tema, los únicos hooks que he realizado han sido de bajo nivel con las funciones que la WinAPI proporciona para instalar los hooks, pero a lo que voy ...implementar ICopyHook sería una manera más limpia (y estable) sin necesidad de Hookear, y te permitiria tener control sobre los archivos eliminados desde el Explorer, pero sigue siendo una pesadilla llevarlo a cabo.

Ahora bien, hay otra alternativa mucho más facil que se me ha ocurrido, sirviéndote del FileSystemWatcher. No pongo la mano en el fuego de haberlo dejado 100% efectivo, deberías testear en profundidad lo que sucede cuando eliminas dos archivos/carpetas con el mismo nombre pero con distinta fecha de modificación para comprobar si se restaura la que se debe restaurar, yo solo te dejo la idea:

EDITO: Para proceder a usar el siguiente código necesitas referenciar Microsoft Shell Controls And Automation.
EDITO2: Le añadí un par de cosas más, y también lo documenté un poco mejor...
Código
  1. Imports System.IO
  2. Imports Shell32
  3.  
  4. Public Class Test
  5.  
  6.    Private SH As New Shell
  7.    Private RecycleBin As Folder = SH.NameSpace(ShellSpecialFolderConstants.ssfBITBUCKET)
  8.    Private WithEvents FSW As New FileSystemWatcher
  9.  
  10.    Private Shadows Sub Load() _
  11.    Handles MyBase.Load
  12.  
  13.        ' Seteo las propiedades del objeto 'FileSystemWatcher'.
  14.        With FSW
  15.            .Path = "C:\Test"
  16.            .IncludeSubdirectories = True
  17.            .Filter = "*"
  18.            .NotifyFilter = NotifyFilters.FileName Or NotifyFilters.DirectoryName
  19.            .EnableRaisingEvents = True
  20.        End With
  21.  
  22.    End Sub
  23.  
  24.    Private Sub OnItemDeleted(sender As FileSystemWatcher, e As FileSystemEventArgs) _
  25.    Handles FSW.Deleted
  26.  
  27.        ' Almacenamos una colección de los items de la papelera de reciclaje.
  28.        ' Tanto archivos, carpetas, y accesos directos .lnk (que no se tratan como archivos ni carpetas),
  29.        ' cuyo nombre sea el mismo nombre que el elemento que se acaba de eliminar.
  30.        ' Y los ordenamos por su fecha de modificación.
  31.        Dim DeletedItems As IEnumerable(Of FolderItem) =
  32.            RecycleBin.Items.Cast(Of FolderItem).
  33.                             Where(Function(Item) Item.Name = e.Name).
  34.                             OrderBy(Function(Item) Item.ModifyDate)
  35.  
  36.        ' Si hubiera más de un elemento con el mismo nombre,
  37.        ' seleccionamos el último elemento que se eliminó (o al menos, eso se supone que debería suceder.)
  38.        Dim LastDeletedItem As Shell32.FolderItem = DeletedItems.LastOrDefault
  39.  
  40.        If LastDeletedItem IsNot Nothing Then
  41.  
  42.            ' Esto es un simple checkeo por prevención,
  43.            ' considero que solo hay un 0,00001% de posibilidades de que se de la condición...
  44.            ' Esto podría deberse a que el usuario haya desecho manuálmente la acción de borrado (CTRL+Z),
  45.            ' en un tiempo menor del que la aplicación ha procesado los elementos de la papelera.
  46.            '
  47.            ' También está el caso de las incontrolables acciones de terceros,
  48.            ' Como por ejemplo el editor de texto 'Sublime Text', que al modificar un archivo,
  49.            ' lo elimina dando un falso positivo.
  50.            If (LastDeletedItem.IsFolder AndAlso Directory.Exists(e.FullPath)) _
  51.               OrElse (Not LastDeletedItem.IsFolder AndAlso File.Exists(e.FullPath)) Then
  52.  
  53.                Throw New Exception(String.Format("¿ El elemento ha sido restaurado ?: {0}", e.FullPath))
  54.                Exit Sub
  55.  
  56.            End If
  57.  
  58.            ' Invocamos el verbo "undelete" para deshacer la acción de borrado sin necesidad de escribir más isntrucciones.
  59.            ' Otros verbos que se pueden usar por ejemplo "delete" para eliminar el elemento de forma permanente,
  60.            ' u "open" para abrir las propiedades del elemento.
  61.            LastDeletedItem.InvokeVerb("undelete")
  62.  
  63.            ' O bien hacemos otra cosa distinta, como por ejemplo un backup del archivo/directorio eliminado...
  64.            '
  65.            'Dim BackupPath = String.Format("C:\Backup\{0}", e.Name)
  66.            '
  67.            'Select Case LastDeletedItem.IsFolder
  68.            '
  69.            '    Case True
  70.            '        FileIO.FileSystem.CopyDirectory(LastDeletedItem.Path, BackupPath,
  71.            '                                        FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)
  72.            '
  73.            '    Case False
  74.            '        FileIO.FileSystem.CopyFile(LastDeletedItem.Path, BackupPath,
  75.            '                                   FileIO.UIOption.AllDialogs, FileIO.UICancelOption.ThrowException)
  76.            '
  77.            'End Select
  78.  
  79.        End If
  80.  
  81.    End Sub
  82.  
  83. End Class

Saludos
« Última modificación: 29 Diciembre 2013, 02:23 am por ElektroSoft » En línea

alicia19es

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #8 en: 29 Diciembre 2013, 12:03 pm »

ElectroZoider (¿Te has cambiado el nick?, te has salido.
Vaya tela, la clase que me acabas de ofrecer. Voy a analizarla un poco y ya te cuento. De verdad muchas gracias. Yo no tengo ese nivel todavía, algunas cosas se me escapan, sobre todo a la hora de buscar las declaraciones correctas, funciones de las namespaces, tipo de atributos segun su estructura....
En fin poco a poco voy aprendiendo con gente como tú.
Muchas gracias, en cuanto lo pruebe te lo comento.

-----------------------------------------------------------------------------
Ya he hecho las comprobaciones.  Me da error en la declaración que realizas en la línea 38:
         Dim LastDeletedItem As Shell32.FolderItem = DeletedItems.LastOrDefault me dice:

'LastOrDefault' no es un miembro de 'System.Collections.Generic.IEnumerable(Of Shell32.FolderItem)'.   

y si le doy a ignorar errores y lo ejecuto, una vez elimino un archivo se rompe el programa mostrándome lo siguiente:

No se controló MissingMemberException

No se encuentra el miembro público 'Cast' en el tipo 'FolderItems3'.

Alguna idea del porqué? Saludos y gracias.
« Última modificación: 29 Diciembre 2013, 16:14 pm por alicia19es » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Interceptar borrado de archivo
« Respuesta #9 en: 29 Diciembre 2013, 16:41 pm »

No se controló MissingMemberException
No se encuentra el miembro público 'Cast' en el tipo 'FolderItems3'.

Alguna idea del porqué? Saludos y gracias.

En el código de arriba utilizo algunos métodos de LINQ (.Cast, .Last), para utilizarlos es necesario utilizar la versión Framework 3.5 como mínimo, entonces tienes que actualizar la versión del objetivo de Framework en las propiedades de tu proyecto e importa LINQ:
Código
  1. Imports System.Linq

http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods%28v=vs.100%29.aspx



ElectroZoider (¿Te has cambiado el nick?).
Si jeje, es posible que me vuelva a cambiar de nick antes de acabar el año

Saludos
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Interceptar API « 1 2 »
.NET (C#, VB.NET, ASP)
Keyen Night 12 10,351 Último mensaje 22 Diciembre 2009, 21:07 pm
por raul338
Como recuperar un archivo borrado por accidente de un programa de Audio.
Dudas Generales
Zode 1 4,710 Último mensaje 19 Julio 2013, 10:32 am
por Zode
Interceptar archivo js de una web y cambiar su contenido firefox addon
Desarrollo Web
patilanz 1 1,494 Último mensaje 30 Junio 2015, 23:32 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines