dazuko1.0.0代码分析(2)
时间:2010-06-10 来源:xunuj
下面对dazuko这个设备驱动进行分析,现在发现很多程序都喜欢使用状态机,用它来实现程序中的流程控制(另一个经典的使用状态机的例子是lighttpd,一个web服务器,也曾经看过它的代码,准备过几天写一点学习感受吧)
昨天准备写很多,但一晚上没写出什么东西,而且思路不清楚,还是自己理解的不够好。这里我以问答方式写一下对程序的理解。
1.怎么实现了hook函数
在加载dazuko模块时,执行了init_module(),在这个函数中用自己实现的sys_xxxxx来替代了sys_call_table[]中的系统函数,以此来实现了hook(第一次看见这种方法,很强大,通过类似的方式可以实现很多功能)。
2.怎么和用户态的查毒软件交互
在一个应用中,可能要开启多个查毒软件的进程,每个进程都向dazuko进行注册,实际上注册就是一次打开该字符设备的操作。在dazuko_device_open()中将该进程保存到一个表中,这张表就是slots,
它的每一项记录为
struct slot_t |
这个结构保存一个查毒软件当前处于什么状态,是正在监听、正在分析一个文件等等。这其中涉及状态机,贴图如下。
在dazuko截获到一个文件操作时,它从这个表中寻找一个当前处于FREE状态查毒进程,并把这个文件的相关信息告知该进程,由这个进程来分析文件。
dazuko和查毒软件之间的交互通过
int dazuko_device_ioctl(struct inode *inode, struct file *file, unsigned intcmd, unsigned long param) |
实现,cmd是KEY, param是VALUE
3.最新版本和1.0.0的不同
最新版本中通过定义新的接口封装了底层的函数,这样对用户来讲更方便编程了。例如在1.0.0的
dazuko_device = open("/dev/dazuko", 0)改为dazukoRegister("Anti Virus", "r+"); |
4.多个wait_queue的作用
static struct wait_queue *wait_kernel_waiting_for_free_slot;
可能表中的所有查毒软件都正在工作,这个wait_queue的作用就是等待一个查毒软件进程完成任务,并再次可用
static struct wait_queue *wait_kernel_waiting_while_daemon_works;
这个是查毒软件当前正处于分析状态,内核必须等待知道查毒软件完成分析,并告知结果
static struct wait_queue *wait_daemon_waiting_for_work;
这个是查毒软件当前正处于FREE状态,也就是监听状态,等待dazuko告诉它文件访问事件的发生
static struct wait_queue *wait_daemon_waiting_for_free;
查毒软件告诉了dazuko模块它的分析结果,必须等待dazuko模块给它的确认,由dazuko将它的状态从DONE转为FREE。
5.一个很好的编程技巧
struct hash_t |
6.WAIT和WAKEUP down和up
用wait和wakeup来实现在dazuko和查毒软件之间的控制流程,因为他们之间是类似ababa这样一个执行过程。
Down和Up mutex的作用就是在修改和赋值时要保护临界区,在每个结构都有一个mutex变量。
总结:
记得以前看过文章说内核里你可以为所欲为,不会像用户态有所限制,但在内核态里你必须更加小心,处处陷进。这个2000多行代码中用了很多问题6中所指的方法。
整体看过这个代码后,发现里面主要东西就是hook,用自己的函数代替系统函数,按照自己逻辑处理问题。
使用了状态机,在一次change_state(from_state, to_state)中,用到了from_state,如果在改变的时候不处于from_state,则表明出错
好了。就这些。。告一段落。准备看查毒软件代码,因为原打算就是看查毒的了。中途杀出程咬金了。
|
|