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

keil生成的map文件全面分析 一 map文件 map文件是编译器在连接之后生成的一个文件,用来反映各个函数模块之前的调用关系以及在flash和SRAM中的分布情况,了解这个文件对深入理解嵌入式软件开发有很大的帮助。 map文件大致有4个模块: Section Cross References(代码段间的相互调用关系) Removing Unused input sections from the image.(删除冗余的模块) Image Symbol Table(代码、变量映射表) Memory Map of the image(存 阅读详情
作 者: 老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通信已经是老生常谈的话题了,有兴趣的朋友可以网上找找。 
C#程序运行时如何安全删除自身文件 在Windows平台,运行中的可执行文件因系统级文件锁定机制(IMAGE_FILE_HANDLE)无法被直接删除,这是由NTFS共享访问控制和PE加载器设计决定的基础约束。其技术本质是进程生命周期与文件句柄释放时机的同步问题,核心挑战在于绕过‘自身进程持有自身映像文件句柄’这一不可解除的内核限制。可靠解法必须依赖进程隔离——通过启动独立子进程,在原进程退出后执行删除操作,从而满足无感知、零残留、免管理员权限的工程要求。典型实现包括批处理中转、PowerShell脚本和Windows API互斥同步等路径,广 阅读详情

相关推荐

快速批量删除特定格式文件实用程序

Windows API(Application Programming Interface)是一系列广泛使用于Windows操作系统中的函数、宏、数据类型和全局变量的集合。这些API提供给软件开发者一种标准方法,通过它们可以访问底层的操作系统服务,包括文件系统、网络通信、图形显示等。在批量删除文件的场景中,Windows API中的文件系统接口允许开发者编写程序来直接与文件系统交互。自动化处理的定义是指利用计算机技术和相关工具,自动执行一系列预先设定的指令和程序,以完成特定的任务。

weixin_34885746的博客 1096

ring0层下实现的文件强制删除

文件强删 在日常生活使用电脑的过程中,遇到删不掉的文件的时候,我们总会通过一些软件提供的强制删除文件功能来删除顽固的文件。文件强删技术对于杀软来说是清楚病毒木马的武器,在扫描器检测出恶意文件的时候,就需要强删功能来清除恶意文件。而对于病毒木马来说,反过来可以用强删技术来强制删除系统保护文件或是受杀软保护的文件。 本文将会介绍文件强删技术,即使文件正在运行,也能强制删除本地文件。 实现过程 当文件是PE文件而且已经被加载到内存中的时候,正常情况下是无法通过资源管理器explorer.exe来删除本地文

zz_strive_2012的专栏 688

删除正在运行的程序(文件)

删除正在运行的程序(正在使用的文件)

Windows NT File System Internals----Chapter 5 The NT Virtual Memory Manage

//----------------------------------------------------------------------------------------------------------------------- //sahikaru(sahikaru88@gmail.com) //2012.6.13 //英文翻译笔记 //------------------

qinli5的专栏 1477

删除任意文件包括正在运行的

删除任意文件包括正在运行的删除任意文件包括正在运行的删除任意文件包括正在运行的

CST毫米波雷达ADAS仿真:从直角反射器到距离多普勒(RD图)的实战解析

本文通过CST Studio Suite实战解析毫米波汽车雷达ADAS仿真,详细演示了从构建直角反射器目标、参数化定义速度、进行参数扫描到生成距离多普勒图(RD图)的全过程。文章深入探讨了雷达关键参数(如距离分辨率、速度分辨率)的设计权衡与工程逻辑,并提供了单位统一、速度范围设定等实用避坑指南,帮助工程师高效完成雷达系统性能的前期验证与优化。

weixin_29292535的博客 502

彻底刷新文件系统的缓存

彻底刷新文件系统的缓存 [转载] void PurgeFileSystemBuffers(PFILE_OBJECT FileObject) { KeEnterCriticalRegion(); if(ExAcquireResourceExclusiveLite(((PFSRTL_COMMON_FCB_HEADER)FileObject->FsCont

yeook的专栏 3518

HIL(硬件在环)技术汇总梳理

HIL(Hardware-in-the-Loop)测试领域的知名公司有dSPACE、NI、Vector和speedgoat等,本文是针对这几家HIL技术的对比分析。

Mr.Cssust的博客 3686

学习强制删除正在运行的文件

看雪软件安全论坛 > 软件安全 > 『安全编程论坛』 > 【分享】学习强制删除正在运行的文件PDA查看完整版本 : 【分享】学习强制删除正在运行的文件yaolibing2009-04-28, 12:03首先说明一下的是,代码是从网上找来的,自己加了一些理解,供和我一样菜的人学习。:p:http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4强制删除文件,简单

迷茫的小莱 4131

STM32 烧录报错Invalid ROM Table

STM32 烧录报错Invalid ROM Table

热爱科技,物联,程序开发等 1732

Reeds-Shepp曲线公式推导及代码实现-第三部分(共三部分)

根据原始起点的坐标和航向,将上一小节计算出来的局部进行整体的平移和旋转(与归一化的步骤刚好相反),最终得到全局路径的轨迹。根据计算出来的路径,选择路径最短的轨迹(也可根据我们实际的需要定制选优规则),作为最终的轨迹输出。Reeds-Shepp曲线公式推导及代码实现-第一部分(共三部分)Reeds-Shepp曲线公式推导及代码实现-第二部分(共三部分)的值进行等步长插值,得到每段轨迹对应的生成一系列插值距离列表。根据上一步生成的插值距离列表的值,计算其对应的局部位姿值。后,我们需要根据字段类型(

jianmo的博客 1088

nt!CcFlushCache函数分析之nt!MmSetAddressRangeModified函数之后的nt!MmFlushSection

nt!CcFlushCache函数分析之nt!MmSetAddressRangeModified函数之后的nt!MmFlushSection

linux-0.11调试教程 313

【图形学】Loop细分算法及半边结构实现(C++)

文章目录Loop 细分算法介绍增加新顶点更新旧顶点算法实现半边结构半边结构的表示方法半边结构的构造方法创建所有顶点创建所有面及半边半边结构的使用 Loop 细分 顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。 下面是一个粗糙的兔子模型1000个面,进行3次细分 算法介绍 Loop细分算法主要分两步进行 增加新顶点:增加

wk_119的博客 8066

删除运行中程序

<br />标 题: 【分享】发一块代码段(删除正在运行的程序文件)<br />作 者: 老Y<br />时 间: 2007-05-25,16:59:36<br />链 接: http://bbs.pediy.com/showthread.php?t=45233<br /><br />先声明一下,本文的代码其实也是从别人的工具里A出来的(A=逆向+还原),所以也不敢称是原创,有同好的朋友自然知道是哪个工具里的:),另外,由于本人不太会写文章,看不明白的地方还请大家多多谅解。<br /><br />回到正题,

jmp esp 748

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1544

Uni-App 使用极光推送完整指南

Uni-App集成极光推送的完整指南:从注册极光账号到代码实现。包含前期准备(获取AppKey、注册厂商账号)、Uni-App配置(插件导入、初始化代码)、高级功能(角标设置、Java后台接口)及常见问题排查。详细说明了推送监听、registrationID获取、消息接收处理等核心功能实现步骤,并提供两种推送接口示例(按平台推送和统一推送)。适合需要在Uni-App项目中实现推送功能的开发者参考。

cyj0919的博客 425

c语言如何结束整个程序_程序如何不知不觉运行且不留痕迹?C语言专题之程序自删除技术...

前言自删除: 顾名思义,这个程序功能很简单,就是实现程序的自删除功能。是不是感到很困惑,一个程序自己运行着,怎样把自己关掉后,再把自己删除呢?结束自己进程的时候,自己也就结束了,不会再继续执行任何代码了。在程序执行的时候,文件处于打开状态,那也不能把自己给删了。是不是想不通啊,想不通就对了。想不通找找镜子就明白了哈哈实现原理程序自删除实现的思路便是:程序创建一个批处理文件,并创建进程执行,然后程序...

weixin_39840616的博客 1326

【AI智能体】Skills 智能体驱动开发从使用到项目实战详解

Skills 智能体驱动开发从使用到项目实战详解

congge 6601

VC如何使程序运行后自己删除自己

有时候,我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序。很明显如果一个进程通过直接调用DeleteFile()来删除自己是不可能的。必须另想办法,经过本人在网上参考很多资料后实际测试并集众家之所长,发现有二种方法效果比较好。现在将其封装成函数,这样使用将更加容易:   方法1,调用BAT文件。 //向指定文件写入文本。如果文件不存在就创建。 int WriteTextToF

jiangqin115的专栏 682

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux 运行文件

导读:和windows下的PE结构是一样的,安全逆向分析也需要这一块,这和云计算技术虚拟化也相关 本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。 1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段(已初始化)、从定位信息区、符号表及符号名字字符串构成,如下左图所示,经过链接后生成执行文件如下右图.

manongxianfeng的博客 9756

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Xcode_代码段

Xcode_代码段 说明: 本篇博文介绍在Xocde中如何设置代码段. 如果你有经常使用的代码或注释, 每次都需要完整的写一遍, 感觉很麻烦, 又浪费时间. 那么代码段就可以完美的解决这个问题, 它只需要一个快捷键, 就可以把整段代码显示出来了. 此文章由@Scott提供技术支持

Sponge_CMZ的博客 829

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C#正则实现匹配一块代码段

最近项目,生成聚合网关,但是生成的网关文件中,存在着不必要的代码段,比如一个类A,类B等 之前一直使用手动删除,这么做劳民伤财,浪费时间,考虑使用正则写一个工具实现自动删除。 正则写法: string pattern = @"public partial class A(\s|\S)+?(}\s*?){2}"; Regex regex = new Regex(sortP...

weixin_30889885的博客 309

visual studio 快捷代码段

visual studio 创建快捷代码段 ​ 在visual studio中,使用快捷代码段,能够提升代码编写速度.因此,对于一些经常需要重复编写的代码,可以使用快捷代码段的方式来提升开发效率. ​ 在visual studio中,可以通过代码段管理器来添加快捷代码段 以添加C++快捷代码段为例,可以根据库中已有的代码段来进行更改.如上图所示,Visual Studio中的快捷代码段为库自带的代码段,通常将自定义的代码段添加到My Code Snippets中. 添加代码段 首先复制一个库中已有的

qq_43331150的博客 2424

数据段 代码段 堆 栈 BSS

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。     数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配。    代码段:代码段(code segment/t

Music_粉饰 694

windows编程学习——关键代码段

 多线程学习篇(一)关键代码段 一、基本概念 关键代码段:关键代码段也称之为临界区,工作在用户模式下。它是一小段代码,在执行前需要独占对一些共享资源的访问权。   优点:关键代码段工作在用户模式下,因此它简单,执行速度快。   缺点:不能在多个进程之间对线程进行同步(原因:它不是内核对象) 二、API 1、关键段相关API CRITICAL_SECTION结构体:这是一个未公开内...

Cry_Alone的博客 3592
上一篇: 打磨Comodo,做有意义的事儿(2)
下一篇: MS08-025 win32k.sys NtUserFnOUTSTRING Privilege Escalation Exploit
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值