pspCidTable

一款手工杀毒/Anti-rootkit工具-ixer 0.11开源版 前言:       随着信息科技的迅速发展,Internet已经成为全球最重要的信息传播工具。当人们在享受网络为我们的工作、生活带来方便和效率的同时,但它们潜在地也带来了安全问题。据统计,凡是刚开始接触过互联网的人,大部分人都或多或少的被入侵、恶意攻击过,并且安全威胁事件逐年上升。可见黑客如此猖獗,应该采取什么手段来防止黑客入侵是大家普遍关心的问题。 长期以来,最为严重的安全威胁就是恶意程序。 阅读详情


一.                        pspCidTable概念及内核调试
-----------------------------------------------------


pspCidTable是内核未导出的HANDLE_TALBE结构,它保存着所有进程和线程对象的指针。
只要能遍历这个PspCidTable句柄表,就可以遍历到系统的所有进程,包括所有隐藏进程,除非你抹掉pspCidTable...

结构如下:


typedef struct _HANDLE_TABLE
{
   ULONG           Flags;
   LONG             HandleCount;
   PHANDLE_TABLE_ENTRY **Table;
   PEPROCESS         QuotaProcess;
   HANDLE           UniqueProcessId;
   LONG             FirstFreeTableEntry;
   LONG             NextIndexNeedingPool;
   ERESOURCE         HandleTableLock;
   LIST_ENTRY         HandleTableList;
   KEVENT           HandleContentionEvent;
} HANDLE_TABLE , *PHANDLE_TABLE ;


我们利用调试器先从内核里找到这张表:


kd> version
Windows XP Kernel Version 2600 (Service Pack 2) UP Free x86 compatible
Built by: 2600.xpsp_sp2_rtm.040803-2158
Kernel base = 0x804d7000 PsLoadedModuleList = 0x8055ab20
//...
dbgeng:   image 6.7.0005.1, built Wed Jun 20 11:50:35 2007
//...


kd> dd pspCidTAble
80560ce0   e10018c8 00000002 00000000 00000000
80560cf0   00000000 00000000 00000000 00000000
80560d00   00000000 00000000 00000000 00000000
80560d10   00000000 00000000 00000000 00000000


kd> dt _HANDLE_TABLE e10018c8
nt!_HANDLE_TABLE
   +0x000 TableCode         : 0xe1003000
   +0x004 QuotaProcess     : (null)
   +0x008 UniqueProcessId   : (null)
   +0x00c HandleTableLock   : [4] _EX_PUSH_LOCK
   +0x01c HandleTableList   : _LIST_ENTRY [ 0xe10018e4 - 0xe10018e4 ]
   +0x024 HandleContentionEvent : _EX_PUSH_LOCK
   +0x028 DebugInfo         : (null)
   +0x02c ExtraInfoPages   : 0
   +0x030 FirstFree         : 0x770
   +0x034 LastFree         : 0x764
   +0x038 NextHandleNeedingPool : 0x800
   +0x03c HandleCount       : 266
   +0x040 Flags             : 1
   +0x040 StrictFIFO       : 0y1


注意NextHandleNeedingPool : 0x800,句柄表依靠NextHandleNeedingPool来计数的,
凡是大于0x800(2048)的部分就放入第二张表中.所以当CID(PID)号大于0x800时,
就需要查找第二张表了.例如要定位CID等于0x844的句柄表位置,
0xe1003800 + ( 0x844 - 0x800 ) * 2 这个偏移就是CID为0x844的句柄项了.


kd> dd e1003000
e1003000   00000000 fffffffe 81fc9a01 00000000
e1003010   81fc9789 00000000 81fc9341 00000000
e1003020   81fc8021 00000000 81fc8da9 00000000
e1003030   81fc8b31 00000000 81fc88b9 00000000
e1003040   81fc8641 00000000 81fc83c9 00000000
e1003050   81fc7021 00000000 81fc7da9 00000000
e1003060   81fc7b31 00000000 81fc78b9 00000000
e1003070   81fc7641 00000000 81fc73c9 00000000

kd> !object 81fc9a01
Object: 81fc9a01   Type: (0081fc90)
     ObjectHeader: 81fc99e9 (old version)
     HandleCount: 1073741824   PointerCount: 33554432

kd> !object 81fc9a00
Object: 81fc9a00   Type: (81fc9040) Process
     ObjectHeader: 81fc99e8 (old version)
     HandleCount: 2   PointerCount: 56

81fc9a00的进程是System...以后的都是其线程。

kd> !object 81fc73c9
Object: 81fc73c9   Type: (0081fc9e)
     ObjectHeader: 81fc73b1 (old version)
     HandleCount: 1879048192   PointerCount: 0

kd> !object 81fc73c8
Object: 81fc73c8   Type: (81fc9e70) Thread
     ObjectHeader: 81fc73b0 (old version)
     HandleCount: 0   PointerCount: 1

kd> !thread 81fc73c8
THREAD 81fc73c8   Cid 0004.003c   Teb: 00000000 Win32Thread: 00000000 WAIT: (WrQueue) UserMode Non-Alertable
     80561b7c   Unknown
Not impersonating
DeviceMap                 e10001e8
Owning Process             81fc9a00       Image:         System
Wait Start TickCount       16940           Ticks: 20342 (0:00:03:23.712)
Context Switch Count       418          
UserTime                   00:00:00.000
KernelTime                 00:00:03.124
//....

我们可以根据PID查找进程对象.HANDLE_TABLE的Entry地址+PID*2 。
在此之前,你可以用:

kd>!process 0 0
枚举所有的进程,然后再根据PID来查找验证。
我们以calc.exe PID738为例:


kd> dd e1003000+738*2
e1003e70   81f15da1 00000000 81ef26e1 00000000
e1003e80   81d1f021 00000000 00000000 00000124
e1003e90   00000000 00000744 00000000 00000150
e1003ea0   00000000 0000075c 00000000 00000750
e1003eb0   00000000 00000760 00000000 00000758
e1003ec0   00000000 00000764 00000000 00000768
e1003ed0   00000000 0000076c 00000000 00000774
e1003ee0   00000000 0000077c 00000000 00000770

kd> !object 81f15da1
Object: 81f15da1   Type: (0081fc90)
     ObjectHeader: 81f15d89 (old version)
     HandleCount: 1073741824   PointerCount: 33554432

kd> !object 81f15da0
Object: 81f15da0   Type: (81fc9040) Process
     ObjectHeader: 81f15d88 (old version)
     HandleCount: 2   PointerCount: 15

kd> !process 81f15da0
PROCESS 81f15da0   SessionId: 0   Cid: 0738     Peb: 7ffd5000   ParentCid: 03ec
     DirBase: 0ddf4000   ObjectTable: e1a222f8   HandleCount:   26.
     Image: calc.exe
//...


二.     获取pspCidTable的方法
-----------------------------------------------------
罗嗦几句,在得到pspCidTable后,我们可以有很多方法来实现枚举。
比如:
1.利用未导出的ExEnumHandleTable函数 ;
2.直接自己获取PHANDLE_TABLE_ENTRY等,然后PsLookupProcessByProcessId ;
(这里一直有误导人的意思,其实我本意是让大家自己实现这些个函数...)

回归正题:

1.在PsLookupProcessByProcessId函数中搜索特征串定位 PspCidTalbe.
这个方法也是本人用的方法,代码如下:


void GetPspCidTable()
{
     PUCHAR cPtr;
     unsigned char * pOpcode;
     ULONG Length;

     for (cPtr = (PUCHAR)PsLookupProcessByProcessId;
         cPtr < (PUCHAR)PsLookupProcessByProcessId + PAGE_SIZE;
         cPtr += Length)
     {
         Length = SizeOfCode(cPtr, &pOpcode);     //credit to LDasm.c by Ms-Rem

         if (!Length) break;

         if (*(PUSHORT)cPtr == 0x35FF && *(pOpcode + 6) == 0xE8)
         {
             pPspCidTable = **(PVOID **)(pOpcode + 2);
             break;
         }
     }
}

其中,全局变量:
PHANDLE_TABLE pPspCidTable = NULL;

当然,PsLookupProcessThreadByCid里也是一样的。



2.利用KDDEBUGGER_DATA(32/64)结构得到pspCidTable.
流程是这样的: KdEnableDebugger->KdInitSystem->KdDebuggerDataBlock/KDDEBUGGER_DATA(32) ->PspCidTable
当然也是内存字节搜索,比如006A006Ah,05C6006ah,0e801h,4742444bh等等。注意平台间的差异性.
当然简单点的方法是加 DebugGetKdVersionBlock参数用NtSystemDebugControl获取KdVersionBlock,再转到KdDebuggerDataBlock.
Windbg的SDK里wdbgexts.h中有相关的结构定义:

typedef struct _KDDEBUGGER_DATA32 {
     DBGKD_DEBUG_DATA_HEADER32 Header;
     ULONG   KernBase;
     ULONG   BreakpointWithStatus;       // address of breakpoint
     ULONG   SavedContext;
     USHORT   ThCallbackStack;             // offset in thread data
     USHORT   NextCallback;               // saved pointer to next callback frame
     USHORT   FramePointer;               // saved frame pointer
     USHORT   PaeEnabled:1;
     ULONG   KiCallUserMode;             // kernel routine
     ULONG   KeUserCallbackDispatcher;   // address in ntdll

     ULONG   PsLoadedModuleList;
     ULONG   PsActiveProcessHead;
     ULONG   PspCidTable;             // <--------- What we need!!
     //...
     ULONG   MmLoadedUserImageList;
} KDDEBUGGER_DATA32, *PKDDEBUGGER_DATA32;



三.     几种进程检测方法的对比
-----------------------------------------------------
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;

__declspec(dllimport)   ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

嗯,ssdt,hook掉ZwQuerySystemInformation。网上代码多如牛毛,就不多浪费时间现眼了。
if(0 == memcmp(SystemProcesses->ProcessName.Buffer, L"services.exe", 24))
把services.exe藏起来吧...



2.枚举进程,用户态下最多的(包括taskmgr)就是ZwQuerySystemInformation了。
真是哪壶不开提哪壶啊,哈哈...

     ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, pBuffer,
                         cbBuffer, NULL);
  
     PSYSTEM_PROCESS_INFORMATION pInfo =
         (PSYSTEM_PROCESS_INFORMATION)pBuffer;
  
     for (;;)
     {
         printf("ProcessID: %d (%ls)/n", pInfo->ProcessId,
             pInfo->ProcessName.Buffer);
      
         if (pInfo->NextEntryDelta == 0)
             break;
  
         pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)
             + pInfo->NextEntryDelta);
     }

分析结果:
================================================
ProcessID: 0 ((null))
ProcessID: 4 (System)
ProcessID: 312 (smss.exe)
ProcessID: 404 (csrss.exe)
ProcessID: 428 (winlogon.exe)
ProcessID: 492 (lsass.exe)
ProcessID: 636 (svchost.exe)
ProcessID: 704 (svchost.exe)
ProcessID: 740 (svchost.exe)
ProcessID: 780 (svchost.exe)
ProcessID: 1004 (explorer.exe)
ProcessID: 1024 (vmsrvc.exe)
ProcessID: 1152 (vpcmap.exe)
ProcessID: 1320 (vmusrvc.exe)
ProcessID: 1512 (svchost.exe)
ProcessID: 1816 (InstDrv.exe)
ProcessID: 1836 (notepad.exe)
ProcessID: 1848 (calc.exe)
ProcessID: 200 (dv.exe)
ProcessID: 344 (InstDrv.exe)
ProcessID: 356 (enumprocsnt.exe)
==================================================
没有services.exe...



3.该我们的 get PspCidTable to ExEnumHandleTable 出马了。
为了方便,代码做了很多简略处理,EnumHandleCallback没帖出来,大致就是自己walk list,实际的代码中你可以充分利用
ExEnumHandleTable,

我写的代码只为演示PspCidTable,walk list就不繁琐的贴上来了。凑合着看吧 :-)

ULONG GetFunctionAddr(IN PCWSTR FunctionName)
{
     UNICODE_STRING UniCodeFunctionName;
     RtlInitUnicodeString( &UniCodeFunctionName, FunctionName );
         return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName );
}



NTSTATUS
DriverEntry( IN PDRIVER_OBJECT   DriverObject,
     IN PUNICODE_STRING RegistryPath )
{
     HANDLE h;  

     DbgPrint("DriverEntry Loading.../n");
     DriverObject->DriverUnload = DriverUnload;  
  
     ExEnumHandleTable = (EXENUMHANDLETABLE)GetFunctionAddr(L"ExEnumHandleTable");
     if ( ExEnumHandleTable == NULL )
         {
         DbgPrint("Get ExEnumHandleTable Addr Error!!");
         return STATUS_DEVICE_CONFIGURATION_ERROR;
     }
     DbgPrint("Address of ExEnumHandleTable:%x/n",ExEnumHandleTable);

     GetPspCidTable();
     DbgPrint("CidTable:%x/n",pPspCidTable);
  
     if (!ExEnumHandleTable(pPspCidTable, EnumHandleCallback, NULL, &h ))
     {
         DbgPrint( "HandleTable Found: %lx./n", h );
     }
     else
     {
         DbgPrint( "HandleTable not found./n");
     }      
  
     return STATUS_SUCCESS;
}


分析结果:
==================================================
Address of ExEnumHandleTable:805a4274
CidTable:e10018c8
PID:   0 NAME: Idle
PID:   4 NAME: System
PID: 200 NAME: dv.exe        
PID: 312 NAME: smss.exe      
PID: 344 NAME: InstDrv.exe  
PID: 356 NAME: enumprocsnt.exe
PID: 404 NAME: csrss.exe    
PID: 428 NAME: winlogon.exe  
PID: 480 NAME: services.exe  
PID: 492 NAME: lsass.exe    
PID: 636 NAME: svchost.exe  
PID: 704 NAME: svchost.exe  
PID: 740 NAME: svchost.exe  
PID: 780 NAME: svchost.exe  
PID:1004 NAME: explorer.exe  
PID:1024 NAME: vmsrvc.exe    
PID:1152 NAME: vpcmap.exe    
PID:1320 NAME: vmusrvc.exe  
PID:1512 NAME: svchost.exe  
PID:1816 NAME: InstDrv.exe  
PID:1836 NAME: notepad.exe  
PID:1848 NAME: calc.exe      
Handle Found: bb40.
=====================================================
看起来蛮强大,连死进程也能读出来...   :-)



4.ring3下的间接pspCidTable,看代码:

void main()
{  
     for (int i=0;i<=65535;i+=4)     //实际上,取到0x4e1c就够了
     {
         if(OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,i)!= 0)
         {
             printf("ProcessID: %d/n",i);
             CloseHandle(&i);
         }
     }  
  
     getchar();  
}

很猥琐的代码,哈哈...
想得到更多信息,自己#include "psapi.h",把lib库link上去,然后:
EnumProcessModules,GetModuleFileNameEx,GetProcessImageFileName等等吧...
至于想比较出哪些是隐藏进程或者恶意进程,EnumProcesses或者CreateToolhelp32Snapshot,
得到用户态下的一张表对比就知道了。


分析结果:
=============================================
ProcessID: 4
ProcessID: 200
ProcessID: 312
ProcessID: 344
ProcessID: 356
ProcessID: 428
ProcessID: 480
ProcessID: 492
ProcessID: 636
ProcessID: 740
ProcessID: 852
ProcessID: 1004
ProcessID: 1024
ProcessID: 1152
ProcessID: 1320
ProcessID: 1836
ProcessID: 1848
==============================================
ProcessID: 480,嗯,是services.exe...

其实原理很简单,OpenProcess->NtOpenProcess->PsLookupProcessByProcessId,
反汇编PsLookupProcessByProcessId,有这样一段代码:
mov     eax, large fs:124h
push     [ebp+ProcessId]
mov     esi, eax
dec     dword ptr [esi+0D4h]
push     PspCidTable
call     ExMapHandleToPointer

还原出来是这样的:
PHANDLE_TABLE_ENTRY CidEntry;
CidEntry = ExMapHandleToPointer(PspCidTable, ProcessId);

像PsLookupProcessThreadByCid,PspExitThread,PspCreateThread等也有类似的代码,
但是由于入函数太深,查找不方便。

-----------------------------------
综合起来看,pspCidTable枚举进程还是很成功的,一般的进程隐藏技术都过不了它。 :-)



四.     anti-pspCidTable技术及其他
-----------------------------------------------------

写这篇的原因仅仅是先前有人在maillist上问起,这个技术并不神秘,想anti它很简单,抹掉pspCidTable就行了,
扫描内存得到pspCidTable,然后对应EPROCESS进行分析,找到要隐藏的进程,将相关信息置成0,安放一个进程notify routine。
其他检测技术,比如用activelist,handletable,handletablelisthead获得进程表,
挂钩KiSwapContext,KiService,CreateProcessNotifyRoutine等等...
隐藏进程的方法多种多样,也有很多高深的技术,未公开的技术,谁叫RK和ARK技术总是相生相克的呢...
:-)
本文章转自http://hi.baidu.com/gz1x/blog/item/d99aeefa4d1c92ddb48f31b9.html
x64驱动 遍历 PspCidTable 枚举隐进程和线程 介绍 PspCidTable 是一个内核句柄表,存放进程和线程的内核对象(EPROCESS 和 ETHREAD),并通过 PID 和 TID 进行索引(所以进程ID和线程ID不可能相同),ID 号以 4 递增。 获取 PspCidTable 地址 win7: PsLookupProcessByProcessId(被导出) -> PspCidTable win10: PsLookupProcessByProcessId(被导出) -> PspReferenceCidTableEntry -&g 阅读详情

相关推荐

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

weixin_42830015的博客 3981

26.全局句柄表PspCidTable

https://www.cnblogs.com/kuangke/p/5761615.html

qq_35129925的博客 1056

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2064

6.5 Windows驱动开发:内核枚举PspCidTable句柄表

在 Windows 操作系统内核中,PspCidTable 通常是与进程(Process)管理相关的数据结构之一。它与进程的标识和管理有关,每个进程都有一个唯一的标识符,称为进程 ID(PID)。与之相关的是客户端 ID,它是一个结构,其中包含唯一标识进程的信息。这样的标识符在进程管理、线程管理和内核对象的创建等方面都起到关键作用。

微软技术分享 5450

【tips】在PyCharm中安装opencv图文版详细教程

pip如下图所示,左边的蓝色图标就是终端。点开终端后,键入命令,按下回车后就开始下载了。如果你更喜欢图形化操作,可以在 PyCharm 中直接安装:。点击右上角的 +按钮(添加包)。搜索或,点击。

zhousanguhe的博客 6740

大模型性能压测全指南:从指标到实战

本文系统阐述大模型(LLM/多模态)私有化部署性能压测方案,涵盖核心指标(TTFT、TPOT、吞吐、并发、资源占用、错误率)、四类典型压测场景及工具选型(Locust、vLLM benchmark等)。强调环境隔离、参数固定与长尾延迟分析,提出瓶颈定位思路与标准化报告模板,结合伪代码示例实现流式接口精准打点,确保测试结果真实可信,助力优化模型服务稳定性与性能。

SmallBull的博客 53

PspCidTable攻与防

PspCidTable的攻与防,其实就是进程隐藏与检测所涉及到的一部分工作~~ 不管基于PspCidTable的进线程检测,还是抹PspCidTable进行进程对象的隐藏,都涉及到对PspCidTable的遍历. 所以如何安全正确地遍历PspCidTable才是该技术的关键 一、获取PspCidTable的地址 常用的方法是从前面提到的三个查询PspCidTable的函数中特征搜索. PsLook...

xlaomlng的博客 1122

linux mmap系统调用

brk/mmap linux 提供了两个比较重要的系统调用brk 和mmap,用于向内核申请相应用户空间,内核会根据系统运行状态判定是否申请新的VMA来管理新申请的用户空间,brk和mmap在整个系统中都占有非常重要的地位。 brk()系统调用被gblic进行了进一步封装成malloc接口,用户层程序一般都是通过调用malloc,由glibc间接调用brk来向内核申请用户空间。brk申请的用户空间属于堆空间 mmap系统调用也可以向内核申请用户空间,不过与brk不同的师,mmap申请的空间属于mma.

weixin_42730667的博客 1275

x64通过PspCidTable遍历进程

PspCidTable可以在PsLookupProcessByProcessId下寻找 我这硬编码了 只适用于win7 x64 其它版本需要自己改下特征码 #include extern "C" NTKERNELAPI PVOID NTAPI ObGetObjectType( IN PVOID pObject ); extern "C" N

zhuhuibeishadiao 3023

AI自瞄原理剖析(一)屏幕内容循环截取及代码实现

尽管Yolo框架在推理时其实是可以输入不同大小的图片的,但这些作者大多不会去处理图像尺寸的改变,所以目前大部分开源源码主要是以输入320或者640尺寸的图像为主。只要截图的效率足够快,能够满足一秒采集60张图片,也就是稳定的截图速度达到60帧以上,那么就可以实现内存级别的AI锁死自瞄效果。这里强调了截图速度对于最终实现特定自瞄效果的重要性,只有达到这样的速度标准,才能让整个自瞄相关的功能在内存层面有效地运作起来。在实现自瞄功能的情境下,只需要以游戏准星为中心向外的正方形区域图像就够了,没必要进行全屏截取。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1095

【图像去噪】基于加权核范数最小化算法实现图像去噪附matlab代码

1 简介 WNNM是一种约束矩阵奇异值稀疏性的低秩算法,在NNM理论基础上增加了核范数权重,有效利用了自然图像的先验信息并提高了核范数的灵活性. 2 部分代码 ​clcclear allclose allnSig = 100;O_Img = double(imread('Monarch.png'));​randn('seed', 0);N_Img = O_Img + nSig* randn(size(O_Img)); ..

qq_59747472的博客 3114

PspCidTable概述

原文发表于百度空间,2009-03-28 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进线程对象,其索引就是PID和TID 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER) 3...

xlaomlng的博客 739

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

关于PspCidTable

PspCidTable为一个全局变量,其格式与普通的句柄表是完全一样的. 但它与每个进程私有的句柄表有以下不同:  1.PspCidTable中存放的对象是系统中所有的进线程对象指针,其索引就是PID和CID  2.PspCidTable中存放是对象体(指向EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER)  3.PspCidTable

zfdyq 1014

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

进程与线程(九)PspCidTable怎么这样啊?

PS:很老的东西,想看原理的话 ,我是看着两个明白原理的 1.基于pspCidTable的进程检测技术 2.pspcidtable完全解读 xp sp3 当pid到4088时开始填充空缺,尽量不开第三层表(2层表4096),但当我开了300多个进程以后,终于开了 kd> dd pspcidtable 805649c0  e1000c80 00000002 00000002 000

Returns' Station 676

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

PspCidTable

PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每 个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进线程对象,其索引就是PID和TID 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头 (OBJECT_HEADER) 3.PspCidTable是一个独

qiaoli的知识备忘录 2210

x64 PspCidTable 枚举进程/ 线程

x64 PspCidTable 枚举进程/ 线程![win10 测试效果图](https://img-blog.csdnimg.cn/2020081521295066.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXNodWppZTE=,size_16,color_FFFFFF,t_70#pic_cent...

liushujie1的博客 1024

pspcidtable

第8个男人" 的code里面就做的很好,找到PspCidTable后自己搜索所有的进程对象就行了://----------------------------------------------------------------------VOID IsValidProcess ()/*++Author : 第8个男人Leaner : sudami [xiao_rui_119@163.com]T

yaneng的专栏 1335

PspCidTable 完全解读

PspCidTable 完全解读 by sysdog 2009.5.1 Whu ------------------------------------------------------------------------------- 一、句柄 句柄:HADNLE 在winnt.h 定义如下: typedef void *HANDLE; 是一个 32 位无类型指针,充当内

whatday的专栏 3380

PspCidTable综合概述

PspCidTable概述 2009-03-28 11:27 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每 个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进线程对象,其索引就是PID和TID 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有...

weixin_34390996的博客 323

在Win7 x64通过PspCidTable枚举进程

PspCidTable存放着一个结构为_HANDLE_TABLE的指针,_HANDLE_TABLE结构记录句柄表的相关信息,句柄表存放着所有进程和线程的对象,其索引就是PID和TID,在WinDbg看一下相关的结构。我们遍历进程对象需要关注两个成员,第一个是TableCode,第二个是NextHandleNeedingPool。TableCode:该成员记录表级和表地址,低2位记录着表的级数,掩掉...

qq269813279的博客 2296

PspCidTable进程枚举

-------------------------------------这是分割线--------------------------------------- Windows句柄表格式 句柄是Windows对象管理中引入的一个东西,它的实际意义是对象在句柄表中的索引。Windows2000使用的是固定的三层句柄表,而WindowsXP和Windows2003都是使用的动态可扩展的

rongwenbin的专栏 1681
上一篇: WinDBG双机调试配置
下一篇: 处理webbrowser2控件浏览网页时发生的当前页脚本错误
cmdhack
博客等级 码龄19年 20粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值