Hola a todos, estoy tratando de lograr borrar un archivo en uso, alguno tiene idea de como poder lograrlo?
En realidad quiero lograr algo parecido a lo que hace el programa Unlocker, que desbloquea el archivo sin tener que cerrar la aplicación que lo está usando y lo mejor es que desde la otra aplicación el archivo se sigue visualizando.
Ej: un excel o un doc
Una forma de cerrar el HANDLE es usando DuplicateHandle con DUPLICATE_CLOSE_SOURCE.
Unlocker utiliza ambos y un driver o hacer lo que dijo EI.
Abrí el archivo WORD.xls
Usé el unlocker para ver el pid más el handle, que eran 8300 y 924
Ejecuté este código
int main()
{
DWORD source_pid;
HANDLE oldhandle;
bool success;
source_pid = 8300;
oldhandle = (HANDLE)924;
LPCSTR Path = "C:\\WORD.xls";
HANDLE source_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, source_pid);
HANDLE newhandle;
success = DuplicateHandle(source_handle, (HANDLE)oldhandle, GetCurrentProcess(), &newhandle, DUPLICATE_SAME_ACCESS, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
success = DeleteFile(Path);
CloseHandle(source_handle);
success = DeleteFile(Path);
CloseHandle(newhandle);
success = DeleteFile(Path);
return 0;
}
Luego de ejecutar este código, usé el unlocker de nuevo, ahora me mostraba "No locking handle found"
pero no puedo eliminar el archivo...
Alguno tiene idea?
Fijate que devuelve GetLastError para empezar.
DuplicateHandle retorna true los DeleteFile retornan false
Si, llama a GetLastError (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx) despues de DeleteFile y fijate que valor devuelve esa funcion.
Cita de: Eternal Idol en 14 Abril 2014, 22:11 PM
Si, llama a GetLastError (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx) despues de DeleteFile y fijate que valor devuelve esa funcion.
Devolvió el número 32.
Lo busqué y es ésto:
ERROR_SHARING_VIOLATION
32 (0x20)
The process cannot access the file because it is being used by another process.
Luego me dá el número 5.
ERROR_ACCESS_DENIED
5 (0x5)
Access is denied.
El ERROR_SHARING_VIOLATION primero tiene sentido, intenta borrar el archivo todavia teniendo el HANDLE en tu programa y el ERROR_ACCESS_DENIED es por no tener los permisos necesarios.
¿Una vez que cerras el HANDLE con tu programa y este termina podes borrar el archivo con el Explorador de Windows?
Cita de: Eternal Idol en 14 Abril 2014, 23:06 PM
El ERROR_SHARING_VIOLATION primero tiene sentido, intenta borrar el archivo todavia teniendo el HANDLE en tu programa y el ERROR_ACCESS_DENIED es por no tener los permisos necesarios.
¿Una vez que cerras el HANDLE con tu programa y este termina podes borrar el archivo con el Explorador de Windows?
Una vez cerrado el handle no lo puedo borrar desde Windows, inclusive con el Unlocker, porque me muestra en AMBOS que el archivo ya no tiene un handle abierto, pero no se puede eliminar a mano, y para eliminarlo tengo que usar el unlocker con la accion delete, asumo que ahí se usa el driver del unlocker, ya que ambos pueden cerrar el handle y no se puede eliminar a mano. (programación o windows)
Cita de: Miseryk en 15 Abril 2014, 02:08 AM
Una vez cerrado el handle no lo puedo borrar desde Windows, inclusive con el Unlocker, porque me muestra en AMBOS que el archivo ya no tiene un handle abierto, pero no se puede eliminar a mano, y para eliminarlo tengo que usar el unlocker con la accion delete, asumo que ahí se usa el driver del unlocker, ya que ambos pueden cerrar el handle y no se puede eliminar a mano. (programación o windows)
¿Ejecutaste el cmd como administrador y probaste a borrar asi? Otra razon posible: el archivo es de solo lectura. Si es el caso podes usar SetFileAttributes (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29.aspx) con FILE_ATTRIBUTE_NORMAL para solucionarlo y despues borrar.
Cita de: Eternal Idol en 15 Abril 2014, 06:00 AM
¿Ejecutaste el cmd como administrador y probaste a borrar asi? Otra razon posible: el archivo es de solo lectura. Si es el caso podes usar SetFileAttributes (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29.aspx) con FILE_ATTRIBUTE_NORMAL para solucionarlo y despues borrar.
Estuve viendo con el programa Process Explorer y no me parece más el handle, pero me aparece ésto:
PROCESS PID Type Name
EXCEL.EXE 5080 DLL C:\WORD.xls
¿Comprobaste lo que te dije? ¿Que Windows y Office usas? Con Windows 7 x64 y Office 2013 no reproduzco el problema ...
Bueno agrupé todo lo que hice y lo tengo acá:
https://drive.google.com/file/d/0B_8uzBfhUWBZc2JndWFKYmlWOTQ/edit?usp=sharing (https://drive.google.com/file/d/0B_8uzBfhUWBZc2JndWFKYmlWOTQ/edit?usp=sharing)
Archivo->Descargar
Dejé un Readme Steps.txt que dice paso por paso para llegar al mismo problema en el que estoy actualmente.
PD: no hace falta compilar ni algo parecido.
PD2: está en inglés porque también lo postié en hackhound
Edit: Sry, cuando lo abrí desde acá me decía lo de la licencia del OCX, ya está patched.
Edit2: mantengo actualizado el proyecto desde ese mismo enlace.
Es un archivo mappeado en memoria, no una DLL, asi que tenes que encontrar el HANDLE a su section y cerrarlo (ademas de usar UnmapViewOfFile con la direccion mappeada). ¿Como hacerlo desde modo Usuario? Yo crearia un hilo remoto, trataria de encontrar el HANDLE al objeto section que corresponde a la memoria mappeada (con ZwQuerySection y SectionBasicInformation), lo cerraria y finalmente llamaria a UnmapViewOfFile.
Nuevas noticias, estuve buscando y encontré lo siguiente:
Con Process Explorer encontré C:\WORD.xls como ésto:
Process PID Type Name
EXCEL.EXE 12776 DLL C:\WORD.xls
Traté de EyectarDll con ese nombre pero no funcionó.
Fui a las propiedades:
Load Address: 0x06510000
Mapped Size: 0x19D000 bytes
Mapping Type: Data
Entonces fui al CheatEngine:
Attach
Memory Viewer
View -> Memory Regions (Crtl+R)
I encontré ésto:
Address Allocation Protect State Protect Type Size Extra
06510000 Read+Write Commit Read+Write Mapped 100000 \Device\Harddisk\Volume2\WORD.xls
06610000 Read+Write Reserve Mapped 9D00 \Device\Harddisk\Volume2\WORD.xls
066AD000 Free No Access - 3000
¿Noticias? Ya te dije que no es una DLL y que tenes que hacer, no es tan sencillo, suerte con eso.