函数集合.docx
《函数集合.docx》由会员分享,可在线阅读,更多相关《函数集合.docx(23页珍藏版)》请在冰点文库上搜索。
函数集合
RtlInitUnicodeString(&Old_NtOpenProcess,L"NtOpenProcess");//初始化字串,NtOpenProcess函数可以直接导出,并不是所有函数都可以导出
Old_Addr=(ULONG)MmGetSystemRoutineAddress(&Old_NtOpenProcess);//取得NtOpenProcess的地址//MmGetSystemRoutineAddress函数是取得函数内核地址,参数只有一个是宽字符的字串指针,字串需要调用RtlInitUnicodeString函数初始化,
#include
//驱动程序入口函数格式申明
intDriverEntry(PDRIVER_OBJECTa,PUNICODE_STRINGb);//NTSTATUS_stdcall
//------------代码实现部分---------
//#pragmacode_seg("INIT")
NTSTATUSDriverEntry(//入口函数main
PDRIVER_OBJECTDriverObject,
PUNICODE_STRINGRegistryPath
)
{
//KdPrint(("我们的第一个驱动\n"));
//KdPrint是一个宏在Checked版中会用DbgPrint代替,在Free版中则不执行任何操作要用双括号
//DbgPrint("引导你开始驱动之旅*****\n");
//驱动载入时显示的信息Checked和Free版都会显示
returnNTSTATUS;
}
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject)//卸载函数已经前置声明
{
KdPrint(("驱动成功被卸载...OK-----------"));//需要这样一个宏相当于sprintf,printf
DbgPrint("卸载成功");//当然如果用这条语句就是单括号
}
////////////////////////////////////////////////////////////////////////////////////////
//_stdcall
#include
#defineINITCODEcode_seg("INIT")
#definePAGECODEcode_seg("PAGE")/*表示内存不足时,可以被置换到硬盘*/
#pragmaINITCODE/*指的代码运行后就从内存释放掉*/
NTSTATUSCreateMyDevice(INPDRIVER_OBJECTpDriverObject)
{
NTSTATUSstatus;
PDEVICE_OBJECTpDevObj;/*用来返回创建设备,结构已经详细说明
//创建设备名称
UNICODE_STRINGdevName;//内核设备名
UNICODE_STRINGsymLinkName;//用户层符号连接
RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为"\\Device\\yjxDDK_Device"L就是宽字符的意思
//创建设备
status=IoCreateDevice(pDriverObject,\//与入口函数相连接的指针
0,\//创建大小
&devName,\//驱动名称
FILE_DEVICE_UNKNOWN,\//设备设置为未知类型
0,TRUE,\//斜杠\是换行用的
&pDevObj);//连接符号
if(!
NT_SUCCESS(status))//大于0则表示成功,这里取非
{
if(status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足STATUS_INSUFFICIENT_RESOURCES"));
}
if(status==STATUS_OBJECT_NAME_EXISTS)
{
KdPrint(("指定对象名存在"));
}
if(status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("//对象名有冲突"));
}
KdPrint(("设备创建失败...++++++++"));
returnstatus;
}
KdPrint(("设备创建成功...++++++++"));
pDevObj->Flags|=DO_BUFFERED_IO;
//创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\?
?
\\yjx888");
status=IoCreateSymbolicLink(&symLinkName,&devName);//用户层与驱动层符号连接
if(!
NT_SUCCESS(status))/*status等于*/
{
IoDeleteDevice(pDevObj);//打算删除但是未成功
returnstatus;
}
returnSTATUS_SUCCESS;
}
#pragmaINITCODE
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject);//前置说明卸载例程
NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObject,PUNICODE_STRINGB)//TYPEDEFLONGNTSTATUS
{
KdPrint(("驱动成功被加载...OK++++++++"));
//jmp指令
CreateMyDevice(pDriverObject);
pDriverObject->DriverUnload=DDK_Unload;
return
(1);
}
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject)
{
KdPrint(("驱动成功被卸载...OK-----------"));//sprintf,printf
//删掉所有设备
DbgPrint("卸载成功");
}
///////////////////////////////////////////////////////////////////////
#include
#defineINITCODEcode_seg("INIT")
#definePAGECODEcode_seg("PAGE")/*表示内存不足时,可以被置换到硬盘*/
#pragmaINITCODE/*指的代码运行后就从内存释放掉*/
NTSTATUSCreateMyDevice(INPDRIVER_OBJECTpDriverObject)
{
NTSTATUSstatus;
PDEVICE_OBJECTpDevObj;/*用来返回创建设备*/
//创建设备名称
UNICODE_STRINGdevName;
UNICODE_STRINGsymLinkName;//
RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为"\\Device\\yjxDDK_Device"*/
//创建设备
status=IoCreateDevice(pDriverObject,\
0,\
&devName,\
FILE_DEVICE_UNKNOWN,\
0,TRUE,\
&pDevObj);
if(!
NT_SUCCESS(status))
{
if(status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足STATUS_INSUFFICIENT_RESOURCES"));
}
if(status==STATUS_OBJECT_NAME_EXISTS)
{
KdPrint(("指定对象名存在"));
}
if(status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("//对象名有冲突"));
}
KdPrint(("设备创建失败...++++++++"));
returnstatus;
}
KdPrint(("设备创建成功...++++++++"));
pDevObj->Flags|=DO_BUFFERED_IO;
//创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\?
?
\\yjx888");
status=IoCreateSymbolicLink(&symLinkName,&devName);
if(!
NT_SUCCESS(status))/*status等于*/
{
IoDeleteDevice(pDevObj);
returnstatus;
}
returnSTATUS_SUCCESS;
}
#pragmaINITCODE
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject);//前置说明卸载例程
==============================================
/////////////////Mini_ddl.c文件内容/////////////
//_stdcall
#include"mini_ddk.h"
NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObject,PUNICODE_STRINGB)//TYPEDEFLONGNTSTATUS
{
KdPrint(("驱动成功被加载...OK++++++++"));
//jmp指令
CreateMyDevice(pDriverObject);//创建相应的设备
pDriverObject->DriverUnload=DDK_Unload;
return
(1);
}
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject)
{
PDEVICE_OBJECTpDev;//用来取得要删除设备对象
UNICODE_STRINGsymLinkName;//设备连接符号
pDev=pDriverObject->DeviceObject;//取得设备链表的头部,比如还有NextDevice
IoDeleteDevice(pDev);//删除设备
RtlInitUnicodeString(&symLinkName,L"\\?
?
\\yjx888");//取符号链接名字
IoDeleteSymbolicLink(&symLinkName);//删除符号链接
KdPrint(("驱动成功被卸载...OK-----------"));//sprintf,printf
DbgPrint("卸载成功");
}
//////////////////////////////////////////////////////////////////////////////
//_stdcall
#include"mini_ddk.h"
#pragmaINITCODE
NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObject,PUNICODE_STRINGB)//TYPEDEFLONGNTSTATUS
{
KdPrint(("驱动成功被加载...OK++++++++"));
//注册派遣函数
pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL;//IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL;//IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_CONTROL;//IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL;//IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL;//IRP_MJ_CREATE相关IRP处理函数
CreateMyDevice(pDriverObject);//创建相应的设备
pDriverObject->DriverUnload=DDK_Unload;
return
(1);
}
//#pragmacode_seg("PAGE")
#pragmaPAGECODE
VOIDDDK_Unload(INPDRIVER_OBJECTpDriverObject)
{
PDEVICE_OBJECTpDev;//用来取得要删除设备对象
UNICODE_STRINGsymLinkName;//
pDev=pDriverObject->DeviceObject;
IoDeleteDevice(pDev);//删除设备
//取符号链接名字
RtlInitUnicodeString(&symLinkName,L"\\?
?
\\yjx888");
//删除符号链接
IoDeleteSymbolicLink(&symLinkName);
KdPrint(("驱动成功被卸载...OK-----------"));//sprintf,printf
//取得要删除设备对象
//删掉所有设备
DbgPrint("卸载成功");
}
#pragmaPAGECODE
NTSTATUSddk_DispatchRoutine_CONTROL(INPDEVICE_OBJECTpDevobj,INPIRPpIrp)
{
//对相应的IPR进行处理
pIrp->IoStatus.Information=0;//设置操作的字节数为,这里无实际意义
pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功
IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP
KdPrint(("离开派遣函数\n"));//调试信息
returnSTATUS_SUCCESS;//返回成功
}
//////////////////////////////////////////////////////////////////////////////
//系统服务描述符表在ntoskrnl.exe导出KeServiceDescriptorTable这个表
typedefstruct_ServiceDescriptorTable{
PVOIDServiceTableBase;//SystemServiceDispatchTable的基地址
PVOIDServiceCounterTable;
//包含着SSDT中每个服务被调用次数的计数器。
这个计数器一般由sysenter更新。
unsignedintNumberOfServices;//由ServiceTableBase描述的服务的数目。
PVOIDParamTableBase;//包含每个系统服务参数字节数表的基地址-系统服务参数表
}*PServiceDescriptorTable;
//由SSDT索引号获取当前函数地址
//NtOpenProcess[[KeServiceDescriptorTable]+0x7A*4]
externPServiceDescriptorTableKeServiceDescriptorTable;
//方法1纯汇编读取
ULONGSSDT_NtOpenProcess_Addr;
//[[KeServiceDescriptorTable]+0x7A*4]
__asm
{
pusheax
//
moveax,KeServiceDescriptorTable
moveax,[eax]////SystemServiceDispatchTable的基地址
imuleax,eax,0x7a
shleax,2//[KeServiceDescriptorTable]+0x7A*4
moveax,[eax]//[[KeServiceDescriptorTable]+0x7A*4]
movSSDT_NtOpenProcess_Addr,eax
//
popeax
}
KdPrint(("读取SSDT_NtOpenProcess_Addr=%x+++++++\n",SSDT_NtOpenProcess_Addr));
//读取SSDT_NtOpenProcess_Addr=8058270a+++++++
//SSDT_NtOpenProcess_Cur_Addr=8058270a
//方法2:
用指针读取
LONG*SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;
KdPrint(("驱动成功被加载中.............................\n"));
//读取SSDT表中索引值为0x7A的函数
//poi(poi(KeServiceDescriptorTable)+0x7a*4)
t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
KdPrint(("当前ServiceTableBase地址为%x\n",t_addr));
SSDT_Adr=(PLONG)(t_addr+0x7A*4);
KdPrint(("当前t_addr+0x7A*4=%x\n",SSDT_Adr));
SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;
KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x\n",SSDT_NtOpenProcess_Cur_Addr));
///////////////////////////////////////////////
PVOIDMmGetSystemRoutineAddress(__inPUNICODE_STRINGSystemRoutineName);//MmGetSystemRoutineAddress原型
ULONGGetNt_OldAddr();
ULONGGetNt_CurAddr()//获取当前SSDT_NtOpenProcess的当前地址
{
LONG*SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;
KdPrint(("驱动成功被加载中.............................\n"));
//读取SSDT表中索引值为0x7A的函数
//poi(poi(KeServiceDescriptorTable)+0x7a*4)
t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
KdPrint(("当前ServiceTableBase地址为%x\n",t_addr));
SSDT_Adr=(PLONG)(t_addr+0x7A*4);
KdPrint(("当前t_addr+0x7A*4=%x\n",SSDT_Adr));
SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;
KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x\n",SSDT_NtOpenProcess_Cur_Addr));
returnSSDT_NtOpenProcess_Cur_Addr;
}
ULONGGetNt_OldAddr()
{
UNICODE_STRINGOld_NtOpenProcess;
ULONGOld_Addr;
RtlInitUnicodeString(&Old_NtOpenProcess,L"NtOpenProcess");
Old_Addr=(ULONG)MmGetSystemRoutineAddress(&Old_NtOpenProcess);//取得NtOpenProcess的地址
KdPrint(("取得原函数NtOpenProcess的值为%x",Old_Addr));
returnOld_Addr;
}
///////////////////////////////////////////////
//定义JMP结构
typedefstruct_JMPCODE
{
BYTEE9;
ULONGJMPADDR;//88881234=B
}JMPCODE,*PJMPCODE;
/////////////////////////////////////////////////////////
//_stdcall
#include"mini_ddk.h"
#pragmaINITCODE
JMPCODEoldCode;//新建oldCode以备恢复
PJMPCODEpcur;
NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObject,PUNICODE_STRINGB)//TYPEDEFLONGNTSTATUS
{
ULONGcur,old;
JMPCODEJmpCode;
//PJMPCODEpcur;
cur=GetNt_CurAddr();//A
old=GetNt_OldAddr();//C
if(c