函数集合.docx

上传人:b****1 文档编号:10417274 上传时间:2023-05-25 格式:DOCX 页数:23 大小:20.59KB
下载 相关 举报
函数集合.docx_第1页
第1页 / 共23页
函数集合.docx_第2页
第2页 / 共23页
函数集合.docx_第3页
第3页 / 共23页
函数集合.docx_第4页
第4页 / 共23页
函数集合.docx_第5页
第5页 / 共23页
函数集合.docx_第6页
第6页 / 共23页
函数集合.docx_第7页
第7页 / 共23页
函数集合.docx_第8页
第8页 / 共23页
函数集合.docx_第9页
第9页 / 共23页
函数集合.docx_第10页
第10页 / 共23页
函数集合.docx_第11页
第11页 / 共23页
函数集合.docx_第12页
第12页 / 共23页
函数集合.docx_第13页
第13页 / 共23页
函数集合.docx_第14页
第14页 / 共23页
函数集合.docx_第15页
第15页 / 共23页
函数集合.docx_第16页
第16页 / 共23页
函数集合.docx_第17页
第17页 / 共23页
函数集合.docx_第18页
第18页 / 共23页
函数集合.docx_第19页
第19页 / 共23页
函数集合.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

函数集合.docx

《函数集合.docx》由会员分享,可在线阅读,更多相关《函数集合.docx(23页珍藏版)》请在冰点文库上搜索。

函数集合.docx

函数集合

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2