首页
社区
课程
招聘
[原创]对内核函数IoCompleteRequest的分析
发表于: 2010-3-16 22:32 9788

[原创]对内核函数IoCompleteRequest的分析

2010-3-16 22:32
9788

今天是我的18周岁生日,突然就想发表篇文章,而前几天刚好在做IopfCompleteRequest的分析,所以今天就赶赶急,把分析做做完,发表出来。
     我在网上认识的一个前辈说过,看网上的文章,学网上已经有的技术,不是真技术;而只有自己研究才是自己所学的,所得的。而其中最为重要的是:开创自己的技术。而开创自己的技术,就需要自己先有研究的基础。
      本文自然不是什么开创之作,IopfCompleteRequest的伪代码早已漫天飞IopfCompleteRequest也早已没有什么秘密可言。但是我还是坚持一个人独立地看windows的二进制码,凭自己所学,分析那一个个指令。
      鉴于本人水平有限,从接触编程到现在也才2个年头多,虽兢兢业业,勤奋学习,却也因为走过不少弯路而浪费了很多的时间。所以本文会有一些甚至许多错误,请前辈们斧正。
下面是总结的IoCompleteRequest流程:

总结流程:
;当调用IoCompleteRequest时,首先检查当前堆栈位置,和IRP类型;然后判断IRP堆栈里的Control,来完成设置IRPPendingReturn和
;判断是否成功,取消,错误,时调用完成例程,然后再边回卷堆栈,边调用完成例程,然后一直回转到堆栈位置比windows的自设的空堆栈还大的时候
;结束回转,进入对IRP事件,回调函数,IRP,MDL释放等的工作中去.
;结束回转后,首先判断是否有事件或回调函数,若无,则释放IRP和MDL,并返回、;若有,则先判断是否需要重解析,若需要,则将AuxiliaryBuffer释放掉,并清零,(大概就是清零后能达到重解析的目的,可以说是一个标志位吧)
;若不需要,则判断用户态设置的通信方法,是用事件的方法,还是用回调函数的方法。
;若为事件,则设置事件,然后无论IRP是Reserved还是正常的,都进行释放,释放后返回
;若为回调函数,则又分为三种情况,一是成功的情况下,二是取消的情况下,三是等待的情况下。
;成功和取消相仿,都是先初始化再插入队列
;只不过取消的情况下还和上面的AuxiliaryBuffer清零结合在一起,如果清零了,则直接返回。
;等待的状态下只初始化APC,并不插入队列。
;KeBugCheckEx 是错误报告,只有两处会产生错误报告,一是调用IoCompleteRequest时,堆栈CurrentLocation大于StackCount+1,而是IRP类型不为6

附件是IoCompleteRequest的二进制码,和我对二进制码的注释,还有总结的一些对IoCompleteRequest的结论。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
学习一下!!辛苦了!!
2010-3-19 23:58
0
雪    币: 683
活跃值: (622)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这么好的帖子竟然没人看
2018-2-12 13:20
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
看wrk就行了。。。
2018-2-12 15:49
0
游客
登录 | 注册 方可回帖
返回
//