某些文件由于当前进程还在占用中,无法立刻删除,可通过 KERNEL32 提供的 MoveFileEx 方法延迟到下次开机启动时删除文件 在某些情况下,比如应用软件卸载等情况,由于当前进程还在占用着文件, 此时可使用 MoveFileExW 方法执行延迟删除 本文将使用 CsWin32 库辅助对 MoveFileEx 的调用,详细请看 dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑 文件夹也是可以调用 MoveFileEx 进行删除的 } PInvoke.MoveFileEx(file, null, MOVE_FILE_FLAGS.MOVEFILE_DELAY_UNTIL_REBOOT ); Console.WriteLine($"重启后删除 '{file}' 文件"); 注: 调用 MoveFileEx 方法时,要求采用管理员权限(官方文档:仅当进程位于属于管理员组或 LocalSystem 如果要删除有文件的文件夹,可先遍历文件夹内所有文件,先将文件逐一调用 MoveFileEx 方法删除,然后再调用 MoveFileEx 删除文件夹。
MoveFileEx方式 我们首先看一下MoveFileEx这个api BOOL MoveFileExA( [in] LPCSTR lpExistingFileName, 那么我们这里实现自删除的话,就是好需要设置dwFlags为MOVEFILE_DELAY_UNTIL_REBOOT,这里为什么要system或者administrator权限呢,是因为MoveFileEx \,在MoveFileEx的函数定义中删除文件的路径开头需要加上\\?\ 所以我们在缓冲区前面先加上\\?\ char szTemp[MAX_PATH] = "\\\\? \\"; 因为我们要把路径写在缓冲区后面,就要使用到lstrcat ::lstrcat(szTemp, szFileName); 然后调用MoveFileEx实现自删除 BOOL bRet = :: MoveFileEx(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); 完整代码如下 BOOL MoveDel(char* szFileName) { char
CopyFile 复制文件 注意:只能复制文件,而不能复制目录 MoveFileEx 移动文件 既可以移动文件,也可以移动目录,但不能跨越盘符。
des,true); CopyFileEx(src,des,func,¶,false, COPY_FILE_FAIL_IF_EXISTS); 移动文件: MoveFile(src,des); MoveFileEx
如果要移动文件夹,可以使用 MoveFileEx() 函数。
使用 MoveFileEx(路径,NULL,MOVEFILE_DELAY_UNTIL_REBOOT)这个函数进行重启删除。 参数2不为空,就是替换,为NULL就是删除。
\\"; ::lstrcat(szTemp, pszFileName); BOOL bRet = ::MoveFileEx(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT
在删除线程中,蠕虫是先将源文件通过MoveFileEx函数移动到其创建的临时文件夹下,最后统一进行删除。
比如MoveFileEx替换MoveFile。 2. 未导出api 寻找相同功能的未导出API进行替换,杀软拦截一般是导出API,或者底层调用,寻找未导出API有一定效果。