对Windows内核空间操作的一些说明

Windows内核--内核空间和用户空间(3.6) 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间,这样会增大内核风险。相反,内核抽象出Handle给用户态,不管是文件、进程、线程等对象,通过Handle可以隐藏内核细节,统一控制对象。不可避免,内核态对于Handle必须转换成指针才能处理。 阅读详情
作者:ZwelL
http://www.donews.net/zwell

    首先对被我误导的人说声对不起了。我在论坛中发的那篇贴(用户态隐藏进程的通用版本)真是乱七八糟(-_-我也是受害者)。在XP和WINDOWS 2003中用那种方法都是行不通的,而且在20043中的偏移也是错的。这里我先把XPSP2和2003中的EPROCESS整理出来给大家看一下:

typedef struct _EPROCESS_2K3
{
   /*+0x000*/ KPROCESS_2K3         Pcb;
   /*+0x06c*/ EX_PUSH_LOCK         ProcessLock;
   /*+0x070*/ LARGE_INTEGER      CreateTime;
   /*+0x078*/ LARGE_INTEGER      ExitTime;
   /*+0x080*/ EX_RUNDOWN_REF      RundownProtect;
   /*+0x084*/ PVOID            UniqueProcessId;
   /*+0x088*/ LIST_ENTRY         ActiveProcessLinks;
   /*+0x090*/ ULONG            QuotaUsage[3];
   /*+0x09c*/ ULONG            QuotaPeak[3];
   /*+0x0a8*/ ULONG            CommitCharge;
   /*+0x0ac*/ ULONG            PeakVirtualSize;
   /*+0x0b0*/ ULONG            VirtualSize;
   /*+0x0b4*/ LIST_ENTRY         SessionProcessLinks;
   /*+0x0bc*/ PVOID            DebugPort;
   /*+0x0c0*/ PVOID            ExceptionPort;
   /*+0x0c4*/ PHANDLE_TABLE      ObjectTable;
   /*+0x0c8*/ EX_FAST_REF         Token;
   /*+0x0cc*/ ULONG            WorkingSetPage;
   /*+0x0d0*/ KGUARDED_MUTEX      AddressCreationLock;
   /*+0x0f0*/ KSPIN_LOCK         HyperSpaceLock;
   /*+0x0f4*/ PETHREAD_2K3         ForkInProgress;
   /*+0x0f8*/ ULONG            HardwareTrigger;
   /*+0x0fc*/ PMM_AVL_TABLE      PhysicalVadRoot;
   /*+0x100*/ PVOID            CloneRoot;
   /*+0x104*/ ULONG            NumberOfPrivatePages;
   /*+0x108*/ ULONG            NumberOfLockedPages;
   /*+0x10c*/ PVOID            Win32Process;
   /*+0x110*/ PEJOB            Job;
   /*+0x114*/ PSECTION_OBJECT      SectionObject;
   /*+0x118*/ PVOID            SectionBaseAddress;
   /*+0x11c*/ PEPROCESS_QUOTA_BLOCK   QuotaBlock;
   /*+0x120*/ PPAGEFAULT_HISTORY   WorkingSetWatch;
   /*+0x124*/ PVOID            Win32WindowStation;
   /*+0x128*/ PVOID            InheritedFromUniqueProcessId;
   /*+0x12c*/ PVOID            LdtInformation;
   /*+0x130*/ PVOID            VadFreeHint;
   /*+0x134*/ PVOID            VdmObjects;
   /*+0x138*/ PVOID            DeviceMap;
   /*+0x13c*/ PVOID            Spare0[3];
   union {
   /*+0x148*/HARDWARE_PTE                PageDirectoryPte;
   /*+0x148*/ULONGLONG                   Filler;
   };
   /*+0x150*/ PVOID            Session;
   /*+0x154*/ UCHAR            ImageFileName[16];
   /*+0x164*/ LIST_ENTRY         JobLinks;
   /*+0x16c*/ PVOID            LockedPagesList;
   /*+0x170*/ LIST_ENTRY         ThreadListHead;
   /*+0x178*/ PVOID            SecurityPort;
   /*+0x17c*/ PVOID            PaeTop;
   /*+0x180*/ ULONG            ActiveThreads;
   /*+0x184*/ ULONG            GrantedAccess;
   /*+0x188*/ ULONG            DefaultHardErrorProcessing;
   /*+0x18c*/ NTSTATUS            LastThreadExitStatus;
   /*+0x190*/ PPEB               Peb;
   /*+0x194*/ EX_FAST_REF         PrefetchTrace;
   /*+0x198*/ LARGE_INTEGER      ReadOperationCount;
   /*+0x1a0*/ LARGE_INTEGER      WriteOperationCount;
   /*+0x1a8*/ LARGE_INTEGER      OtherOperationCount;
   /*+0x1b0*/ LARGE_INTEGER      ReadTransferCount;
   /*+0x1b8*/ LARGE_INTEGER      WriteTransferCount;
   /*+0x1c0*/ LARGE_INTEGER      OtherTransferCount;
   /*+0x1c8*/ ULONG            CommitChargeLimit;
   /*+0x1cc*/ ULONG            CommitChargePeak;
   /*+0x1d0*/ PVOID            AweInfo;
   /*+0x1d4*/ SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;
   /*+0x1d8*/ MMSUPPORT_2K3      Vm;
   /*+0x238*/ LIST_ENTRY         MmProcessLinks;
   /*+0x240*/ ULONG            ModifiedPageCount;
   /*+0x244*/ ULONG            JobStatus;  
   union{
   /*+0x248*/ ULONG            Flags;
      struct{
   /*+0x248*/ ULONG            CreateReported      : 1;
   /*+0x248*/ ULONG            NoDebugInherit      : 1;
   /*+0x248*/ ULONG            ProcessExiting      : 1;
   /*+0x248*/ ULONG            ProcessDelete      : 1;
   /*+0x248*/ ULONG            Wow64SplitPages      : 1;
   /*+0x248*/ ULONG            VmDeleted         : 1;
   /*+0x248*/ ULONG            OutswapEnabled      : 1;
   /*+0x248*/ ULONG            Outswapped         : 1;
   /*+0x248*/ ULONG            ForkFailed         : 1;
   /*+0x248*/ ULONG            Wow64VaSpace4Gb      : 1;
   /*+0x248*/ ULONG            AddressSpaceInitialized :2;
   /*+0x248*/ ULONG            SetTimerResolution   : 1;
   /*+0x248*/ ULONG            BreakOnTermination   : 1;
   /*+0x248*/ ULONG            SessionCreationUnderway :1;
   /*+0x248*/ ULONG            WriteWatch         : 1;
   /*+0x248*/ ULONG            ProcessInSession   : 1;
   /*+0x248*/ ULONG            OverrideAddressSpace   : 1;
   /*+0x248*/ ULONG            HasAddressSpace      : 1;
   /*+0x248*/ ULONG            LaunchPrefetched   : 1;
   /*+0x248*/ ULONG            InjectInpageErrors   : 1;
   /*+0x248*/ ULONG            VmTopDown         : 1;
   /*+0x248*/ ULONG            ImageNotifyDone      : 1;
   /*+0x248*/ ULONG            PdeUpdateNeeded      : 1;
   /*+0x248*/ ULONG            VdmAllowed         : 1;
   /*+0x248*/ ULONG            Unused            : 7;
      };
   };
   /*+0x24c*/ NTSTATUS            ExitStatus;
   /*+0x250*/ USHORT            NextPageColor;
   union   {
      struct   {
   /*+0x252*/      UCHAR                   SubSystemMinorVersion;
   /*+0x253*/      UCHAR                   SubSystemMajorVersion;
      };
   /*+0x252*/   USHORT                      SubSystemVersion;
   };

   /*+0x254*/ UCHAR            PriorityClass;
   /*+0x258*/ MM_AVL_TABLE         VadRoot;
} EPROCESS_2K3, *PEPROCESS_2K3;

typedef struct _EPROCESS_XP_SP2
{
   /*+0x000*/_KPROCESS_XP     Pcb;
   /*+0x06c*/_EX_PUSH_LOCK     ProcessLock;
   /*+0x070*/_LARGE_INTEGER     CreateTime;
   /*+0x078*/_LARGE_INTEGER     ExitTime;
   /*+0x080*/_EX_RUNDOWN_REF    RundownProtect;
   /*+0x084*/PVOID        UniqueProcessId;
   /*+0x088*/_LIST_ENTRY    ActiveProcessLinks;
   /*+0x090*/ULONG         QuotaUsage[3];
   /*+0x09c*/ULONG         QuotaPeak[3];
   /*+0x0a8*/ULONG         CommitCharge;
   /*+0x0ac*/ULONG         PeakVirtualSize;
   /*+0x0b0*/ULONG         VirtualSize;
   /*+0x0b4*/_LIST_ENTRY    SessionProcessLinks;
   /*+0x0bc*/PVOID        DebugPort;
   /*+0x0c0*/PVOID         ExceptionPort;
   /*+0x0c4*/PHANDLE_TABLE    ObjectTable;
   /*+0x0c8*/_EX_FAST_REF    Token;
   /*+0x0cc*/_FAST_MUTEX    WorkingSetLock;
   /*+0x0ec*/ULONG        WorkingSetPage;
   /*+0x0f0*/_FAST_MUTEX    AddressCreationLock;
   /*+0x110*/ULONG        HyperSpaceLock;
   /*+0x114*/PETHREAD        ForkInProgress;
   /*+0x118*/ULONG        HardwareTrigger;
   /*+0x11c*/PVOID        VadRoot;
   /*+0x120*/PVOID        VadHint;
   /*+0x124*/PVOID        CloneRoot;
   /*+0x128*/ULONG        NumberOfPrivatePages;
   /*+0x12c*/ULONG        NumberOfLockedPages;
   /*+0x130*/PVOID        Win32Process;
   /*+0x134*/PEJOB        Job;
   /*+0x138*/PVOID        SectionObject;
   /*+0x13c*/PVOID        SectionBaseAddress;
   /*+0x140*/PEPROCESS_QUOTA_BLOCK    QuotaBlock;
   /*+0x144*/PPAGEFAULT_HISTORY        WorkingSetWatch;
   /*+0x148*/PVOID        Win32WindowStation;
   /*+0x14c*/PVOID        InheritedFromUniqueProcessId;
   /*+0x150*/PVOID         LdtInformation;
   /*+0x154*/PVOID         VadFreeHint;
   /*+0x158*/PVOID         VdmObjects;
   /*+0x15c*/PVOID         DeviceMap;
   /*+0x160*/_LIST_ENTRY    PhysicalVadList;
   /*+0x168*/_HARDWARE_PTE    PageDirectoryPte;
   /*+0x168*/Uint8B        Filler;
   /*+0x170*/PVOID        Session;
   /*+0x174*/UChar         ImageFileName[16];
   /*+0x184*/_LIST_ENTRY    JobLinks;
   /*+0x18c*/PVOID         LockedPagesList;
   /*+0x190*/_LIST_ENTRY    ThreadListHead;
   /*+0x198*/PVOID        SecurityPort;
   /*+0x19c*/PVOID        PaeTop;
   /*+0x1a0*/ULONG        ActiveThreads;
   /*+0x1a4*/ULONG        GrantedAccess;
   /*+0x1a8*/ULONG        DefaultHardErrorProcessing;
   /*+0x1ac*/Int4B        LastThreadExitStatus;
   /*+0x1b0*/Ptr32 _PEB        Peb;
   /*+0x1b4*/_EX_FAST_REF    PrefetchTrace;
   /*+0x1b8*/_LARGE_INTEGER    ReadOperationCount;
   /*+0x1c0*/_LARGE_INTEGER    WriteOperationCount;
   /*+0x1c8*/_LARGE_INTEGER    OtherOperationCount;
   /*+0x1d0*/_LARGE_INTEGER    ReadTransferCount;
   /*+0x1d8*/_LARGE_INTEGER    WriteTransferCount;
   /*+0x1e0*/_LARGE_INTEGER    OtherTransferCount;
   /*+0x1e8*/ULONG        CommitChargeLimit;
   /*+0x1ec*/ULONG        CommitChargePeak;
   /*+0x1f0*/PVOID AweInfo;
   /*+0x1f4*/_SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;
   /*+0x1f8*/_MMSUPPORT Vm;
   /*+0x238*/ULONG LastFaultCount;
   /*+0x23c*/ULONG ModifiedPageCount;
   /*+0x240*/ULONG NumberOfVads;
   /*+0x244*/ULONG JobStatus;
   /*+0x248*/ULONG Flags;
   /*+0x248*/ULONG CreateReported   : 1;
   /*+0x248*/ULONG NoDebugInherit   : 1;
   /*+0x248*/ULONG ProcessExiting   : 1;
   /*+0x248*/ULONG ProcessDelete    : 1;
   /*+0x248*/ULONG Wow64SplitPages  : 1;
   /*+0x248*/ULONG VmDeleted        : 1;
   /*+0x248*/ULONG OutswapEnabled   : 1;
   /*+0x248*/ULONG Outswapped       : 1;
   /*+0x248*/ULONG ForkFailed       : 1;
   /*+0x248*/ULONG HasPhysicalVad   : 1;
   /*+0x248*/ULONG AddressSpaceInitialized : 2;
   /*+0x248*/ULONG SetTimerResolution : 1;
   /*+0x248*/ULONG BreakOnTermination : 1;
   /*+0x248*/ULONG SessionCreationUnderway : 1;
   /*+0x248*/ULONG WriteWatch       : 1;
   /*+0x248*/ULONG ProcessInSession : 1;
   /*+0x248*/ULONG OverrideAddressSpace : 1;
   /*+0x248*/ULONG HasAddressSpace  : 1;
   /*+0x248*/ULONG LaunchPrefetched : 1;
   /*+0x248*/ULONG InjectInpageErrors : 1;
   /*+0x248*/ULONG VmTopDown        : 1;
   /*+0x248*/ULONG Unused3          : 1;
   /*+0x248*/ULONG Unused4          : 1;
   /*+0x248*/ULONG VdmAllowed       : 1;
   /*+0x248*/ULONG Unused           : 5;
   /*+0x248*/ULONG Unused1          : 1;
   /*+0x248*/ULONG Unused2          : 1;
   /*+0x24c*/Int4B ExitStatus;
   /*+0x250*/Uint2B NextPageColor;
   /*+0x252*/UChar SubSystemMinorVersion;
   /*+0x253*/UChar SubSystemMajorVersion;
   /*+0x252*/Uint2B SubSystemVersion;
   /*+0x254*/UChar PriorityClass;
   /*+0x255*/UChar WorkingSetAcquiredUnsafe;
   /*+0x258*/ULONG Cookie;
}EPROCESS_XP_SP2, *PEPROCESS_XP_SP2

关于如何在xp和2003中读写内核空间,TK大哥已经说的很清楚了,用ZwSystemDebugControl函数的8,9调用号就可以了。
这里给大家一个写的示例程序,大家改一下放到程序中,再做一下系统的判断就可以达到通用性了。

/*
Write data in kernel POC
Author:ZwelL
Idea from:TK
*/
#include <windows.h>
#include <Aclapi.h>
#include <stdio.h>

#define NT_SUCCESS(Status)      ((NTSTATUS)(Status) >= 0)
typedef LONG NTSTATUS;


typedef struct _MEMORY_CHUNKS {
    ULONG Address;
    PVOID Data;
    ULONG Length;
}MEMORY_CHUNKS, *PMEMORY_CHUNKS;

typedef NTSTATUS (NTAPI * PZwSystemDebugControl) (
    int ControlCode,
    PVOID InputBuffer,
    ULONG InputBufferLength,
    PVOID OutputBuffer,
    ULONG OutputBufferLength,
    PULONG ReturnLength
    );

HMODULE    g_hNtDLL = NULL;

PZwSystemDebugControl ZwSystemDebugControl = NULL;

BOOL InitNTDLL()
{
    g_hNtDLL = LoadLibrary( "ntdll.dll" );
    if ( !g_hNtDLL )
    {
        return FALSE;
    }

    ZwSystemDebugControl =
        (PZwSystemDebugControl)GetProcAddress (g_hNtDLL, "ZwSystemDebugControl");

    return TRUE;
}

VOID CloseNTDLL()
{
    if(g_hNtDLL != NULL)
    {
        FreeLibrary(g_hNtDLL);
    }
}

BOOL EnablePrivilege (PCSTR name)
{
    HANDLE hToken;
    BOOL rv;
    
    TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
    LookupPrivilegeValue (
        0,
        name,
        &priv.Privileges[0].Luid
    );
    
    OpenProcessToken(
        GetCurrentProcess (),
        TOKEN_ADJUST_PRIVILEGES,
        &hToken
    );
    
    AdjustTokenPrivileges (
        hToken,
        FALSE,
        &priv,
        sizeof priv,
        0,
        0
    );
    rv = GetLastError () == ERROR_SUCCESS;
    
    CloseHandle (hToken);
    return rv;
}


int main(int argc, char **argv)
{
    if (InitNTDLL())
    {
        EnablePrivilege(SE_DEBUG_NAME);
        MEMORY_CHUNKS QueryBuff;
        ULONG ReturnLength;
        char *Buff= "x11x11x11x11";

        QueryBuff.Address = (ULONG)0x804ed5cc; //在2003中是第一个服务调用号的函数指针,指向80592290
                            //大家可以改成链表的地址
        QueryBuff.Data = Buff;
        QueryBuff.Length = 0x4;
        ZwSystemDebugControl
        (
            0x9,
            &QueryBuff,
            sizeof(MEMORY_CHUNKS),  //必须是0x0C
            NULL,
            0,
            &ReturnLength
        );
        CloseNTDLL();
    }

    return 0;
}


这里我还对TK大哥在04峰会上讲的内容做了验证,发现SessionProcessLinks在XP和2003中都是可以用来权举进程的,但是在2000中都为0x00000000,
也就是说,在2000中不能通过它进行进程检查了,只能通过WorkingSetExpansionLinks来权举进程。这里TK大哥也没做说明,前面一直没怀疑过TK大哥的准确性,
花了很长时间去执行,都没成功,用WINDBG一看就出来了。哎,看来什么事还得自己验证一下啊。5555。。。下面是对TK大哥讲的内容的实现代码:

/*
用ring3代码枚举Windows进程的演示代码
Enum process in ring3 POC
Author:ZwelL
Idea from:TK
*/
#include <windows.h>
#include <Aclapi.h>
#include <stdio.h>

#define NT_SUCCESS(Status)      ((NTSTATUS)(Status) >= 0)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
#define BASEADDRLEN 10

#define W2K_SESSION_LST_OFFSET    0X118
#define WXP_SESSION_LST_OFFSET    0X0b4
#define W2K3_SESSION_LST_OFFSET    0X0b4

#define W2K_ACTIVE_LST_OFFSET    0X0a0
#define WXP_ACTIVE_LST_OFFSET    0X088
#define W2K3_ACTIVE_LST_OFFSET    0X088

#define W2K_SESSION_TO_NAME_OFFSET    0X1fc-0x118
#define WXP_SESSION_TO_NAME_OFFSET    0X0C0
#define W2K3_SESSION_TO_NAME_OFFSET    0X154-0XB4

#define W2K_ACTIVE_LST_TO_NAME_OFFSET    W2K_SESSION_TO_NAME_OFFSET+W2K_SESSION_LST_OFFSET-W2K_ACTIVE_LST_OFFSET
#define WXP_ACTIVE_LST_TO_NAME_OFFSET    WXP_SESSION_TO_NAME_OFFSET+WXP_SESSION_LST_OFFSET-WXP_ACTIVE_LST_OFFSET
#define W2K3_ACTIVE_LST_TO_NAME_OFFSET    W2K3_SESSION_TO_NAME_OFFSET+W2K3_SESSION_LST_OFFSET-W2K3_ACTIVE_LST_OFFSET

#define W2K_WORK_LST_OFFSET 0X0f4
#define W2K_IMAGE_NAME_OFFSET 0X1fc

typedef LONG NTSTATUS;

typedef struct _UNICODE_STRING
{
    USHORT    Length;
    USHORT    MaximumLength;
    PWSTR    Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES
{
    ULONG    Length;
    HANDLE    RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG    Attributes;
    PVOID    SecurityDescriptor;
    PVOID    SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;  

typedef struct _SYSTEM_MODULE_INFORMATION
{
    ULONG Reserved[2];
    PVOID Base;
    ULONG Size;
    ULONG Flags;
    USHORT Index;
    USHORT Unknown;
    USHORT LoadCount;
    USHORT ModuleNameOffset;
    CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;


typedef struct _MEMORY_CHUNKS {
    ULONG Address;
    PVOID Data;
    ULONG Length;
}MEMORY_CHUNKS, *PMEMORY_CHUNKS;

typedef enum _SYSDBG_COMMAND {
//以下5个在Windows NT各个版本上都有
    SysDbgGetTraceInformation = 1,
    SysDbgSetInternalBreakpoint = 2,
    SysDbgSetSpecialCall = 3,
    SysDbgClearSpecialCalls = 4,
    SysDbgQuerySpecialCalls = 5,

// 以下是NT 5.1 新增的
    SysDbgDbgBreakPointWithStatus = 6,

    //获取KdVersionBlock
    SysDbgSysGetVersion = 7,

    //从内核空间拷贝到用户空间,或者从用户空间拷贝到用户空间
    //但是不能从用户空间拷贝到内核空间
    SysDbgCopyMemoryChunks_0 = 8,
  //SysDbgReadVirtualMemory = 8,

    //从用户空间拷贝到内核空间,或者从用户空间拷贝到用户空间
    //但是不能从内核空间拷贝到用户空间
    SysDbgCopyMemoryChunks_1 = 9,
  //SysDbgWriteVirtualMemory = 9,

    //从物理地址拷贝到用户空间,不能写到内核空间
    SysDbgCopyMemoryChunks_2 = 10,
  //SysDbgReadVirtualMemory = 10,

    //从用户空间拷贝到物理地址,不能读取内核空间
    SysDbgCopyMemoryChunks_3 = 11,
  //SysDbgWriteVirtualMemory = 11,

    //读写处理器相关控制块
    SysDbgSysReadControlSpace = 12,
    SysDbgSysWriteControlSpace = 13,

    //读写端口
    SysDbgSysReadIoSpace = 14,
    SysDbgSysWriteIoSpace = 15,

    //分别调用RDMSR@4和_WRMSR@12
    SysDbgSysReadMsr = 16,
    SysDbgSysWriteMsr = 17,

    //读写总线数据
    SysDbgSysReadBusData = 18,
    SysDbgSysWriteBusData = 19,

    SysDbgSysCheckLowMemory = 20,

// 以下是NT 5.2 新增的

    //分别调用_KdEnableDebugger@0和_KdDisableDebugger@0
    SysDbgEnableDebugger = 21,
    SysDbgDisableDebugger = 22,
    
    //获取和设置一些调试相关的变量
    SysDbgGetAutoEnableOnEvent = 23,
    SysDbgSetAutoEnableOnEvent = 24,
    SysDbgGetPitchDebugger = 25,
    SysDbgSetDbgPrintBufferSize = 26,
    SysDbgGetIgnoreUmExceptions = 27,
    SysDbgSetIgnoreUmExceptions = 28
} SYSDBG_COMMAND, *PSYSDBG_COMMAND;

typedef enum _SYSTEM_INFORMATION_CLASS
{
    SystemBasicInformation,
    SystemProcessorInformation,
    SystemPerformanceInformation,
    SystemTimeOfDayInformation,
    SystemNotImplemented1,
    SystemProcessesAndThreadsInformation,
    SystemCallCounts,
    SystemConfigurationInformation,
    SystemProcessorTimes,
    SystemGlobalFlag,
    SystemNotImplemented2,
    SystemModuleInformation,
    SystemLockInformation,
    SystemNotImplemented3,
    SystemNotImplemented4,
    SystemNotImplemented5,
    SystemHandleInformation,
    SystemObjectInformation,
    SystemPagefileInformation,
    SystemInstructionEmulationCounts,
    SystemInvalidInfoClass1,
    SystemCacheInformation,
    SystemPoolTagInformation,
    SystemProcessorStatistics,
    SystemDpcInformation,
    SystemNotImplemented6,
    SystemLoadImage,
    SystemUnloadImage,
    SystemTimeAdjustment,
    SystemNotImplemented7,
    SystemNotImplemented8,
    SystemNotImplemented9,
    SystemCrashDumpInformation,
    SystemExceptionInformation,
    SystemCrashDumpStateInformation,
    SystemKernelDebuggerInformation,
    SystemContextSwitchInformation,
    SystemRegistryQuotaInformation,
    SystemLoadAndCallImage,
    SystemPrioritySeparation,
    SystemNotImplemented10,
    SystemNotImplemented11,
    SystemInvalidInfoClass2,
    SystemInvalidInfoClass3,
    SystemTimeZoneInformation,
    SystemLookasideInformation,
    SystemSetTimeSlipEvent,
    SystemCreateSession,
    SystemDeleteSession,
    SystemInvalidInfoClass4,
    SystemRangeStartInformation,
    SystemVerifierInformation,
    SystemAddVerifier,
    SystemSessionProcessesInformation
} SYSTEM_INFORMATION_CLASS;

typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION )
(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

typedef NTSTATUS (CALLBACK* ZWOPENSECTION)(
    OUT PHANDLE SectionHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes
    );

typedef VOID (CALLBACK* RTLINITUNICODESTRING)(        
    IN OUT PUNICODE_STRING DestinationString,
    IN PCWSTR SourceString
    );

typedef NTSTATUS (NTAPI * PZwSystemDebugControl) (
    SYSDBG_COMMAND ControlCode,
    PVOID InputBuffer,
    ULONG InputBufferLength,
    PVOID OutputBuffer,
    ULONG OutputBufferLength,
    PULONG ReturnLength
    );

ZWQUERYSYSTEMINFORMATION    ZwQuerySystemInformation = NULL;
RTLINITUNICODESTRING        RtlInitUnicodeString;
ZWOPENSECTION                ZwOpenSection;
HMODULE                        g_hNtDLL = NULL;
PVOID                        g_pMapPhysicalMemory = NULL;
HANDLE                        g_hMPM   = NULL;

PZwSystemDebugControl ZwSystemDebugControl = NULL;

BOOL InitNTDLL()
{
    g_hNtDLL = LoadLibrary( "ntdll.dll" );
    if ( !g_hNtDLL )
    {
        return FALSE;
    }

    RtlInitUnicodeString =
        (RTLINITUNICODESTRING)GetProcAddress( g_hNtDLL, "RtlInitUnicodeString");

    ZwOpenSection =
        (ZWOPENSECTION)GetProcAddress( g_hNtDLL, "ZwOpenSection");

    ZwQuerySystemInformation =
        ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( g_hNtDLL, "ZwQuerySystemInformation" );

    ZwSystemDebugControl =
        (PZwSystemDebugControl)GetProcAddress (g_hNtDLL, "ZwSystemDebugControl");

    return TRUE;
}

VOID CloseNTDLL()
{
    if(g_hNtDLL != NULL)
    {
        FreeLibrary(g_hNtDLL);
    }
}

HANDLE OpenPhysicalMemory()
{
    NTSTATUS        status;
    UNICODE_STRING        physmemString;
    OBJECT_ATTRIBUTES    attributes;
    
    RtlInitUnicodeString( &physmemString, L"//Device//PhysicalMemory" );
    
    attributes.Length            = sizeof(OBJECT_ATTRIBUTES);
    attributes.RootDirectory        = NULL;
    attributes.ObjectName            = &physmemString;
    attributes.Attributes            = 0;
    attributes.SecurityDescriptor        = NULL;
    attributes.SecurityQualityOfService    = NULL;
    
    status = ZwOpenSection(&g_hMPM,SECTION_MAP_READ|SECTION_MAP_WRITE,&attributes);
    
    if(status == STATUS_ACCESS_DENIED){
        status = ZwOpenSection(&g_hMPM,READ_CONTROL|WRITE_DAC,&attributes);
        //SetPhyscialMemorySectionCanBeWrited(g_hMPM);
        CloseHandle(g_hMPM);
        status =ZwOpenSection(&g_hMPM,SECTION_MAP_READ|SECTION_MAP_WRITE,&attributes);
    }
    if( !NT_SUCCESS( status ))
    {
        return NULL;
    }
    
    g_pMapPhysicalMemory = MapViewOfFile(
        g_hMPM,
        4,
        0,
        0x30000,
        0x1000);
    if( g_pMapPhysicalMemory == NULL )
    {
        return NULL;
    }
    return g_hMPM;
}


PVOID LinearToPhys(PULONG BaseAddress,PVOID addr)
{
    ULONG VAddr=(ULONG)addr,PGDE,PTE,PAddr;
    if(VAddr>=0x80000000 && VAddr<0xa0000000)
    {
        PAddr=VAddr-0x80000000;
        return (PVOID)PAddr;
    }
    PGDE=BaseAddress[VAddr>>22];
    if ((PGDE&1)!=0)
    {
        ULONG tmp=PGDE&0x00000080;
        if (tmp!=0)
        {
            PAddr=(PGDE&0xFFC00000)+(VAddr&0x003FFFFF);
        }
        else
        {
            PGDE=(ULONG)MapViewOfFile(g_hMPM, FILE_MAP_ALL_ACCESS, 0, PGDE & 0xfffff000, 0x1000);
            PTE=((PULONG)PGDE)[(VAddr&0x003FF000)>>12];
            if ((PTE&1)!=0)
            {
                PAddr=(PTE&0xFFFFF000)+(VAddr&0x00000FFF);
                UnmapViewOfFile((PVOID)PGDE);
            }
            else return 0;
        }
    }
    else return 0;

    return (PVOID)PAddr;
}

BOOL EnablePrivilege (PCSTR name)
{
    HANDLE hToken;
    BOOL rv;
    
    TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
    LookupPrivilegeValue (
        0,
        name,
        &priv.Privileges[0].Luid
    );
    
    OpenProcessToken(
        GetCurrentProcess (),
        TOKEN_ADJUST_PRIVILEGES,
        &hToken
    );
    
    AdjustTokenPrivileges (
        hToken,
        FALSE,
        &priv,
        sizeof priv,
        0,
        0
    );
    rv = GetLastError () == ERROR_SUCCESS;
    
    CloseHandle (hToken);
    return rv;
}

void GetString(PVOID addr, char *returnstr)
{
    OSVERSIONINFO OSVersionInfo;
    PCHAR ret;

    OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    GetVersionEx (&OSVersionInfo);
    if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
        OSVersionInfo.dwMajorVersion >= 5 &&
        OSVersionInfo.dwMinorVersion >= 1)    //Windows XP以上
    {    
        MEMORY_CHUNKS QueryBuff;
        ULONG ReturnLength;
        char Buff[0x30] = {0};

        QueryBuff.Address = (ULONG)addr;
        QueryBuff.Data = Buff;  //在此是读出缓冲
        QueryBuff.Length = sizeof(Buff);

        EnablePrivilege(SE_DEBUG_NAME);

        ZwSystemDebugControl
        (
            SysDbgCopyMemoryChunks_0,
            &QueryBuff,
            sizeof(MEMORY_CHUNKS),  //必须是0x0C
            NULL,
            0,
            &ReturnLength
        );

        strcpy(returnstr, Buff);
    }
    else
    {
        ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);
        PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, FILE_MAP_ALL_ACCESS, 0, phys & 0xfffff000, 0x1000);
        if (tmp==0)
        {
            printf("getdata wrongn");
            return;
        }
        strcpy(returnstr, (PCHAR)&tmp[(phys & 0xFFF)>>2]);
        UnmapViewOfFile(tmp);
    }
}

ULONG GetData(PVOID addr)
{
    OSVERSIONINFO OSVersionInfo;
    ULONG ret;

    OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    GetVersionEx (&OSVersionInfo);
    if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
        OSVersionInfo.dwMajorVersion >= 5 &&
        OSVersionInfo.dwMinorVersion >= 1)    //Windows XP以上
    {    
        MEMORY_CHUNKS QueryBuff;
        ULONG ReturnLength;
        char Buff[0x300] = {0};

        QueryBuff.Address = (ULONG)addr;
        QueryBuff.Data = Buff;  //在此是读出缓冲
        QueryBuff.Length = sizeof(Buff);

        EnablePrivilege(SE_DEBUG_NAME);

        ZwSystemDebugControl
        (
            SysDbgCopyMemoryChunks_0,
            &QueryBuff,
            sizeof(MEMORY_CHUNKS),  //必须是0x0C
            NULL,
            0,
            &ReturnLength
        );
        ret = *(PULONG)Buff;
    }
    else
    {
        ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);
        PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, FILE_MAP_ALL_ACCESS, 0, phys & 0xfffff000, 0x1000);
        if (tmp==0)
        {
            printf("getdata wrongn");
            return 0;
        }
        ret=tmp[(phys & 0xFFF)>>2];
        UnmapViewOfFile(tmp);
    }
    return ret;
}

DWORD MyGetModuleBaseAddress( char * pModuleName)
{
    PSYSTEM_MODULE_INFORMATION    pSysModule;    

    ULONG            uReturn;
    ULONG            uCount;
    PCHAR            pBuffer = NULL;
    PCHAR            pName    = NULL;
    NTSTATUS        status;
    UINT            ui;

    CHAR            szBuffer[BASEADDRLEN];
    DWORD            pBaseAddress;

    status = ZwQuerySystemInformation( SystemModuleInformation, szBuffer, BASEADDRLEN, &uReturn );

    pBuffer = ( PCHAR )malloc(uReturn);

    if ( pBuffer )
    {
        status = ZwQuerySystemInformation( SystemModuleInformation, pBuffer, uReturn, &uReturn );

        if( NT_SUCCESS(status) )
        {
            uCount = ( ULONG )*( ( ULONG * )pBuffer );
            pSysModule = ( PSYSTEM_MODULE_INFORMATION )( pBuffer + sizeof( ULONG ) );

            if(pModuleName == NULL)
            {
                for ( ui = 0; ui < uCount; ui++ )
                {
                    printf("%s ntBase address: 0x%08xn", pSysModule->ImageName, pSysModule->Base);

                    pSysModule ++;
                }
            }
            else
            {

                for ( ui = 0; ui < uCount; ui++ )
                {
                    pName = strstr( pSysModule->ImageName, pModuleName );

                    if( pName )
                    {
                        //printf("%s ntBase address: 0x%08xn", pSysModule->ImageName, pSysModule->Base);
                        pBaseAddress = (DWORD)pSysModule->Base;
                        free( pBuffer );
                        return pBaseAddress;
                    }
                    pSysModule ++;
                }
            }
        }

        free( pBuffer );
    }

    return NULL;
}

int main(int argc, char **argv)
{
    int SESSION_TO_NAME_OFFSET=0;
    int SESSION_LST_OFFSET=0;
    int ACTIVE_LST_TO_NAME_OFFSET=0;
    int ACTIVE_LST_OFFSET=0;
    char imagename[0x30];
    OSVERSIONINFO OSVersionInfo;
    HMODULE hDll;
    LPVOID lpps;
    PVOID firstaddr;
    PVOID nowaddr;


    if (InitNTDLL())
    {
        OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
        GetVersionEx (&OSVersionInfo);

        if (OSVersionInfo.dwMajorVersion == 5)
        {
            if(OSVersionInfo.dwMinorVersion == 0)
            {
                    //SESSION_TO_NAME_OFFSET=W2K_SESSION_TO_NAME_OFFSET;
                    //SESSION_LST_OFFSET=W2K_SESSION_LST_OFFSET;
                    //ACTIVE_LST_TO_NAME_OFFSET=W2K_ACTIVE_LST_TO_NAME_OFFSET;
                    //ACTIVE_LST_OFFSET=W2K_ACTIVE_LST_OFFSET;
                    //如果用SESSIONLST的话,将会读到0x00000000
                    SESSION_TO_NAME_OFFSET=W2K_IMAGE_NAME_OFFSET-W2K_WORK_LST_OFFSET;
                    SESSION_LST_OFFSET=W2K_WORK_LST_OFFSET;
                    ACTIVE_LST_TO_NAME_OFFSET=W2K_ACTIVE_LST_TO_NAME_OFFSET;
                    ACTIVE_LST_OFFSET=W2K_ACTIVE_LST_OFFSET;

                    if (OpenPhysicalMemory()==0)
                    {
                        printf("OpenPhysicalMemory wrongn");
                        return -1;
                    }
            }
            else if(OSVersionInfo.dwMinorVersion == 1)
            {
                    SESSION_TO_NAME_OFFSET=WXP_SESSION_TO_NAME_OFFSET;
                    SESSION_LST_OFFSET=WXP_SESSION_LST_OFFSET;
                    ACTIVE_LST_TO_NAME_OFFSET=WXP_ACTIVE_LST_TO_NAME_OFFSET;
                    ACTIVE_LST_OFFSET=WXP_ACTIVE_LST_OFFSET;
            }
            else if(OSVersionInfo.dwMinorVersion == 2)
            {
                    SESSION_TO_NAME_OFFSET=W2K3_SESSION_TO_NAME_OFFSET;
                    SESSION_LST_OFFSET=W2K3_SESSION_LST_OFFSET;
                    ACTIVE_LST_TO_NAME_OFFSET=W2K3_ACTIVE_LST_TO_NAME_OFFSET;
                    ACTIVE_LST_OFFSET=W2K3_ACTIVE_LST_OFFSET;
            }
        }
        else
        {
            printf("The OS version is not be supported...n");
            return -1;
        }

        hDll = LoadLibrary("ntoskrnl.exe");
        lpps = GetProcAddress(hDll, "PsInitialSystemProcess");
        lpps=(LPVOID)(MyGetModuleBaseAddress("ntoskrnl.exe")+(DWORD)lpps-(DWORD)hDll);
        printf("PsInitialSystemProcess address : 0x%08Xnn", lpps);
        FreeLibrary(hDll);

        printf("OS version: %1d.%1dn", OSVersionInfo.dwMajorVersion, OSVersionInfo.dwMinorVersion);
        printf("ActiveProcessLinks Offset : 0x%03Xn", ACTIVE_LST_OFFSET);
        if(OSVersionInfo.dwMinorVersion == 0)
            printf("SessionProcessLinks Offset : 0x%03Xn", SESSION_LST_OFFSET);
        else
            printf("WorkingSetExpansionLinks Offset : 0x%03Xn", SESSION_LST_OFFSET);
        printf("ImageFileName Offset : 0x%03Xnn", ACTIVE_LST_OFFSET+ACTIVE_LST_TO_NAME_OFFSET);
        
        firstaddr=(LPVOID)(GetData(lpps)+ACTIVE_LST_OFFSET);
        //GetString((PVOID)((DWORD)firstaddr+ACTIVE_LST_TO_NAME_OFFSET),imagename);
        //printf("EPROCESS : 0x%08X : %sn", (DWORD)firstaddr-ACTIVE_LST_OFFSET, imagename);
        if(OSVersionInfo.dwMinorVersion == 0)
        {
            firstaddr=(LPVOID)((DWORD)firstaddr-ACTIVE_LST_OFFSET+SESSION_LST_OFFSET);
        }
        else
        {
            firstaddr=(LPVOID)(GetData(firstaddr));
            GetString((PVOID)((DWORD)firstaddr+ACTIVE_LST_TO_NAME_OFFSET),imagename);
            printf("EPROCESS : 0x%08X : %sn", (DWORD)firstaddr-ACTIVE_LST_OFFSET, imagename);
            firstaddr=(LPVOID)(GetData(firstaddr));
            firstaddr=(LPVOID)((DWORD)firstaddr-ACTIVE_LST_OFFSET+SESSION_LST_OFFSET);
        }

        nowaddr=firstaddr;
        do
        {
            if((DWORD)nowaddr>0xffff0000)
                break;
            GetString((PVOID)((DWORD)nowaddr+SESSION_TO_NAME_OFFSET), imagename);
            printf("EPROCESS : 0x%08X : %sn", (DWORD)nowaddr-SESSION_LST_OFFSET, imagename);
            nowaddr=(LPVOID)GetData(nowaddr);        
        }
        while(firstaddr!=nowaddr && nowaddr>0);
        getchar();
        UnmapViewOfFile(g_pMapPhysicalMemory);
        CloseHandle(g_hMPM);
        CloseNTDLL();
    }

    return 0;
}


参考资料:
1. 用ring3代码可靠地枚举Windows进程 -TK
     http://www.xfocus.net/projects/Xcon/2004/Xcon2004_tk.pdf
---
Welcome to my blog:
http://www.donews.net/zwell/
RK312X Android 7.1 ACM功能避坑指南:从配置到内核打补丁的全流程 本文详细解析了RK312X Android 7.1平台实现USB ACM功能的完整流程,包括内核配置、Android层设置、Windows驱动安装及内核补丁方案。特别针对instances变量引发的内核崩溃问题,提供了安全补丁实现和压力测试方法,帮助开发者高效避坑并提升系统稳定性。 阅读详情

相关推荐

Windows C盘深度清理:20GB~60GB释放实操指南

Windows C盘空间不足是典型系统性能瓶颈,本质源于系统更新残留、休眠文件、功能组件冗余等深层机制。其原理涉及Windows更新缓存(SoftwareDistribution)、旧系统备份(Windows.old)、电源策略生成的hiberfil.sys及WinSxS组件存储膨胀。这类问题不依赖第三方工具,而需调用cleanmgr深度扫描、powercfg禁用休眠、DISM组件清理等原生命令实现安全减负。技术价值在于规避重装系统、保障稳定性、延长SSD寿命;广泛适用于开发环境、轻薄本及长期未重装的老机用

weixin_34082789的博客 360

(9) [保护模式] 10-10-12分页

windows中10-10-12分页中CR3,PDE,PTE和物理页有着怎样的对应关系? 给0线性地址挂物理页;使用代码挂物理页。 PDE和PTE与线性地址C030 0000和C000 0000的对应关系验证。 PDE,PTE属性位介绍,以及用实验论证。

qq_50332504的博客 1101

Ubuntu 22.04安装避坑指南:UEFI、Secure Boot与手动分区实战

Linux系统安装并非简单点击向导,其本质是硬件固件(UEFI/BIOS)、安全机制(Secure Boot)、磁盘管理(GPT/LVM)和引导控制(GRUB)的综合协同过程。理解UEFI启动原理可避免90%的U盘无法识别问题;掌握Secure Boot开关逻辑能快速解决NVIDIA驱动黑屏或WiFi失联;而放弃‘全盘安装’默认选项、转向手动分区(ESP+FAT32+/boot+LUKS可选),则是保障双系统共存与数据安全的关键技术决策。本文聚焦Ubuntu 22.04 LTS这一主流开发环境,在真实硬件场

culiao6493的博客 555

内核空间详细解释

内核空间(Kernel Space)是操作系统中用于运行核心操作系统代码和操作系统内核所需的数据结构的区域。它与用户空间(User Space)一起构成了计算机系统的内存空间划分,但它的职责和特性与用户空间有显著的不同。内核空间在系统的正常操作过程中高度安全和受保护,只有操作系统的内核和有特定权限的进程才能访问。

Flying_Fish_roe的博客 874

tanner2019安装教程

tanner2019安装教程 tanner安装包 软件由老师提供,但由于老师给的方法不知怎么回事无法使用就自己找了一些方法,本教程仅提供参考 链接:https://pan.baidu.com/s/1A2O6JuEF8YFbe8bPnD3J6w 提取码:ysif 复制这段内容后打开百度网盘手机App,操作更方便哦 安装过程 1.选择TannerTools_v2019.2-Win64.exe,进行安装。 2.选择安装产品 3.选择目标路径 4.确认安装 5.安装成功,退出。 获取许可过程 1.打开key压缩

weixin_47730560的博客 1万+

VS Code/TRAE集成Cppcheck并启用MISRA规则

本文探讨了嵌入式开发中Cppcheck工具集成与MISRA规则检查的必要性。详细介绍了安装配置步骤:安装VSCode/TRAE、Cppcheck软件、配置插件参数、安装Python环境,并重点说明了MISRA规则文件的设置方法。通过完整的配置流程,实现了嵌入式开发环境下静态检查与安全标准的落地。

SDFangFang2025的博客 1282

深入浅析Windows内核——VAD篇

深入浅析Windows内核——VAD篇为何叫深入浅析呢?所谓深入指的是我们将要面对的是微软公开的Windows源码,适用于Windows XP/Windows Server 2003。所谓浅析当然是指本人水平有限,这能望文生义,做一做表面文章。大家都知道,在x86的平台上Windows操作系统为每个进程描述了一个完整的4G的地址空间,这4G空间由低位2G的用户地址空间和高位2G的系

SaiCT的专栏 7405

拆解一个800G光模块:手把手带你认识里面的MT插芯和光纤阵列(FA)

本文详细拆解了800G光模块中的关键组件MT插芯和光纤阵列(FA),揭示了并行光学技术如何实现高速数据传输。通过显微镜下的精密观察,展示了MT插芯的高精度构造和光纤阵列的连接奥秘,同时解析了高精度研磨工艺对光信号传输的重要性。这些微型组件是高速收发模块实现800Gbps带宽的核心技术。

weixin_30839881的博客 1557

CPU模型,内存分页与调优,内核与用户空间

我们知道,CPU是通过寻址来访问内存的。32位CPU的寻址宽度是,计算后得到的大小是4G,也就是说可支持的物理内存最大是4G。但在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。为了解决此类问题,现代CPU引入了MMU(内存管理单元)MMU的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由MMU负责将虚址映射为物理地址。MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。内存分页(Paging)是在使用和。...

上善若泪 2124

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

QGroundControl或者华科尔地面站安装完打不开问题解决

QGroundControl 华科尔 打不开

wv112406的博客 4923

关于Windows内核空间操作的一些说明

首先对被我误导的人说声对不起了。我在论坛中发的那篇贴(用户态隐藏进程的通用版本)真是乱七八糟(-_-我也是受害者)。在XP和WINDOWS 2003中用那种方法都是行不通的,而且在20043中的偏移也是错的。这里我先把XPSP2和2003中的EPROCESS整理出来给大家看一下:typedef struct _EPROCESS_2K3{   /*+0x000*/ KPROCESS_2K3     

老裴 1176

从零开始学习CANoe(十六)—— Graphics

Graphics是一种以时间轴为横坐标,符号值为纵坐标的显示分析方法,相对于Trace来说,更直观的观察出信号的跳变

蚂蚁小兵 9194

OpenArk内核驱动完全指南:深度解密Windows反Rootkit技术核心

在Windows系统安全的隐秘战场上,OpenArk作为新一代反Rootkit工具,以其强大的内核模式能力成为了技术探索者的得力助手。然而,当内核驱动加载的魔法失效时,整个工具的功能交响乐便戛然而止。本文将带你深入OpenArk的技术迷宫,解锁内核驱动的奥秘,掌握从诊断到修复的全套技术拼图。 ## 技术探险:走进OpenArk的底层世界 OpenArk不仅仅是一个系统工具,它是一个完整的技术生

gitblog_01080的博客 906

“华为杯”研究生数学建模竞赛2016年-【华为杯】A题:多无人机协同任务规划

题分别求解,保证了攻击方无人机滞留在防御方雷达有效探测范围内的时间总和最小,接着,通过提出巡检待命无人机的设想,型无人机携带炸弹的具体清单和攻击的目标清单),保证攻击方的无人机滞留防御方雷。在使用基于贪心算法的覆盖法时,覆盖的目标点中必须首先不含配备雷达站的目标点。步优化保证攻击方的无人机滞留防御方雷达有效探测范围内的时间总和最小,需首先。的“灵巧”炸弹,采用抛投方式对地攻击,即投放后炸弹以飞机投弹时的速度作抛物。运动,当炸弹接近目标后,可主动寻的攻击待打击的目标,因此炸弹落点位于目标中。

getusushu的博客 1040

【存算一体架构实战】四、突破编译壁垒:手把手实现AI模型到存算硬件的自动映射

摘要:存算一体硬件的性能优势难以充分释放,核心瓶颈在于传统编译器无法高效适配"计算-存储融合"的新型架构。本文系统剖析传统编译流程在存算硬件上的三大痛点:数据布局不匹配导致90%带宽浪费、算子映射效率低使硬件利用率不足30%、缺乏专用优化_pass导致延迟居高不下。通过构建MLIR-PIM编译框架,实现从AI模型到存算硬件的全自动化映射,核心流程包括:TensorFlow模型→MLIR Dialect转换→存算优化_pass→硬件指令生成。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 243

Linux/Windows 应用程序开发

  虽然写的都是代码,但是代码运行在哪个级别什么位置,还是需要做好定位,这样才心中有数。Linux和Windows都是宏内核,内核自己管理硬件软件资源,对外提供“系统调用”给程序员编程。   操作系统按照一定的协议把我们写的程序加载进内存,为其分配内存等资源,让其诞生;然后程序自己管自己,自己运行;最后C/C++/J...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 360

pscad IEEE标准系统搭建说明

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

Linux设备驱动开发入门:从内核模块到设备树的完整路径

操作系统通过驱动程序管理底层硬件,而内核模块则是驱动代码的基本载体,理解其加载机制是入门的第一步。字符设备框架借助file_operations结构体,实现了用户空间与内核态的数据交互,是驱动开发的核心基础。随着嵌入式Linux的发展,设备树与platform驱动模型成为描述硬件资源和驱动匹配的关键技术,显著提升了代码的可移植性与开发效率。实际工程中,驱动开发还涉及GPIO控制、中断处理、并发同步等实践环节,通常需要结合开发板进行验证。围绕Linux设备驱动开发的系统学习路径,从环境搭建、最小模块、字符设备

weixin_34268579的博客 370

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

基于linux5.15.5的IMX 参考手册 --- 8

基于linux5.15.5的IMX 参考手册

chocolate2018的博客 1948

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

软件功能扩展方法:Cursor应用限制解除方案详解

在软件开发过程中,开发者常面临各类应用功能限制问题。本文将系统介绍一种软件功能扩展方法,帮助用户解决Cursor应用的使用限制问题,实现更高效的开发体验。通过科学的应用限制解除方案,用户可以突破默认配置下的功能约束,优化开发流程。 ## 功能限制问题深度解析 ### 常见功能限制表现形式 Cursor作为一款集成AI能力的代码编辑器,在默认配置下存在多项功能使用约束。这些限制主要体现在三个方

gitblog_00421的博客 343

游戏加速神器OpenSpeedy:免费开源的时间控制器终极指南

你是否曾在游戏中等待资源积累时感到焦躁?是否因为加载时间过长而失去了游戏乐趣?OpenSpeedy作为一款完全免费开源的游戏加速工具,通过创新的时间控制技术,让你轻松掌控游戏节奏,获得前所未有的流畅体验。这款开源游戏加速工具不仅能提升单机游戏的游玩效率,还能优化模拟经营和策略游戏的体验,让你在游戏中获得更大的掌控感。 ## 🚀 为什么你需要OpenSpeedy? 想象一下这样的场景:你在玩《

gitblog_01020的博客 480

运维常用命令(持续更新中)

linux基础常用命令

记忆的博客 2376

GeoPandas 空间分析工具集(tools 模块)实战指南:空间连接、叠加、裁剪与网格生成

GeoPandas 在顶层 API 之外,还维护了一个专门的空间分析工具模块 `geopandas.tools`,将日常高频的空间操作(空间连接、最近邻匹配、矢量叠加、按掩膜裁剪、规则网格生成、地理编码等)封装为可直接调用的函数。本文以 `doc/source/docs/reference/tools.rst` 中列出的 9 个工具为骨架,逐一讲解它们的函数签名、核心参数、典型用法,并结合仓库源码

gitblog_00004的博客 319

AI智能体OpenClaw登顶GIS工具榜:部署、技能封装与自动化实战

AI智能体正从对话助手走向工作流自动化中枢。通过自然语言解析任务目标,智能体可自主调用现有命令行工具与脚本,完成复杂的数据处理流程。在GIS领域,这种模式有效解决了传统脚本编写门槛高、模型构建器灵活性不足的问题。实际工程中,无论是shp批量转TXT、字段计算器自动编号,还是GIS软件自动化测试,均可通过将操作封装为技能(Skill),让智能体按既定流程执行并自动容错。以开源项目OpenClaw为例,它通过部署在WSL2环境、接入本地Ollama模型,实现离线GIS数据处理,大幅降低重复劳动。因此,AI智能体

weixin_29092579的博客 235
上一篇: Cracking Cached Domain/Active Directory Passwords on Windows XP/2000/2003
下一篇: 发一段开启摄像头的代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值