通过读取KiWaitInListHead列出隐藏的进程

转载 2006年06月13日 15:50:00

通过读取KiWaitInListHead列出隐藏的进程
/*
有些ROOTKIT通过更改PsActiveProcess链表或相关Native API来隐藏进程.下面这个程序通过直接读取
KiWaitInListHead和KiWaitOutListHead(windows的dispatcher所使用的内核链表),来列出隐藏的进程.
技术细节请参照Jan K. Rutkowski的原文
http://www.blackhat.com/presentations/bh-usa-03/bh-us-03-rutkowski/rutkowski-antirootkit.zip.
原文的示范代码使用驱动来实现,这里使用了/Device/PhysicalMemory.代码很乱,勉强可以工作.这里感谢pjf的代码.
如果有错误的地方请斧正,如果你有更好的idea,与我分享?谢谢!
*/

 

/* code token from Jan K. Rutkowski(jkrutkowski<a>elka.pw.edu.pl) */
/* and pjf (jfpan20000@sina.com)s article */
/* compile under cygwin> gcc -o kps kps.c -I/usr/include/w32api/ddk -lntdll -lntoskrnl */
/* see Jan K. Rutkowskis article for more info. */

/* This tool will list all the procs include those hiden by some rootkit. 2003/10, fantas1a*/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ntddk.h>

typedef struct _KLISTER_PROCINFO {
int pid;
char name [18];
} KLISTER_PROCINFO, *PKLISTER_PROCINFO;

PLIST_ENTRY pKiWaitInListHead ;
PLIST_ENTRY pKiWaitOutListHead ;
PLIST_ENTRY pKiDispatcherReadyListHead ;
#define WAITLIST_OFFSET 0x5c // in _KTHREAD

PVOID g_pMapPhysicalMemory = NULL;
HANDLE g_hMPM = NULL;

#define MAX_PROCS 1000
KLISTER_PROCINFO procs[MAX_PROCS];
int nprocs = 0;

PVOID LinearToPhys(PULONG BaseAddress,PVOID addr)
{
ULONG VAddr=(ULONG)addr,PGDE,PTE,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, 4, 0, PGDE & 0xfffff000, 0x1000);
PTE=((PULONG)PGDE)[(VAddr&0x003FF000)>>12];
if ((PTE&1)!=0)
{
PAddr=(PTE&0xFFFFF000)+(VAddr&0x00000FFF);
UnmapViewOfFile((PVOID)PGDE);
}
else {
//fprintf(stderr, "LinearToPhys return 0, page not in/r/n");
return 0;
}
}
} else {
//fprintf(stderr, "LinearToPhys return 0, page table not in/r/n");
return 0;
}
//fprintf(stderr, "LinearToPhys return %08x/r/n", PAddr);
return (PVOID)PAddr;
}

ULONG GetData(PVOID addr)
{
ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);
if(phys==0) return 0;
PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, 4, 0, phys & 0xfffff000, 0x1000);
if (tmp==0) {
exit(-1);
}
ULONG ret=tmp[(phys & 0xFFF)>>2];
UnmapViewOfFile(tmp);
return ret;
}

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,&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;
}

void insertProc (int pid, char* name) {
int i;

for (i = 0; i < nprocs; i++)
if (procs.pid == pid) return;

procs [nprocs].pid = pid;
strncpy (procs [nprocs].name, name, 16);
//fprintf(stderr, "%d %s/r/n", pid, name);
nprocs++;

}

PEPROCESS processObject (PETHREAD ethread) {
ULONG p;
p = (ULONG) ethread;
//(PEPROCESS)(ethread->Tcb.ApcState.Process);
p = GetData((PVOID)(p+0x0+0x34+0x10));
return (PEPROCESS)(p);
}

char* processName (PEPROCESS eprocess, char *buf) {
//&eprocess->ImageFileName[0]
ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)((ULONG)eprocess+0x01fc));
if(phys==0) return 0;
PUCHAR tmp=(PUCHAR)MapViewOfFile(g_hMPM, 4, 0, phys & 0xfffff000, 0x1000);
if (tmp==0) {
return 0;
}
strncpy(buf, &tmp[(phys & 0xFFF)], 16);
UnmapViewOfFile(tmp);

return buf;
}

void listProc()
{
int i;
printf("---- %d process ----/r/n", nprocs);
for(i=0; i<nprocs; i++) {
printf("[+]% 4d %s/r/n", procs.pid, procs.name);
}
}void createProcList () {
int i, j;
char buf1[18];
PVOID obj, p, q, tmp;
PETHREAD pethread=NULL;
ULONG pid;
char *pn;
//fprintf(stderr, "pKiWaitInListHead/r/n");
for (obj = (PVOID)GetData(pKiWaitInListHead);
obj && (obj != pKiWaitInListHead); obj = (PVOID)GetData(obj)) {
pethread = (PETHREAD) (GetData((PVOID)obj) - WAITLIST_OFFSET);
p = processObject(pethread);
pid = GetData((PVOID)((ULONG)pethread + 0x01e0)); //pethread->Cid.UniqueProcess
if(pid==0) {
//fprintf(stderr, "pid is 0/r/n");
break;
}
pn = processName(p, buf1);
if(pn==0) break;
insertProc( pid, pn );
}
//fprintf(stderr, "pKiWaitOutListHead/r/n");
for (obj = (PVOID)GetData(pKiWaitOutListHead);
obj && (obj != pKiWaitOutListHead); obj = (PVOID)GetData(obj)) {
pethread = (PETHREAD) (GetData((PVOID)obj) - WAITLIST_OFFSET);
p = processObject(pethread);
pid = GetData((PVOID)((ULONG)pethread + 0x01e0));
if(pid==0) {
//fprintf(stderr, "pid is 0/r/n");
break;
}
pn = processName(p, buf1);
if(pn==0) break;
insertProc( pid, pn );
}
/*
fprintf(stderr, "pKiDispatcherReadyListHead/r/n");
for (i = 0; i < 32; i++)
for (obj = (PVOID)GetData((PVOID)(&pKiDispatcherReadyListHead));
obj && (obj != &pKiDispatcherReadyListHead);
obj = (PVOID)GetData(obj)) {
pethread = (PETHREAD) (GetData((PVOID)obj) - WAITLIST_OFFSET);
p = processObject(pethread);
pid = GetData((PVOID)((ULONG)pethread + 0x01e0));
if(pid==0) {
fprintf(stderr, "pid is 0/r/n");
break;
}
pn = processName(p, buf1);
if(pn==0) break;
insertProc( pid, pn );

}
*/
}

int main(int argc, char **argv) {

if (OpenPhysicalMemory()==0)
{
printf("OpenPhysicalMemory failed/r/n");
return -1;
}
pKiWaitInListHead = (PLIST_ENTRY) 0x80482258; //under win2k + sp4en
pKiWaitOutListHead = (PLIST_ENTRY) 0x80482808;
pKiDispatcherReadyListHead = (PLIST_ENTRY) 0x804822e0;
//fprintf(stderr, "0x%08x, 0x%08x/r/n", (ULONG)pKiWaitInListHead, (ULONG)pKiWaitOutListHead);

createProcList();
listProc();
UnmapViewOfFile(g_pMapPhysicalMemory);
CloseHandle(g_hMPM);

return(0);
}

from: http://th3ee.blogchina.com/271213.html 

通过读取KiWaitInListHead列出隐藏的进程

/*有些ROOTKIT通过更改PsActiveProcess链表或相关Native API来隐藏进程.下面这个程序通过直接读取KiWaitInListHead和KiWaitOutListHead(wi...
  • sunwear
  • sunwear
  • 2005年02月15日 01:29
  • 1953

使用APIHOOK实现进程隐藏

今天翻出一些今年前写的代码。其中一个是09年,我帮一个读研的同学写的一个“无公害恶意”程序。大致要求就是要实现自启动和自我隐藏。我使用的都是些简单的技术,只是实现自我隐藏稍微让我花费了点时间写算法。其...
  • breaksoftware
  • breaksoftware
  • 2011年12月27日 18:57
  • 5097

Linux内核通过inline hook实现隐藏进程

这是我们操作系统的大作业。 原理就是inline hook 那个 proc 文件系统,根目录下的 readdir 的函数。 替换掉第三个参数,filldir。 代码爆短,60来行。 Ubunt...
  • zwj0403
  • zwj0403
  • 2012年12月17日 10:49
  • 1322

如何在Windows平台下实现进程隐藏

unit Unit1;interfaceuses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,...
  • yhlaser
  • yhlaser
  • 2008年01月18日 14:37
  • 373

[原创]一个简单的windows HOOK - 隐藏进程管理器中特定的进程

一个简单的windows HOOK - 隐藏进程管理器中特定的进程 (适用平台:windows 2000 sp4,windows XP sp2)         屏蔽任务管理器中的进程名称有很多种方法...
  • mydo
  • mydo
  • 2007年09月07日 15:36
  • 3404

Linux 列出所有正在运行的进程

ps命令 输入下面的ps命令,显示所有运行中的进程: # ps aux | less 其中, -A:显示所有进程 a:显示终端中包括其它用户的所有进程 x:显示无控制终端的进程 ...
  • mengyafei43
  • mengyafei43
  • 2014年05月22日 17:47
  • 5624

C#程序怎么操作某个进程的窗体显示隐藏

Intptr intptr=Process. GetProcessesByName("name").Handle; ShowWindow(intptr,0); ShowWindow(intptr,...
  • wwm402654282
  • wwm402654282
  • 2013年04月10日 11:19
  • 1250

用CreateToolHelp32Snapshot 查看进程及其模块列表(delphi xe2)

原文出处:http://blog.csdn.net/htiscold/article/details/3962817     在delphi xe2下调试运行成功。   代码:   un...
  • bq_cui
  • bq_cui
  • 2011年11月13日 21:00
  • 1348

进程隐藏学习总结

怎么隐藏进程 工具/原料 HideToolz 步骤/方法 1 在百度上面搜索HideToolz ,打开第一个搜索结果,点击进入下载。把HideToolz 下载到你的电脑里面。 2 鼠标双击打开...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年05月08日 15:11
  • 1467

C# windows API 隐藏窗体

void huode()         {                        while (true)             {                     ...
  • Bychentufeiyang
  • Bychentufeiyang
  • 2012年03月05日 12:54
  • 1342
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过读取KiWaitInListHead列出隐藏的进程
举报原因:
原因补充:

(最多只允许输入30个字)