如何列出隐藏的进程?_VC/MFC_编程问答

如何列出隐藏的进程?

来源:互联网  时间:2016/8/19 7:12:48

关于网友提出的“ 如何列出隐藏的进程?”问题疑问,本网通过在网上对“ 如何列出隐藏的进程?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 如何列出隐藏的进程?
描述:

HANDLEhSnapShot;
PROCESSENTRY32procEntry;
memset(&procEntry, 0, sizeof(procEntry));
procEntry.dwSize = sizeof(procEntry);
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hSnapShot != (HANDLE)(-1))
{
if (Process32First(hSnapShot, &procEntry))
{
CString strPath ="";
do
{
CString strProcName=procEntry.szExeFile;
MessageBox(strProcName);
}while(Process32Next(hSnapShot, &procEntry));
}
CloseHandle(hSnapShot);
}
MessageBox("finished.");
结果没有隐藏的进程,而icesword工具可以看到。
如何列出隐藏的进程?


解决方案1:

以下是icesword早期版本使用的方法,但是对付现在部分木马还要配合线程环境切换考虑
注意每个系统都不一样,且还要考虑sp,win2000和xp以后的变化比较大,这个工作其实在vista上就可以不用考虑了,保护的太严密了还有那个UAC
Win2k Build 2195 中 EPROCESS 偏移+128 处的 struct HANDLE_TABLE *ObjectTable ,就是指向该进程 HANDLE_TABLE 结构的指针。通过一个进程的 HANDLE_TABLE 结构,我们可以找到这个进程打开的所有对象。我们在程序中获得的各种句柄,就是对象在句柄表中的索引。例如,在程序中打开文件,获得的是一个句柄(HANDLE)。接下来通过这个句柄来对这个文件进行操作。句柄是该文件对象在句柄表中的索引,通过句柄,就可以在句柄表中找到相应的文件对象的指针。就可以对该文件对象进行相应的操作。
    通过 EPROCESS 的 +128 struct HANDLE_TABLE *ObjectTable 我们可以找到一个进程的 HANDLE_TABLE 结构,通过 HANDLE_TABLE 结构的 +08 struct _HANDLE_TABLE_ENTRY ***Table 我们可以找到这个进程的句柄表。这个表中放着进程的所有对象的指针。句柄表分三层,最上层表是一个大小为1KB的数组,共有256个元素,每个元素4个字节长,每个元素是一个指向中层表的指针。中层表也是一个大小为1KB的数组,共有256个元素,每个元素4个字节长,每个元素是一个指向下层表的指针。下层表是一个 HANDLE_TABLE_ENTRY 数组,整个数组大小为2KB,共有256个元素,每个元素8个字节长,是一个 HANDLE_TABLE_ENTRY ,HANDLE_TABLE_ENTRY 中保存着指向对象的指针。一个进程有一个上层表,一个上层表最多可以有256个中层表。每个中层表最多可以有256个下层表。每个下层表最多可以有256个对象的指针。 
    一个句柄被分为三部分,分别做这三个表中的索引,最低10bit(bits0-9)的值乘以2,就得到了在下层表中的偏移。bits10-17这8bit,为中层表的索引,乘以4得到在中层表中的偏移。bits18-25这8bit,为高层表的索引,乘以4得到在高层表中的偏移。
    对于一个句柄,我们最后可以在一个下层表中找到对应的 HANDLE_TABLE_ENTRY。HANDLE_TABLE_ENTRY 大小为 8 个字节,由2个32bit组成。如果第一个32bit值不为0,那么第一个32bit就可以转换成一个指向对象头的指针。由于对象头总是32bit对齐的,所以一个对象头的指针的低3bit总是0。所以 HANDLE_TABLE_ENTRY 第一个32bit 的低3bit,被用作标志。由于所有的对象都在系统地址空间(0x80000000-0xFFFFFFFF)中,所以一个对象头的指针的最高位总是1。所以 HANDLE_TABLE_ENTRY 第一个32bit 的最高位也被用作标志。当我们把一个
HANDLE_TABLE_ENTRY 第一个32bit 转换成对象头的指针时,需要把低3bit设为0,最高位设为1。对象指针总是指的对象体的指针,由于对象头在对象体之前,大小为0x18字节,所以对象指针等于对象头指针加0x18。
HANDLE_TABLE 结构在 Win2k Build 2195 中定义如下
kd> !strct HANDLE_TABLE
!strct HANDLE_TABLE
struct _HANDLE_TABLE (sizeof=108)
+00 uint32 Flags
+04 int32 HandleCount
+08 struct _HANDLE_TABLE_ENTRY ***Table
+0c struct _EPROCESS *QuotaProcess
+10 void *UniqueProcessId
+14 int32 FirstFreeTableEntry
+18 int32 NextIndexNeedingPool
+1c struct _ERESOURCE HandleTableLock
+1c struct _LIST_ENTRY SystemResourcesList
+1c struct _LIST_ENTRY *Flink
+20 struct _LIST_ENTRY *Blink
+24 struct _OWNER_ENTRY *OwnerTable
+28 int16 ActiveCount
+2a uint16 Flag
+2c struct _KSEMAPHORE *SharedWaiters
+30 struct _KEVENT *ExclusiveWaiters
+34 struct _OWNER_ENTRY OwnerThreads[2]
uint32 OwnerThread
int32 OwnerCount
uint32 TableSize
+44 uint32 ContentionCount
+48 uint16 NumberOfSharedWaiters
+4a uint16 NumberOfExclusiveWaiters
+4c void *Address
+4c uint32 CreatorBackTraceIndex
+50 uint32 SpinLock
+54 struct _LIST_ENTRY HandleTableList
+54 struct _LIST_ENTRY *Flink
+58 struct _LIST_ENTRY *Blink
+5c struct _KEVENT HandleContentionEvent
+5c struct _DISPATCHER_HEADER Header
+5c byte Type
+5d byte Absolute
+5e byte Size
+5f byte Inserted
+60 int32 SignalState
+64 struct _LIST_ENTRY WaitListHead
+64 struct _LIST_ENTRY *Flink
+68 struct _LIST_ENTRY *Blink
kd> !strct HANDLE_TABLE_ENTRY
!strct HANDLE_TABLE_ENTRY
struct _HANDLE_TABLE_ENTRY (sizeof=8)
+0 void *Object
+0 uint32 ObAttributes
+4 uint32 GrantedAccess
+4 uint16 GrantedAccessIndex
+6 uint16 CreatorBackTraceIndex
+4 int32 NextFreeTableEntry
下面我们使用 kd 来进行说明
kd> !process 0 0
!process 0 0
**** NT ACTIVE PROCESS DUMP ****
...
PROCESS 82592ae0 SessionId: 0 Cid: 0254 Peb: 7ffdf000 ParentCid: 0240
DirBase: 02611000 ObjectTable: 824e08e8 TableSize: 31.
Image: internat.exe
...
// 我们就以进程 internat.exe 为例,注意 ObjectTable: 824e08e8 TableSize: 31
// 使用 !handle 命令,查看 PID为254 的进程的句柄表中的对象
kd> !handle 0 3 254
!handle 0 3 254
processor number 0
Searching for Process with Cid == 254
PROCESS 82592ae0 SessionId: 0 Cid: 0254 Peb: 7ffdf000 ParentCid: 0240
DirBase: 02611000 ObjectTable: 824e08e8 TableSize: 31.
Image: internat.exe
Handle Table at e3073000 with 31 Entries in use
0004: Object: e13d7c10 GrantedAccess: 000f001f
Object: e13d7c10 Type: (8141b760) Section
ObjectHeader: e13d7bf8
HandleCount: 1 PointerCount: 1
0008: Object: 8236a400 GrantedAccess: 00100003
Object: 8236a400 Type: (8141e460) Event
ObjectHeader: 8236a3e8
HandleCount: 1 PointerCount: 1
...
0044: Object: e139af20 GrantedAccess: 000f003f
Object: e139af20 Type: (8141b0c0) Key
ObjectHeader: e139af08
HandleCount: 1 PointerCount: 1
Directory Object: 00000000 Name: REGISTRYMACHINE
进程句柄为 0044 的对象,下面我们将自己通过句柄表找到句柄为44的对象
记住对象的名字 Name: REGISTRYMACHINE 
...

上一篇关于消息发送(我只有这么多分了,麻烦各位帮忙)
下一篇DLL中导出类的头文件又包含了别的头文件怎么办??请高手指教!!
明星图片
相关文章
《 如何列出隐藏的进程?》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)