频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

简单驱动编写与windbg调试(3)

作者: 诚信网安--小麒麟 出处:51CTO.com 2008-03-07 14:06    砖    好    评论   进入论坛
阅读提示:随着对windows系统的深入研究,越来越多的内核方面的知识被挖掘出来了,今天我们讨论下如何写一个简单的驱动,并使用现在比较新的windbg调试器进行调试。首先写驱动要对驱动有一个比较全面的认识。
这里我们先定义一个控制码

#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)

这里我们使用他来和应用程序通讯,Irp->AssociatedIrp.SystemBuffer这个结构中存放用户模式程序发送给驱动程序的数据。这里使用METHOD_BUFFERED方式时,I/O管理器创建一个足够大的内核模式拷贝缓冲区(与用户模式输入和输出缓冲区中最大的容量相同)。当派遣例程获得控制时,用户模式的输入数据被复制到这个拷贝缓冲区。在IRP完成之前,你应该向拷贝缓冲区填入需要发往应用程序的输出数据。当IRP完成时,你应该设置IoStatus.Information域等于放入拷贝缓冲区中的输出字节数。然后I/O管理器把数据复制到用户模式缓冲区并设置反馈变量

NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS ntStatus;
PIO_STACK_LOCATION IrpStack;
ULONG IoControlCode;
ULONG inSize;
ULONG outSize;
ULONG *buff;
IrpStack=IoGetCurrentIrpStackLocation(Irp);
IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
switch(IoControlCode)
{
case IOCTL_PROTECT_CONTROL:
inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
buff = (ULONG*)Irp->AssociatedIrp.SystemBuffer ;
pid=*buff;  //获得要影藏进程的ID
strcpy(Irp->UserBuffer,"Driver Start");
break;
default:
break;
}
ntStatus=Irp->IoStatus.Status;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return ntStatus;
}

要保护一个进程只用在调用ZwOpenProcess时返回一个STATUS_ACCESS_DENIED就可以了,相关的代码如下

NTSTATUS NewZwOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
)
{
NTSTATUS ntStatus;
if(pid==(ULONG)ClientId->UniqueProcess)
{
DbgPrint("保护进程 PID :%d \n",pid);
return STATUS_ACCESS_DENIED;
}
ntStatus=OldZwOpenProcess(
 ProcessHandle,
 DesiredAccess,
 ObjectAttributes,
 ClientId 
);
return STATUS_SUCCESS;
}

这里我们要先定义相关宏:

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
    unsigned int *ServiceTableBase;
    unsigned int *ServiceCounterTableBase; //Used only in checked build
    unsigned int NumberOfServices;
    unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
#pragma pack()

extern ServiceDescriptorTableEntry KeServiceDescriptorTable; 
#define SYSTEMSERVICE(_function)KeServiceDescriptorTable.ServiceTableBase
[*(PUCHAR)((PUCHAR)_function+1)]

这里通过windbg反汇编可以看出
lkd> u ZwOpenProcess
nt!ZwOpenProcess:
804e6044 b87a000000      mov     eax,7Ah
804e6049 8d542404        lea     edx,[esp+4]
804e604d 9c              pushfd
804e604e 6a08            push    8
804e6050 e8dc150000      call    nt!KiSystemService (804e7631)
804e6055 c21000          ret     10h
nt!ZwOpenProcessToken:
804e6058 b87b000000      mov     eax,7Bh
804e605d 8d542404        lea     edx,[esp+4]
eax后的7Ah就是索引号,便有了宏定义。

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
typedef NTSTATUS (*ZWOPENPROCESS)(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
ZWOPENPROCESS OldZwOpenProcess;
/////////////////////////////////////////////////////////////////////

NTSTATUS NewZwOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
在DriverEntry中对CR0进行修改然后修改 SSDT表。
_asm
    {
        CLI                  
        MOV    EAX, CR0       
        AND EAX, NOT 10000H 
        MOV    CR0, EAX       
    }

OldZwOpenProcess = (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) ;

(ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess;
_asm
{

MOV    EAX, CR0        
OR    EAX, 10000H          
MOV    CR0, EAX            
STI                   
}


共6页: 上一页 [1] [2] 3 [4] [5] [6] 下一页
【内容导航】
 第 1 页:驱动编写(1)  第 2 页:驱动编写(2)
 第 3 页:驱动编写(3)  第 4 页:驱动编写(4)
 第 5 页:驱动调试(1)  第 6 页:驱动调试(2)
专题
安全防范与策略
网络技术经典基础教程
CISSP认证成长之路
国内安全厂商新排名出炉 谁是你心中的第一
冷眼旁观2007年半年安全报告
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。