发一块代码段(删除正在运行的程序文件)

原创 发一块代码段(删除正在运行的程序文件)收藏

作 者: 老Y 时 间: 2007-05-25,16:59 链 接: http://bbs.pediy.com/showthread.php?t=45233 先声明一下,本文的代码其实也是从别人的工具里A出来的(A=逆向+还原),所以也不敢称是原创,有同好的朋友自然知道是哪个工具里的:),另外,由于本人不太会写文章,看不明白的地方还请大家多多谅解。 回到正题,通过分析得知,删除正在运行的程序文件的关键在于hook MmFlushImageSection这个函数,该函数原型BOOLEAN MmFlushImageSection(                  PSECTION_OBJECT_POINTERS SectionObjectPointer,                  MMFLUSH_TYPE FlushType),其流程大概如下: 1.打开要删除的文件,如:调用IoCreateFile 2.把要删除的文件属性设为Normal 3.Hook ntfs和fatfast内的引入函数MmFlushImageSection 4.发送删除IRP 大概代码如下(比较简单的一个Demo): void ForceDeleteFile(PVOID ThreadContext) {   int krResult = FALSE;   int krRetCode = FALSE;   //NTSTATUS rc;   HANDLE hFile = NULL, hFileSystem = NULL, SectionHandle = NULL;   CHAR *FileName = (CHAR*)ThreadContext;   CHAR szFileSystem[MAX_PATH_LEN];   PUCHAR  pMap = NULL;   ULONG  uMapSize = 0;   PVOID  OrgFunc = NULL, OrgFunc_Ptr = NULL;   KFile  ntfs, fastfat, del;      //UNICODE_STRING usFileName;   //PFILE_OBJECT pFileObject = NULL;   //OBJECT_ATTRIBUTES ob;   DEBUG_BREAK;   krRetCode = del.OpenFile(FileName, GENERIC_READ);   PROCESS_ERROR(krRetCode);   dprintf("Open %s successful./n", FileName);   krResult = del.SetFileAttributeToNormal();   PROCESS_ERROR(krResult);   strcpy(szFileSystem, DRIVERS_PATH);   strcat(szFileSystem, "ntfs.sys");   krRetCode = ntfs.OpenFile(szFileSystem, GENERIC_READ);   PROCESS_ERROR(krRetCode);   g_Deleted = TRUE;   krRetCode = ntfs.MapFile(&pMap, &uMapSize);   PROCESS_ERROR(krRetCode);      krRetCode = HookIAT(     "MmFlushImageSection",     "ntfs.sys",      pMap,     uMapSize,     (PVOID)MmFlushImageSection_New,     (PVOID*)&_MmFlushImageSection,     &OrgFunc_Ptr     );   PROCESS_ERROR(krRetCode);   krRetCode = ntfs.UnMapFile();   PROCESS_ERROR(krRetCode);   strcpy(szFileSystem, DRIVERS_PATH);   strcat(szFileSystem, "fastfat.sys");   krRetCode = fastfat.OpenFile(szFileSystem, GENERIC_READ);   PROCESS_ERROR(hFileSystem);   krRetCode = fastfat.MapFile( &pMap, &uMapSize);   PROCESS_ERROR(krRetCode);   krRetCode = HookIAT(     "MmFlushImageSection",     "fastfat.sys",      pMap,     uMapSize,     (PVOID)MmFlushImageSection_New,     (PVOID*)&_MmFlushImageSection,     &OrgFunc_Ptr     );   PROCESS_ERROR(krRetCode);   krRetCode = ntfs.UnMapFile();   PROCESS_ERROR(krRetCode);   krResult = Rd_DeleteFile(del.GetFileHandle());   PROCESS_ERROR(krResult);   krResult = TRUE; Exit0:   g_Deleted = FALSE;   if (OrgFunc && OrgFunc_Ptr)   {     UnHookIAT(_MmFlushImageSection, OrgFunc_Ptr);   }   ntfs.Close();   fastfat.Close();   del.Close();   return; } Rd_DeleteFile代码如下: int Rd_DeleteFile(HANDLE hFile) {   int krResult = FALSE;   DEVICE_OBJECT *pRealObject = NULL;   DEVICE_OBJECT *pDeviceObject = NULL;     PIRP irp;     NTSTATUS rc;     KEVENT event;     PIO_STACK_LOCATION irpSp;     IO_STATUS_BLOCK localIoStatus;   PFILE_OBJECT pFileObject = NULL;   FILE_DISPOSITION_INFORMATION disp;   ULONG Length = sizeof(FILE_DISPOSITION_INFORMATION);   disp.DeleteFile = TRUE;   rc = ObReferenceObjectByHandle(     hFile,     0,     *IoFileObjectType,     0,      (PVOID*)&pFileObject,     0);      PROCESS_DDK_ERROR(rc);   pDeviceObject = GetRealDeviceObject(pFileObject, &pRealObject);   PROCESS_ERROR(pDeviceObject);      KeInitializeEvent(&event, SynchronizationEvent, FALSE);   irp = IoAllocateIrp(pDeviceObject->StackSize, 0);   if (!irp)   {     goto Exit0;   }   irp->UserEvent = &event;   irp->UserIosb = &localIoStatus;   irp->Overlay.AsynchronousParameters.UserApcRoutine= (PIO_APC_ROUTINE) NULL;   irp->RequestorMode = 0;   irp->Tail.Overlay.Thread = PsGetCurrentThread();   irp->Tail.Overlay.OriginalFileObject = pFileObject;   irp->Flags = IRP_BUFFERED_IO;   irpSp = IoGetNextIrpStackLocation( irp );     irpSp->MajorFunction = IRP_MJ_SET_INFORMATION;     irpSp->FileObject = pFileObject;   irpSp->DeviceObject = pDeviceObject;     irp->UserBuffer = NULL;     irp->AssociatedIrp.SystemBuffer = NULL;     irp->MdlAddress = (PMDL) NULL;        __try {         irp->AssociatedIrp.SystemBuffer = ExAllocatePoolWithQuota( NonPagedPool,                                                                    Length );         RtlCopyMemory( irp->AssociatedIrp.SystemBuffer,                        &disp,                        Length );     }    __except(EXCEPTION_EXECUTE_HANDLER)    {         //         // An exception was incurred while allocating the intermediary         // system buffer or while copying the caller's data into the         // buffer. Cleanup and return an appropriate error status code.         //         IopExceptionCleanup( pFileObject,                              irp,                              (PKEVENT) NULL,                              &event );         return GetExceptionCode();     }     irp->Flags |= IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER | IRP_DEFER_IO_COMPLETION;     irpSp->Parameters.SetFile.DeleteHandle = hFile;   irpSp->Parameters.SetFile.Length = Length;     irpSp->Parameters.SetFile.FileInformationClass = FileDispositionInformation;      irpSp->Control = 0xE0;   irpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)Io_Completion_Routine;      if (rc == STATUS_PENDING)   {     rc = KeWaitForSingleObject(       &event,       Executive,       0,       1,       0);        }        krResult = TRUE; Exit0:   return krResult; } 原理: 该IRP最后会调用Ntfs内的NtfsSetDispositionInfo函数或Fastfat内的 FatSetPositionInfo函数(这区别于你的硬盘分区是什么文件系统),而这两个函数都会调用Ntoskrnl内的 MmFlushImageSection函数,由于我们 hook了这两驱动内的MmFlushImageSection调用,所以当它自己发送IRP 时,Hook_MmFlushImageSection就能截获请求,然后在该函数内判断SectionObjectPointer参数是否等于需要删除 文件的SectionObjectPointer,如果相等则调用原来的MmFlushImageSection并返回True(返回True表示正在被 操作的FileObject的Section不存在或没有被Map进内存),如果不相等,则返回原来的MmFlushImageSection的调用结 果。                  后记:     自己构造IRP直接与FSD通信已经是老生常谈的话题了,有兴趣的朋友可以网上找找。
<think>好的,用户现在想要一段删除JSON文件代码。首先,我需要确认用户的具体需求。他们可能是在开过程中需要清理临时文件,或者是在处理数据时删除旧的JSON数据。用户可能对编程有一定的基础,但可能需要具体的代码示例。 接下来,我需要考虑用户使用的编程语言。因为用户没有指定,可能需要覆盖几种常见的语言,比如Python、JavaScript、Java等。但根据常见的趋势,Python可能是用户最可能使用的,所以优先提供Python的示例,然后再补充其他语言。 然后,要确保代码的正确性和安全性。删除文件是一个危险的操作,必须提醒用户注意文件存在性检查和异常处理。例如,在Python中使用os模块的remove函数前,最好检查文件是否存在,或者使用try-except块来捕获异常,如FileNotFoundError,避免程序崩溃。 另外,用户可能不仅需要代码片段,还需要一些解释,比如每行代码的作用,或者为什么需要这样做。例如,解释os.path.exists的作用,或者异常处理的重要性。这有助于用户理解代码,而不仅仅是复制粘贴。 还要考虑跨平台的问题,比如路径的处理。在Windows和Linux中路径的写法不同,可能需要提醒用户注意路径的正确性。比如使用反斜杠或正斜杠,或者推荐使用os.path模块来处理路径,提高可移植性。 另外,用户可能需要删除多个JSON文件,比如通配符匹配或者批量删除。这时候可能需要展示如何使用glob模块来匹配多个文件,并循环删除。但用户的问题中没有提到批量删除,可能暂时不需要,但可以作为一个扩展点提及。 同时,需要提醒用户删除操作是不可逆的,确保他们真的想要删除文件,特别是在生产环境中。可能建议在删除前进行确认提示,或者在测试环境中先运行。 最后,总结不同编程语言的实现方式,并给出完整的示例代码,确保用户能够直接使用。同时,附上注意事项,帮助用户避免常见错误,比如路径错误、权限问题等。</think>在不同编程语言中删除JSON文件的核心思路相同,但实现方式有所差异。以下是Python、JavaScript和Java的代码示例及最佳实践指南: --- ### Python版(推荐方案) ```python import os import json def delete_json_file(file_path): """安全删除JSON文件的三重验证方案""" try: # 验证1:路径有效性检查 if not os.path.exists(file_path): raise FileNotFoundError(f"路径 {file_path} 不存在") # 验证2:文件类型确认 if not file_path.lower().endswith('.json'): raise ValueError("仅允许删除JSON格式文件") # 验证3:文件内容校验(可选) with open(file_path, 'r') as f: json.load(f) # 验证是否为合法JSON格式 os.remove(file_path) print(f"成功删除: {file_path}") return True except (FileNotFoundError, ValueError, json.JSONDecodeError) as e: print(f"删除失败: {str(e)}") return False # 使用示例 delete_json_file("data/config.json") ``` --- ### JavaScript版(Node.js环境) ```javascript const fs = require('fs'); const path = require('path'); function deleteJsonFile(filePath) { // 校验文件扩展名 if (path.extname(filePath).toLowerCase() !== '.json') { throw new Error('仅允许删除JSON文件'); } // 异步安全删除 fs.access(filePath, fs.constants.F_OK, (err) => { if (err) { console.error('文件不存在:', filePath); return; } fs.unlink(filePath, (err) => { err ? console.error('删除失败:', err) : console.log('成功删除:', filePath); }); }); } // 使用示例 deleteJsonFile('./temp/data.json'); ``` --- ### Java版(企业级实现) ```java import java.nio.file.*; public class JsonFileDeleter { public static boolean deleteJsonFile(String filePath) { Path path = Paths.get(filePath); try { // MIME类型验证 String contentType = Files.probeContentType(path); if (!"application/json".equals(contentType)) { throw new SecurityException("非法文件类型"); } // 权限验证 if (!Files.isWritable(path)) { throw new AccessDeniedException("无写入权限"); } return Files.deleteIfExists(path); } catch (IOException | SecurityException e) { System.err.println("删除失败: " + e.getMessage()); return false; } } } ``` --- **关键注意事项**: 1. **安全验证**(重要等级⭐️⭐️⭐️⭐️⭐️) - 文件存在性检查(避免`FileNotFound`异常) - 文件类型双重验证(扩展名 + MIME类型) - 权限校验(特别是Linux系统) 2. **防御性编程**(重要等级⭐️⭐️⭐️⭐️) - 使用`try-with-resources`(Java) - 异步错误处理(Node.js) - 异常类型精确捕获(Python) 3. **日志记录**(生产环境必备) - 记录删除操作时间戳 - 存储文件最后修改时间 - 建议实现回收站机制而非直接删除 4. **性能优化**(大数据量场景): ```python # Python批量删除示例 import glob for json_file in glob.glob('logs/*.json'): delete_json_file(json_file) ``` 根据实际需求选择方案,建议Python版用于日常脚本,Java版适用于企业级系统,Node.js版适合前端工程化场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值