文件加密标识 -隐藏文件头的黑客代码

文件夹或文件的隐藏和加密20201024 前言: 最近果果迷上了u盘加密,因为之前看到有程序员删库跑路的事情,让这家公司损失了好多,而公司又花费了百万元来进行数据恢复.感觉还是很难受的.但是今天学习到的是文件夹或者文件和图片的隐藏,整个过程基本都是在win系统上的简单操作,但是我不会,所以果果要做笔记. 文件定性法: 注册表法: attrib法: 透明文件夹图标法: copy 图片法: 压缩包加密+图片copy法: 类标识法: 特殊文件法: 盘符隐藏法:(三种) 盘符管理法: 组策略法: 注册表法: ... 阅读详情
//This module hooks:
// IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_QUERY_INFORMATION,
// IRP_MJ_SET_INFORMATION, IRP_MJ_DIRECTORY_CONTROL,
// FASTIO_QUERY_STANDARD_INFO FASTIO_QUERY_BASIC_INFO FASTIO_READ(WRITE)
//to hide first N bytes of given file

extern "C" {
#include <ntddk.h>
}
#pragma hdrstop("InterceptIO.pch")

/////////////////////////////////////////////////////////////////////
// Undocumented structures missing in ntddk.h

typedef struct _FILE_INTERNAL_INFORMATION { // Information Class 6
    LARGE_INTEGER FileId;
} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;

typedef struct _FILE_EA_INFORMATION { // Information Class 7
    ULONG EaInformationLength;
} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;

typedef struct _FILE_ACCESS_INFORMATION { // Information Class 8
    ACCESS_MASK GrantedAccess;
} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;

typedef struct _FILE_MODE_INFORMATION { // Information Class 16
    ULONG Mode;
} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;

typedef struct _FILE_ALLOCATION_INFORMATION { // Information Class 19
    LARGE_INTEGER AllocationSize;
} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;

typedef struct _FILE_DIRECTORY_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;

typedef struct _FILE_ALL_INFORMATION { // Information Class 18
    FILE_BASIC_INFORMATION BasicInformation;
    FILE_STANDARD_INFORMATION StandardInformation;
    FILE_INTERNAL_INFORMATION InternalInformation;
    FILE_EA_INFORMATION EaInformation;
    FILE_ACCESS_INFORMATION AccessInformation;
    FILE_POSITION_INFORMATION PositionInformation;
    FILE_MODE_INFORMATION ModeInformation;
    FILE_ALIGNMENT_INFORMATION AlignmentInformation;
    FILE_NAME_INFORMATION NameInformation;
} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;

typedef struct tag_QUERY_DIRECTORY
{
    ULONG Length;
    PUNICODE_STRING FileName;
    FILE_INFORMATION_CLASS FileInformationClass;
    ULONG FileIndex;
} QUERY_DIRECTORY, *PQUERY_DIRECTORY;

#pragma pack(push, 4)

typedef struct tag_FQD_SmallCommonBlock
{
    ULONG NextEntryOffset;
    ULONG FileIndex;
} FQD_SmallCommonBlock, *PFQD_SmallCommonBlock;

typedef struct tag_FQD_FILE_ATTR
{
    TIME CreationTime;
    TIME LastAccessTime;
    TIME LastWriteTime;
    TIME ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    ULONG FileAttributes;
} FQD_FILE_ATTR, *PFQD_FILE_ATTR;

typedef struct tag_FQD_CommonBlock
{
    FQD_SmallCommonBlock SmallCommonBlock;
    FQD_FILE_ATTR FileAttr;
    ULONG FileNameLength;
} FQD_CommonBlock, *PFQD_CommonBlock;

typedef struct _KFILE_DIRECTORY_INFORMATION
{
    FQD_CommonBlock CommonBlock;
   
    WCHAR FileName[ANYSIZE_ARRAY];
} KFILE_DIRECTORY_INFORMATION, *PKFILE_DIRECTORY_INFORMATION;

typedef struct _KFILE_FULL_DIR_INFORMATION
{
    FQD_CommonBlock CommonBlock;
   
    ULONG EaSize;
    WCHAR FileName[ANYSIZE_ARRAY];
} KFILE_FULL_DIR_INFORMATION, *PKFILE_FULL_DIR_INFORMATION;

typedef struct _KFILE_BOTH_DIR_INFORMATION
{
    FQD_CommonBlock CommonBlock;
   
    ULONG EaSize;
    USHORT ShortFileNameLength;
    WCHAR ShortFileName[12];
    WCHAR FileName[ANYSIZE_ARRAY];
} KFILE_BOTH_DIR_INFORMATION, *PKFILE_BOTH_DIR_INFORMATION;

#pragma pack(pop)

/////////////////////////////////////////////////////////////////////
// Global variables
PDRIVER_OBJECT pDriverObject;
PDRIVER_DISPATCH OldReadDisp, OldWriteDisp, OldQueryDisp, OldSetInfoDisp, OldDirCtlDisp;
PFAST_IO_READ OldFastIoReadDisp;
PFAST_IO_WRITE OldFastIoWriteDisp;
PFAST_IO_QUERY_STANDARD_INFO OldFastIoQueryStandartInfoDisp;

//Size of our file's Invisible Part (in bytes)
ULONG InvisiblePartSize = 10;
//File, part of which we want to hide
wchar_t OurFileName[] = L"testing.fil";

//Size of OurFileName in bytes, excluding null terminator
ULONG OurFileNameLen = sizeof(OurFileName) - sizeof(wchar_t);


/////////////////////////////////////////////////////////////////////
// Functions

//Function returns true if FN matches OurFileName
bool ThisIsOurFile(PUNICODE_STRING FN)
{
    return ((FN->Buffer) &&
        (FN->Length >= OurFileNameLen) &&
        _wcsnicmp((wchar_t*)((char*)FN->Buffer + FN->Length - OurFileNameLen),
        OurFileName, OurFileNameLen/2)==0);
}

//Structure used to track IRPs which completion must be handled
struct s_ComplRtnTrack
{
    PIO_COMPLETION_ROUTINE CompletionRoutine;
    PVOID Context;
    //When CompletionRoutine is called, flags corresponds to InvokeOn*
    UCHAR Control;
    PIO_STACK_LOCATION CISL;
    FILE_INFORMATION_CLASS FileInformationClass;
    PVOID Buffer;
};

//Function set new CompletionRoutine, InvokeOnSuccess flag,
//and copies original fields to Context
void HookIrpCompletion(PIO_STACK_LOCATION CISL,
                      PIO_COMPLETION_ROUTINE CompletionRoutine,
                      PVOID Buffer,
                      FILE_INFORMATION_CLASS FileInformationClass)
{
    s_ComplRtnTrack* NewContext =
        (s_ComplRtnTrack*)ExAllocatePool(NonPagedPool, sizeof(s_ComplRtnTrack));
    NewContext->CompletionRoutine = CISL->CompletionRoutine;
    NewContext->Context = CISL->Context;
    NewContext->Control = CISL->Control;
    NewContext->CISL = CISL;
    //Since CISL.Parameters unavailabile in IrpCompletion handler,
    //let's save all necessary data in Context structure
    NewContext->FileInformationClass = FileInformationClass;
    NewContext->Buffer = Buffer;
    CISL->CompletionRoutine = CompletionRoutine;
    CISL->Context = NewContext;
    CISL->Control |= SL_INVOKE_ON_SUCCESS;
}

//Function handles IRP completion
NTSTATUS NewComplRtn (
                      IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP Irp,
                      s_ComplRtnTrack* CXT)
{
    //Handle different types of IRP
    switch (CXT->CISL->MajorFunction)
    {
    case IRP_MJ_QUERY_INFORMATION:
        _asm int 3;
        //ThisIsOurFile is already tested
        switch (CXT->FileInformationClass)
        {
            //In all cases modify CurrentByteOffset and/or size (EndOfFile)
            //to hide first InvisiblePartSize bytes
        case FilePositionInformation:
            ((PFILE_POSITION_INFORMATION)CXT->Buffer)->CurrentByteOffset.QuadPart -= InvisiblePartSize;
            break;
        case FileEndOfFileInformation:
            ((PFILE_END_OF_FILE_INFORMATION)CXT->Buffer)->EndOfFile.QuadPart -= InvisiblePartSize;
            break;
        case FileStandardInformation:
            ((PFILE_STANDARD_INFORMATION)CXT->Buffer)->EndOfFile.QuadPart -= InvisiblePartSize;
            break;
        case FileAllocationInformation:
            ((PFILE_ALLOCATION_INFORMATION)CXT->Buffer)->AllocationSize.QuadPart -= InvisiblePartSize;
            break;
        case FileAllInformation:
            ((PFILE_ALL_INFORMATION)CXT->Buffer)->PositionInformation.CurrentByteOffset.QuadPart -= InvisiblePartSize;
            ((PFILE_ALL_INFORMATION)CXT->Buffer)->StandardInformation.EndOfFile.QuadPart -= InvisiblePartSize;
            break;
        }
        case IRP_MJ_DIRECTORY_CONTROL:
            //Get a pointer to first directory entries
            PFQD_SmallCommonBlock pQueryDirWin32 = (PFQD_SmallCommonBlock)CXT->Buffer;
            //Cycle through directory entries
            while (1)
            {
                PWCHAR pFileName = 0;
                ULONG dwFileNameLength = 0;
                switch (CXT->FileInformationClass)
                {
                    //In all cases get pointer to FileName and FileNameLength
                case FileDirectoryInformation:
                    dwFileNameLength = ((PKFILE_DIRECTORY_INFORMATION)pQueryDirWin32)->CommonBlock.FileNameLength;
                    pFileName = ((PKFILE_DIRECTORY_INFORMATION)pQueryDirWin32)->FileName;
                    break;
                case FileFullDirectoryInformation:
                    dwFileNameLength = ((PKFILE_FULL_DIR_INFORMATION)pQueryDirWin32)->CommonBlock.FileNameLength;
                    pFileName = ((PKFILE_FULL_DIR_INFORMATION)pQueryDirWin32)->FileName;
                    break;
                case FileBothDirectoryInformation:
                    dwFileNameLength = ((PKFILE_BOTH_DIR_INFORMATION)pQueryDirWin32)->CommonBlock.FileNameLength;
                    pFileName = ((PKFILE_BOTH_DIR_INFORMATION)pQueryDirWin32)->FileName;
                    break;
                }
                //_asm int 3;
                //Is this file that we want?
                if ((dwFileNameLength == OurFileNameLen) &&
                    _wcsnicmp(pFileName, OurFileName, OurFileNameLen/2)==0)
                {
                    //_asm int 3;
                    //Hide first InvisiblePartSize bytes
                    ((PFQD_CommonBlock)pQueryDirWin32)->FileAttr.EndOfFile.QuadPart -= InvisiblePartSize;
                    break;
                }
                //Quit if no more directory entries
                if (!pQueryDirWin32->NextEntryOffset) break;
                //Continue with next directory entry
                pQueryDirWin32 = (PFQD_SmallCommonBlock)((CHAR*)pQueryDirWin32 + pQueryDirWin32->NextEntryOffset);
            }
           
    }
    //If appropriate Control flag was set,...
    if (
        ((CXT->Control == SL_INVOKE_ON_SUCCESS)&&(NT_SUCCESS(Irp->IoStatus.Status)))
        || ((CXT->Control == SL_INVOKE_ON_ERROR)&&(NT_ERROR(Irp->IoStatus.Status)))
        || ((CXT->Control == SL_INVOKE_ON_CANCEL)&&(Irp->IoStatus.Status == STATUS_CANCELLED)) )
        //...call original CompletionRoutine
        return CXT->CompletionRoutine(
        DeviceObject,
        Irp,
        CXT->Context);
    else return STATUS_SUCCESS;
}

//Filename IRP handler deal with
#define FName &(CISL->FileObject->FileName)

//Function handles IRP_MJ_READ and IRP_MJ_WRITE
NTSTATUS NewReadWriteDisp (
                          IN PDEVICE_OBJECT DeviceObject,
                          IN PIRP Irp)
{
    //_asm int 3;
    PIO_STACK_LOCATION CISL = IoGetCurrentIrpStackLocation(Irp);
    if (CISL->FileObject &&
        //Don't mess with swaping
        !(Irp->Flags & IRP_PAGING_IO) && !(Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO))
    {
        if (ThisIsOurFile(FName))
        {
            //_asm int 3;
            CISL->Parameters.Write.ByteOffset.QuadPart += InvisiblePartSize;
            //Write and Read has the same structure, thus handled together
        }
    }
    //Call corresponding original handler
    switch (CISL->MajorFunction)
    {
    case IRP_MJ_READ:
        return OldReadDisp(DeviceObject, Irp);
    case IRP_MJ_WRITE:
        return OldWriteDisp(DeviceObject, Irp);
    }
}

//Function handles IRP_MJ_QUERY_INFORMATION
NTSTATUS NewQueryDisp (
                      IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP Irp)
{
    //_asm int 3;
    PIO_STACK_LOCATION CISL = IoGetCurrentIrpStackLocation(Irp);
    if ((CISL->MajorFunction == IRP_MJ_QUERY_INFORMATION) &&
        ThisIsOurFile(FName))
    {
        //_asm int 3;
        switch (CISL->Parameters.QueryFile.FileInformationClass)
        {
            //Information types that contains file size or current offset
        case FilePositionInformation:
        case FileEndOfFileInformation:
        case FileStandardInformation:
        case FileAllocationInformation:
        case FileAllInformation:
            //_asm int 3;
            HookIrpCompletion(CISL, (PIO_COMPLETION_ROUTINE)NewComplRtn, Irp->AssociatedIrp.SystemBuffer, CISL->Parameters.QueryFile.FileInformationClass);
        }
    }
    //Call original handler
    return OldQueryDisp(DeviceObject, Irp);
}

//Function handles IRP_MJ_SET_INFORMATION
NTSTATUS NewSetInfoDisp (
                        IN PDEVICE_OBJECT DeviceObject,
                        IN PIRP Irp)
{
    //_asm int 3;
    PIO_STACK_LOCATION CISL = IoGetCurrentIrpStackLocation(Irp);
    if (CISL->FileObject && ThisIsOurFile(FName))
    {
        //_asm int 3;
        switch (CISL->Parameters.QueryFile.FileInformationClass)
        {
            //Information types that contains file size or current offset.
            //In all cases modify CurrentByteOffset and/or size (EndOfFile)
            //to hide first InvisiblePartSize bytes
        case FilePositionInformation:
            ((PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->CurrentByteOffset.QuadPart += InvisiblePartSize;
            break;
        case FileEndOfFileInformation:
            ((PFILE_END_OF_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->EndOfFile.QuadPart += InvisiblePartSize;
            break;
        case FileStandardInformation:
            ((PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->EndOfFile.QuadPart += InvisiblePartSize;
            break;
        case FileAllocationInformation:
            //_asm int 3;
            ((PFILE_ALLOCATION_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->AllocationSize.QuadPart += InvisiblePartSize;
            break;
        case FileAllInformation:
            ((PFILE_ALL_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->PositionInformation.CurrentByteOffset.QuadPart += InvisiblePartSize;
            ((PFILE_ALL_INFORMATION)Irp->AssociatedIrp.SystemBuffer)->StandardInformation.EndOfFile.QuadPart += InvisiblePartSize;
            break;
        }
    }
    //Call original handler
    return OldSetInfoDisp(DeviceObject, Irp);
}

//Function handles IRP_MJ_DIRECTORY_CONTROL
NTSTATUS NewDirCtlDisp (
                        IN PDEVICE_OBJECT DeviceObject,
                        IN PIRP Irp)
{
    void *pBuffer;
    PIO_STACK_LOCATION CISL = IoGetCurrentIrpStackLocation(Irp);
    //_asm int 3;
    if ((CISL->MajorFunction == IRP_MJ_DIRECTORY_CONTROL) &&
        (CISL->MinorFunction == IRP_MN_QUERY_DIRECTORY))
    {
        //Handle both ways of passing user supplied buffer
        if (Irp->MdlAddress)
            pBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
        else
            pBuffer = Irp->UserBuffer;
        HookIrpCompletion(CISL, (PIO_COMPLETION_ROUTINE)NewComplRtn, pBuffer, ((PQUERY_DIRECTORY)(&CISL->Parameters))->FileInformationClass);
    }
    //Call original handler
    return OldDirCtlDisp(DeviceObject, Irp);
}

#undef FName

//Function handles FastIoRead
BOOLEAN NewFastIoRead(
                      IN PFILE_OBJECT FileObject,
                      IN PLARGE_INTEGER FileOffset,
                      IN ULONG Length,
                      IN BOOLEAN Wait,
                      IN ULONG LockKey,
                      OUT PVOID Buffer,
                      OUT PIO_STATUS_BLOCK IoStatus,
                      IN PDEVICE_OBJECT DeviceObject
                      )
{
    LARGE_INTEGER NewFileOffset;
    //_asm int 3;
    if ((FileObject) && (ThisIsOurFile(&FileObject->FileName)))
    {
        //_asm int 3;
        //Modify FileOffset to hide first InvisiblePartSize bytes
        NewFileOffset.QuadPart = FileOffset->QuadPart + InvisiblePartSize;
        return OldFastIoReadDisp(FileObject, &NewFileOffset, Length, Wait, LockKey, Buffer,
            IoStatus, DeviceObject);
    }
    //Call original handler
    return OldFastIoReadDisp(FileObject, FileOffset, Length, Wait, LockKey, Buffer,
        IoStatus, DeviceObject);
}

//Function handles FastIoWrite
BOOLEAN NewFastIoWrite(
                      IN PFILE_OBJECT FileObject,
                      IN PLARGE_INTEGER FileOffset,
                      IN ULONG Length,
                      IN BOOLEAN Wait,
                      IN ULONG LockKey,
                      OUT PVOID Buffer,
                      OUT PIO_STATUS_BLOCK IoStatus,
                      IN PDEVICE_OBJECT DeviceObject
                      )
{
    LARGE_INTEGER NewFileOffset;
    //_asm int 3;
    if ((FileObject) && (ThisIsOurFile(&FileObject->FileName)))
    {
        //_asm int 3;
        //Modify FileOffset to hide first InvisiblePartSize bytes
        NewFileOffset.QuadPart = FileOffset->QuadPart + InvisiblePartSize;
        return OldFastIoWriteDisp(FileObject, &NewFileOffset, Length, Wait, LockKey, Buffer,
            IoStatus, DeviceObject);
    }
    return OldFastIoWriteDisp(FileObject, FileOffset, Length, Wait, LockKey, Buffer,
        IoStatus, DeviceObject);
}

//Function handles FastIoQueryStandartInfo
BOOLEAN NewFastIoQueryStandartInfo(
                                  IN struct _FILE_OBJECT *FileObject,
                                  IN BOOLEAN Wait,
                                  OUT PFILE_STANDARD_INFORMATION Buffer,
                                  OUT PIO_STATUS_BLOCK IoStatus,
                                  IN struct _DEVICE_OBJECT *DeviceObject
                                  )
{
    //Call original handler
    BOOLEAN status = OldFastIoQueryStandartInfoDisp(FileObject, Wait, Buffer, IoStatus, DeviceObject);
    if ((FileObject) && (ThisIsOurFile(&FileObject->FileName)))
    {
        //_asm int 3;
        //Modify EndOfFile to hide first InvisiblePartSize bytes
        Buffer->EndOfFile.QuadPart -= InvisiblePartSize;
    }
    return status;
}

extern "C"
NTSYSAPI
NTSTATUS
NTAPI
ObReferenceObjectByName(
                        IN PUNICODE_STRING ObjectPath,
                        IN ULONG Attributes,
                        IN PACCESS_STATE PassedAccessState OPTIONAL,
                        IN ACCESS_MASK DesiredAccess OPTIONAL,
                        IN POBJECT_TYPE ObjectType,
                        IN KPROCESSOR_MODE AccessMode,
                        IN OUT PVOID ParseContext OPTIONAL,
                        OUT PVOID *ObjectPtr
                        );

extern "C" PVOID IoDriverObjectType;

//Function hooks given dispatch function (MajorFunction)
VOID InterceptFunction(UCHAR MajorFunction,
                      PDRIVER_OBJECT pDriverObject,
                      OPTIONAL PDRIVER_DISPATCH *OldFunctionPtr,
                      OPTIONAL PDRIVER_DISPATCH NewFunctionPtr)
{
    PDRIVER_DISPATCH *TargetFn;
   
    TargetFn = &(pDriverObject->MajorFunction[MajorFunction]);
    //hook only if handler exists
    if (*TargetFn)
    {
        if (OldFunctionPtr) *OldFunctionPtr = *TargetFn;
        if (NewFunctionPtr) *TargetFn = NewFunctionPtr;
    }
}

//Function hooks given driver's dispatch functions
NTSTATUS Intercept(PWSTR pwszDeviceName)
{
    UNICODE_STRING DeviceName;
    NTSTATUS status;
    KIRQL OldIrql;
   
    _asm int 3;
   
    pDriverObject = NULL;
    RtlInitUnicodeString(&DeviceName, pwszDeviceName);
    status = ObReferenceObjectByName(&DeviceName, OBJ_CASE_INSENSITIVE, NULL, 0, (POBJECT_TYPE)IoDriverObjectType, KernelMode, NULL, (PVOID*)&pDriverObject);
    if (pDriverObject)
    {
        //Raise IRQL to avoid context switch
        //when some pointer is semi-modified
        KeRaiseIrql(HIGH_LEVEL, &OldIrql);
        //hook dispatch functions
        InterceptFunction(IRP_MJ_READ, pDriverObject, &OldReadDisp, NewReadWriteDisp);
        InterceptFunction(IRP_MJ_WRITE, pDriverObject, &OldWriteDisp, NewReadWriteDisp);
        InterceptFunction(IRP_MJ_QUERY_INFORMATION, pDriverObject, &OldQueryDisp, NewQueryDisp);
        InterceptFunction(IRP_MJ_SET_INFORMATION, pDriverObject, &OldSetInfoDisp, NewSetInfoDisp);
        InterceptFunction(IRP_MJ_DIRECTORY_CONTROL, pDriverObject, &OldDirCtlDisp, NewDirCtlDisp);
        //hook FastIo dispatch functions if FastIo table exists
        if (pDriverObject->FastIoDispatch)
        {
            //It would be better to copy FastIo table to avoid
            //messing with kernel memory protection, but it works as it is
            OldFastIoReadDisp = pDriverObject->FastIoDispatch->FastIoRead;
            pDriverObject->FastIoDispatch->FastIoRead = NewFastIoRead;
            OldFastIoWriteDisp = pDriverObject->FastIoDispatch->FastIoWrite;
            pDriverObject->FastIoDispatch->FastIoWrite = NewFastIoWrite;
            OldFastIoQueryStandartInfoDisp = pDriverObject->FastIoDispatch->FastIoQueryStandardInfo;
            pDriverObject->FastIoDispatch->FastIoQueryStandardInfo = NewFastIoQueryStandartInfo;
        }
        KeLowerIrql(OldIrql);
    }
   
    return status;
}

//Function cancels hooking
VOID UnIntercept()
{
    KIRQL OldIrql;
    if (pDriverObject)
    {
        KeRaiseIrql(HIGH_LEVEL, &OldIrql);
        InterceptFunction(IRP_MJ_READ, pDriverObject, NULL, OldReadDisp);
        InterceptFunction(IRP_MJ_WRITE, pDriverObject, NULL, OldWriteDisp);
        InterceptFunction(IRP_MJ_QUERY_INFORMATION, pDriverObject, NULL, OldQueryDisp);
        InterceptFunction(IRP_MJ_SET_INFORMATION, pDriverObject, NULL, OldSetInfoDisp);
        InterceptFunction(IRP_MJ_DIRECTORY_CONTROL, pDriverObject, NULL, OldDirCtlDisp);
        if (pDriverObject->FastIoDispatch)
        {
            pDriverObject->FastIoDispatch->FastIoRead = OldFastIoReadDisp;
            pDriverObject->FastIoDispatch->FastIoWrite = OldFastIoWriteDisp;
            pDriverObject->FastIoDispatch->FastIoQueryStandardInfo = OldFastIoQueryStandartInfoDisp;
        }
        KeLowerIrql(OldIrql);
        ObDereferenceObject(pDriverObject);
    }
}
华为光猫配置文件解密:从加密原理到网络调优实战 在网络设备管理中,配置文件是定义设备行为和策略的核心数据。为了安全和稳定性,厂商常对配置文件进行加密,使其成为用户无法直接解读的“黑盒”。其加密原理多采用对称加密算法,如AES或DES的变体,密钥通常与设备硬件信息绑定。理解并掌握解密技术,对于网络管理员和高级用户而言,具有重要的技术价值。它不仅是进行深度故障排查和性能优化的基础,也是实现网络配置自动化、批量部署的关键前提。在家庭网络、中小企业网关等应用场景中,对加密配置文件的解密与分析,能有效帮助用户解锁高级管理权限、优化网络参数(如MTU、VLAN),并 阅读详情

相关推荐

[BUUCTF misc]伪加密与隐写术:九连环的破解之道

本文以BUUCTF杂项题目‘九连环’为例,详细解析了CTF竞赛中Misc类题目的两大核心技巧:识别并利用WinHex破解ZIP文件的伪加密,以及使用隐写术工具steghide探测和提取图片中隐藏的信息。通过实战步骤拆解,帮助读者掌握从文件结构分析到信息提取的完整解题链条,提升CTF解题能力。

weixin_29280657的博客 171

(转)深入理解文件操作函数native api之ZwQueryInformationFile 获取File ID

http://hi.baidu.com/liushijianlu/blog/item/b104c810a08f8b28dc5401fb.html>深入理解文件操作函数native api之ZwQueryInformationFile看这个函数的名字和参数就能够知道他是干嘛用的了,但是他的作用远不止这些,这需要一些技巧和深入的理解才能有了新的思路。现在仅仅是明白了函数

gylll的专栏 3821

ScienceDecrypting:学术文档加密格式解密原理与实战指南

文档加密与解密是数字版权管理(DRM)和文件格式转换中的常见技术场景,其核心原理通常涉及对文件内容进行算法混淆或封装,以实现对特定平台或软件的绑定。从技术实现上看,常见的加密方式包括基于固定密钥的异或(XOR)运算、分段加密以及基于种子动态生成密钥流等,这些方法旨在平衡内容保护与访问控制。这类解密技术的工程价值在于实现格式互操作性与数据可移植性,使得用户能够在合法拥有的前提下,将受限于专用阅读器的文档转换为PDF、EPUB等通用格式,从而便于跨平台阅读、文本分析及长期归档。在实际应用中,面对诸如.baxia

weixin_42706667的博客 312

面向Windows的文件透明加解密解决方案(3)——透明加解密驱动程序二

3.3关键技术详解 对于用户的文件操作请求,Windows 用户层中对文件的各种操作映射到微过滤驱动中就转化为类型为Create,Read,Write 和Close 等的I/O 操作,因此只要对这些操作的内容进行过滤处理,即可达到透明加解密的目的。首先在IRP_MJ_CREATE 中查询目标文件是否是监控文件类型,创建一个StreamContext 并附着在文件对象上,并在StreamConte

某熊的技术之路 1万+

QQ音乐加密格式解密原理与实战:从EKey获取到FLAC转换全指南

数字版权管理(DRM)是内容平台保护音频、视频等数字版权的常见技术,其核心原理是通过加密和格式封装限制文件在特定环境下的使用。在技术实现上,常采用异或加密、密钥动态分发等机制,在客户端与服务器之间构建授权验证。这项技术的价值在于平衡版权保护与授权用户体验,但其封闭性也催生了用户对跨平台播放自由的需求。在音频处理领域,针对特定加密格式的解密与转换,成为一项结合逆向工程与格式解析的实用技术。通过分析文件结构、提取动态密钥(如EKey),并利用异或运算等基础密码学原理还原音频数据,可以实现加密格式向通用格式(如F

weixin_30536513的博客 532

华为光猫配置解密实战:从加密原理到桥接、补全Shell全攻略

网络设备的配置文件管理是网络运维和高级定制的基础。其核心原理在于,设备厂商或运营商通常会对存储关键参数的配置文件进行加密或压缩,以防止误操作并实现批量部署。这项技术的价值在于,通过解密和编辑配置文件,用户能够突破图形界面的限制,深入理解并掌控设备的真实工作状态。在家庭网络和中小企业场景中,这直接应用于性能优化、功能解锁和故障精准排查。例如,对华为光猫加密的hw_ctree.xml文件进行解密,是进行网络模式切换(如改为桥接模式以提升性能)和实现高级功能(如补全Shell以获得完整命令行权限)的关键前置步骤。

weixin_27875131的博客 717

读懂常见IRP:IRP_MJ_CLEANUP/IRP_MJ_CLOSE/IRP_MJ_CREATE

IRP_MJ_CLEANUP保持进程定义上下文信息的驱动器,必须在DispatchCleanup中包含cleanup请求。何时发送: 收到IRP_MJ_CLEANUP意味着请求的目标设备与目标文件的句柄相关(也可能因为io请求后没有释放)入参: 无出参: 无操作: 该IRP在关闭 file object 句柄的进程上下文中发送。因此,驱动器应该释放进程上下文中所指

5763

minifilter 文件透明加密源码

基于minifilter框架下的透明加解密源码。 1 手工加载时自动增加system,explorer.exe,notepad.exe为监控进程 2 添加了异或加密算法 3 取消了不对c分区监控的限制,因为很多虚拟机里只有C分区 安装和加载说明 1 把engine.inf,engine.sys拷贝到虚拟机里 2 右击engine.inf,点安装 3 手工加载进cmd, 输入 sc start engine 4 手工停止进cmd,输入 sc stop engine 5 测试时请关闭杀毒软件,代码与诺顿杀毒软件的冲突是由于刷缓存引起的,是能解决的,不过初学者不必关心这个

驱动开发学习笔记

1、三种类型的WDM驱动程序   总线驱动程序(bus driver)   功能驱动程序(function driver)   过滤驱动程序(filter driver)2、其他分类方法   类驱动程序(class driver)   端口驱动程序(port driver)   小端口驱动程序(miniort driver)3、驱动对象(DRIVER_OBJECT)主要成员   Devic

迈克揉索芙特 3927

Halcon 简单的形状匹配定位与区域跟随

【代码】Halcon简单的形状匹配定位与区域跟随。

唐大狗 2806

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

文件过滤驱动中 IRP_MJ_XX_INFORMATION 查询文件对象是文件还是目录的方法

首先,WDK 中关于 IRP_MJ_XX_INFORMATION 请求有这样一段话 “The file system driver should extract and decode the file object to determine whether it represents a user file or directory open” 可是文件对象中没有找到那个地方标记了对象是文件还

keidoekd2345的专栏 769

瑞萨RA6M4平台I2C驱动移植实战:MPU6050传感器集成指南

本文详细介绍了在瑞萨RA6M4平台上进行I2C驱动移植并集成MPU6050传感器的实战指南。通过FSP配置工具添加I2C主栈,适配MPU6050官方驱动,实现传感器数据读取与调试,为嵌入式开发提供完整的解决方案。

banana的博客 109

Python代码保护实战:PYARMOR混淆加密与AI辅助部署指南

在软件开发和商业交付中,代码保护是保障知识产权和商业机密的核心需求。对于Python这类解释型语言,源代码的易读性使其在分发时面临泄露风险。代码混淆和加密技术通过重命名标识符、打乱控制流、加密字节码等原理,能有效提升逆向工程成本,是保护Python项目的重要手段。其技术价值在于平衡了代码可维护性与安全性,使开发者无需改变编程习惯即可实现逻辑隐藏。该技术广泛应用于商业软件SDK交付、算法模型保护、内部工具分发等场景。本文聚焦于PYARMOR这一工具,它通过热门的AI辅助工具进行策略优化和漏洞分析,并结合字节码

weixin_34348174的博客 377

MuJoCo 机械臂关节空间阻抗控制Impedance实现(附代码)

阻抗控制通过调整关节的刚度和阻尼,让机器人在接触时产生顺应性,减少冲击力,其核心目标是在接触外部载荷时能够自适应调整输出力矩,实现力与位置的协同控制。阻抗控制可以很快的到达设定位置,在此基础上,使用mujoco交互中的施加外力操作,可以看到当外力松开后,机械臂也可以很快的回弹回设定位置。其中self.Kp和self.Kd为固定刚度和阻尼系数,通过修改刚度和阻尼参数,可以变得更柔顺来应对各种场景。注释掉该行后,直接simulate仿真可以看到机械臂控制位置震荡等情况,接下来引入关节空间阻抗控制的代码。

darcsdn 1274

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2771

逆向解析某音乐平台缓存加密机制:从密钥推导到解密实践(以酷狗音乐为例)

本文以酷狗音乐为例,深入解析了音乐平台缓存文件的加密机制。通过对比分析加密与原始文件,揭示了其采用动态异或加密的核心原理,并详细阐述了从固定掩码推导到完整密钥还原的全过程。文章最后提供了实用的Python解密代码示例,并强调了技术研究的合法边界。

weixin_28607671的博客 243

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

BUUCTF-Misc-(61,80)

双击进去查看引用,即可查看到主函数,分析可以得知,输入的String长度只能是6,且最后三个字母是xyz。既然让低头,那就是看键盘,联系键盘隐写,按照密文的顺序标记键盘位置,最后就能发现在键盘上写了个CTF,flag就是CTF。解压压缩包,得到赵丽颖的一张图片,再用加密的LSB隐写解密,密码是123456,得到一个新的文件。识别一下,十六进制解码即可看到flag,flag说可以用PS做,试了一下,不会哈哈,慢慢学习吧。得到iwantplayctf,但尝试后发现不是正确的flag,那就继续搞视频。

Cra_Thursday9527的博客 761

5、卡尔ibration中Denavit - Hartenberg与Hayati约定的转换

本文详细介绍了机器人运动学中Denavit-Hartenberg(DH)参数与Hayati参数的定义、适用场景及其相互转换方法。重点分析了两种参数在描述关节坐标系变换时的差异,特别是在处理平行或接近平行关节轴时的稳定性问题,并给出了从DH到Hayati及反向转换的具体数学公式与流程图。通过参数转换,可在不改变运动学模型的前提下提升建模精度与计算鲁棒性,适用于机器人标定与运动学分析等应用场景。

h0i1j2k3l的博客 121

手把手教你学Simulink--基于Simulink的移相全桥DC-DC变换器仿真建模

特点高效性:通过实现零电压开关(ZVS)减少开关损耗。电气隔离:使用变压器提供输入输出间的电气隔离。适用于中高功率应用:如服务器电源、工业电源等。挑战控制复杂度:精确控制相位差以实现软开关。元件选择:合适的电感、电容值对于性能至关重要。动态响应:快速响应负载变化,保持稳定的输出电压。首先明确要模拟的任务内容。设计一个能够支持特定输入输出电压比的PSFB变换器。根据工作频率和谐振元件值确定合适的电路参数。实现有效的控制策略来维持输出电压稳定,并实现软开关。

MHD0815的博客 520

CTF实战:从图片中提取隐藏数据的完整指南

本文提供了一份CTF比赛中图片隐写术的完整实战指南。通过WinHex十六进制分析、Foremost文件分离和ARCHPR暴力破解三步核心流程,详细讲解了如何从普通图片中提取隐藏的压缩包和文本数据。文章还涵盖了LSB隐写、EXIF信息检查等进阶技巧,并给出了标准化的解题检查清单,帮助安全爱好者系统化掌握图片隐写分析与数据提取技能。

weixin_29198045的博客 251

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

图片隐写术实战指南:从基础工具到高级技巧

本文是一份全面的图片隐写术实战指南,从基础概念讲起,系统介绍了文件头分析、Exif信息查看、Stegsolve工具使用等入门技巧。重点剖析了LSB隐写原理,并提供了Python脚本等实战方法。最后,深入探讨了CRC修复、特殊加密破解及二维码隐藏等高级挑战,旨在帮助读者掌握从发现到提取隐藏信息的完整技能。

cheese的博客 515

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

恶意代码分析实战_01静态分析基础知识

通过反病毒引擎扫描可疑软件、通过哈希值查询可疑软件、通过字符串查询分析可疑软件、加壳可疑软件分析、PE格式可疑软件分析、可疑软件链接库与函数分析。

kitsch0x97的博客 2817

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 在文件过滤驱动中追踪文件状态
下一篇: Sfilter之Windows2000动态加载经验分享
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值