一个菜鸟的内核学习
发表于:
2013-4-22 17:47
4181
学习windows内核也有段时间了。这里发一个自己的小作品。我发这个作品的意图不在于这个作品的实用性,而是为了展示学习中的部分收获。这个作品不代表我学习的所有知识。虽然里面用的技术都是很久的,但是主要用作学习而已。大牛勿喷!!。
为什么要写这个作品?
我之所以要写这个作品,有两个原因。原因一是在这段时间面试中都碰壁了。许多面试官都会问,有没有自己的作品。我只能和面试过说,参加过的比赛和一些课程设计。大多数面试官对大学的课程设计和比赛不怎么感兴趣,最想看的是你的个人作品。
另外一个原因,面试官大部分都是技术人员出身。他们喜欢问技术细节的东西,如果在他们面前装,或者糊弄其实很快就知道你的能力。因为他们问的技术,已经被他们用在了很多的项目开发里了,所以他们对技术细节非常清楚,可以不夸张的说,有些函数他们都知道每个参数是干嘛!
回归正题,这个作品设计到的理论知识分别有一下几点:
1. 基于EPROCESS结构的进程检测方法
2. 基于SSDT的进程保护方法
3. 编程实现NT式驱动的加载与卸载
4. 驱动程序与应用程序的通信
5. API函数的应用
这个作品的开发环境为XP + VS 2008 + WDK,完整代码在附件中。请在XP中运行……
一、先讲讲EPRCOESS吧!
Windows XP 中的EPROCESS结构中,偏移0x88出的ActiceProcessLinks.而在win7中的偏移是0x0b8。它是一个活动进程链表,把所有的EPROCESS结构都连接起来了。而ActiceProcessLinks有是一个双向链表,所以从本身开始遍历,遍历到自己结束就可以把所有的活动进程找出来,同时中出进程的相关信息,如PID等等。
二、接下来就是SSDT进程保护。
我的作品主要修改SSDT表实现对NtOpenProcess的挂钩。这里涉及到内存的保护和其他知识,我这里不多说,贴上自己的一个学习心得不再多说了,心得写的很详细http://blog.csdn.net/fsjaky/article/details/8800746
三、现在讲讲驱动的加载与卸载。
这样的例子在网上还是在张帆老师的《windows驱动开发技术详解》里面都讲得很清楚。这里我就不多说什么,要说也说的作品的不同之处。在网上的大部分例子都是把驱动文件路径,定义成一个宏。定义成一个宏当然方便,但是程序的移植性不好,当你换一个地方路径就会导致驱动无法加载。这个作品,加载驱动的方式是通过驱动名称获得驱动文件的路径,然后进行加载。完整代码在附件中。
四、讲完驱动了,就讲讲应用程序与驱动程序的通信了。
驱动程序与应用程序通信方式有三种缓冲区、直接读写、其他方式。这个作品里面用了缓冲区的通信方式,但是实现的方法却用了两种。第一种方法在驱动程序创建一个设备对象,应用在EPROCESS检测中,将检测的结果保存在一个缓冲区,应用程序中使用CreateFile()和ReadFile相结合的方式,把缓冲区的数据读出来。第二种方法通过I/O设备控制读写操作,利用DeviceIoControl与驱动通信。具体的代码会在附件中。
五、最后讲讲API函数吧!在这个作品有一个“结束进程”的按钮,这个功能完全使用了API函数TerminateProcess()。因为使用这个函数之前要使用OpenProcess()函数,但是在作品已经修改了SSDT表挂钩NtOpenProcess(),所以如果某个进程被保护了,那么这个按钮就失效了,无法结束这个进程,如果卸载保护驱动又可以结束这个进程了。这样就显得非常的直观表达内核保护进程的功能。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: