内核编程:驱动之学习笔记
来源:互联网 发布:双向数据绑定 编辑:程序博客网 时间:2024/06/06 05:16
驱动程序挂靠任意进程
最近学习了内核编程,虽然说学的比较浅,但是也不能有一丝丝的懈怠,生怕自己听不懂,又被班同学落(la)下……就如我的QQ个性签名一样,“有的时候,我们不停地跑啊跑,只是为了能追上那个被寄予厚望的自己……”
操作系统的内核是非常强大的,强大到令你吃惊,内存管理,进程管理,中断机制,保护机制……内核中没有进程,只有线程,都是属于系统进程下的线程,所以我们加载的驱动,都是跑在系统进程下的线程,我们想要干点“坏事”的话,挂靠到Ring3的程序是件不错的事,比如可以不停的读取被挂靠进程空间,随意写入内存,使之程序崩溃,这就达到我们的目的了,当然部分程序的健壮性还是很不错的,会有一些软件保护机制,我这里说的是除了壳以外的保护机制,反调试机制等等。我们在内核层加载后的驱动就会变成内核中的一个线程,此时这个线程的cr3还是系统的,cr3 = 0x00185000,这里说下cr3的具体含义,它是一个进程的首地址,一个进程下所有线程的cr3都是相同,线程共用系统给进程分配的4GB空间,高2GBRing3程序是无法访问的。所以简单点说,我们只需要将cr3的地址切换成被挂靠进程的cr3地址就可以了,就能实现进程挂靠。手动在Windbg下修改很容易导致系统崩溃蓝屏,所以我们一般在虚拟机里做这些实验就可以了。
这是Ring3被挂靠程序代码
int _tmain(int argc, _TCHAR* argv[]){ char buf[] = "All I ever wanted was a single thing worth fighting for.Just only.\n"; printf("%x\n", buf); getchar(); return 0;}
这是驱动程序
#include <ntifs.h>//函数声明部分VOID DriverUnload(PDRIVER_OBJECT pDriver);ULONG PsGetProcessPeb(PEPROCESS Process);//函数作用:通过传进程PID可以获取EPROCESS结构体指针PEPROCESS LookupProcess(HANDLE hPid){ PEPROCESS pEProcess = NULL; // 根据PID返回进程EPROCESS,失败返回NULL if (NT_SUCCESS(PsLookupProcessByProcessId( hPid, &pEProcess))) return pEProcess; return NULL;}//函数作用:参数是一个进程的EPROCESS结构体指针//可以实现驱动挂靠到用户层(Ring3,也说三环)VOID Attach(PEPROCESS Process){ SIZE_T Peb = 0; KAPC_STATE ks; //获取PEB地址 Peb = (SIZE_T)PsGetProcessPeb(Process); //依附进程 KeStackAttachProcess(Process, &ks); //取消依附进程 KdPrint(("%s", 0x1ff924)); //这里执行完一定要取消挂靠,不然也容易导致系统崩溃 KeUnstackDetachProcess(&ks);}//驱动卸载函数VOID DriverUnload(PDRIVER_OBJECT pDriver){ //因为驱动程序代码要求比较严格,未使用到的我们 //都通过这个宏调用下就可以了 UNREFERENCED_PARAMETER(pDriver);}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pPath){ UNREFERENCED_PARAMETER(pPath); //下一个断点 DbgBreakPoint(); KdPrint(("Hello world!\n")); //调用函数,传一个用户层进程的PID Attach(LookupProcess(3776)); //驱动卸载函数 pDriver->DriverUnload = DriverUnload; return STATUS_SUCCESS;}
阅读全文
0 0
- 内核编程:驱动之学习笔记
- 驱动编程学习笔记之IO处理
- 驱动编程学习笔记之IO处理
- 驱动编程学习笔记之IO处理
- Linux内核学习笔记之网卡驱动的详细分析
- linux设备驱动学习笔记--内核调试方法之printk
- linux设备驱动学习笔记--内核调试方法之proc
- linux学习笔记-读《Linux设备驱动开发详解》~第三章 Linux内核及内核编程
- 内核模块编程笔记 - 字符设备驱动
- Windows内核驱动编程笔记(转载集合)
- 内核编程学习笔记(004) 对某某游戏的驱动双开的分析及其学习
- 【转帖】驱动编程学习笔记之IO处理
- WinCE之旅——驱动编程学习笔记2
- WinCE之旅——驱动编程学习笔记3
- linux 内核编程之字符设备驱动
- linux内核编程之网卡驱动
- 内核编程学习笔记(001)
- Windows内核编程学习笔记
- 解释型语言和编译型语言的区别
- 断点续传进度条显示 开始 暂停 结束
- 69. Sqrt(x)
- 单机版hadoop平台搭建
- 断点续传更新版
- 内核编程:驱动之学习笔记
- maven中pow项目找到jar项目中的配置文件
- H5下上传图片预览
- 实验7、矩阵的2种转置运算 (4学时)
- Linux Shell 学习笔记(二) 命令
- Maven私服Nexus搭建&应用
- 4.C语言(1)
- 使用OKhttp的封装类 进行本地相册或拍照的图片上传显示
- 前端笔记