驱动老牛
![]() |
阅读:5793回复:34
如何让我的驱动程序在安全模式下启动
一般情况下自己的驱动在安全模式下就没用了,怎么能让驱动程序在安全模式下也能启动?
|
|
沙发#
发布于:2007-01-10 16:53
filespy的start=0,regmon为一
|
|
板凳#
发布于:2007-01-10 16:51
我修改的filespy,regmon在安全模式下都可以启动
|
|
地板#
发布于:2007-01-05 16:30
Orz,,,i can say nothing
|
|
|
地下室#
发布于:2005-08-11 11:01
下面是引用niceboy于2005-07-19 10:50发表的: 真搞笑! |
|
5楼#
发布于:2005-07-19 10:50
start 设置成0就可以的
比如我写的Filter 在正常模式下启动, 蓝屏, 在安全模式下启动, 蓝屏 |
|
6楼#
发布于:2005-07-18 21:22
改注册表应该可以
|
|
7楼#
发布于:2005-07-18 21:18
在注册表里设置
|
|
8楼#
发布于:2005-07-18 21:07
而且我可以证明,因为我写的驱动在安全模式工作过.至少filemon改为为是不行是因为Filemon是用attach盘符的方式,而start=0时,那些file system根本就没有加载.所以对于这部分,建议大家去看sfilter的加载方式.那才是真正在start=0时Attach到File system的正确方法.
|
|
9楼#
发布于:2005-07-18 21:05
不要这样吗!,这是交流技术的地方.
其实tiamo有部分是理解错误的.建议去看看<Windows 2000技术内幕>里提到,SafeBoot这部分在<技术内幕>说的很详细.其实所有ifs filter在安全模式全被加载.据我当时的记忆,凡是Start=0的,都脱离SafeBoot的检测范围了.也就是凡是start=0,SafeBoot根本就管不到. |
|
10楼#
发布于:2005-07-18 16:41
一人一把刀,互桶!
|
|
|
11楼#
发布于:2005-07-18 15:09
顶一下,好贴
|
|
12楼#
发布于:2005-01-15 20:29
使用酵件固然好,
|
|
13楼#
发布于:2005-01-15 18:20
哟...有人跟我叫板.... 没仔细看。 佩服中。。。 :) 顶一下先 :D |
|
14楼#
发布于:2005-01-13 15:02
别用学校的那些破东西来唬人, 学过几个触发器也敢说"了解"?! 我不是学计算机的, 可我做过的东西比你听说过的还多. 当我用VHDL和VERILOG写硬件的时候, 当我分析网表的时候, 当我PORT产品到SYSTEMC的时候, 你正在写那个拿满分的论文吧? 这里讨论的是工业产品, 不是学术论文!
从你说的话看来, 你受的教育是给人扣大帽子, 自以为清高, 其实DB. 有问题实在地说问题, 这里是交流技术, 没人有兴趣和你交流思想. 别人狂妄怎么了? 不谦虚怎么了? 你道德警察啊? 需要你来鄙视一下?不过也难怪, 我大学刚毕业时也这样. 你说的删除filter group的假设毫无意义, MSDN上从来没有地方告诉你可以更改系统中不是你的东西而不出问题. 这点上我的逻辑很清楚. 我已经知道可以不进到IopSafebootDriverLoad里面去, 为什么还要提它的实现? 整个前提就是有问题的. 既然那个函数有提供一个参数让你饶过BOOT的检查, 就有可能有模块会用. 外面有的MS源代码不全, 你能保证只有PNP才把那个参数设成FALSE? 我不知道, 所以我说不一定. 我敢说你也不知道, 你却说一定. 你忘了你自己前面说的"知之为知之.不知为不知"了? 不好意思, 最近正准备GMAT, 对你话里的逻辑问题挑了点刺, 算是你为我逻辑高分添砖加瓦吧. 动不动就来一段德育就是幼稚. 而说反话--那大多是女人发嗲时做的事情:D:D toad |
|
15楼#
发布于:2005-01-13 11:14
说实话...我还真就了解cpu里面的时序电路逻辑实现是怎么完成的..虽然只是停留在理论阶段..但是起码我知道alu是怎么用全加器构成的...指令解码单元的微程序又是怎么用门电路构建的..流水线的inorder issue,out of order execute,inorder commit以及register rename这些技术都是怎么作到的..呵...我计算机体系结构就是因为有写一篇关于这些的论文拿的满分...呵..我只是一学生.我估计你都要问有没有在比如science上发表..哈哈..很不幸..这些东西都已经有人出书了..我也只是从上面学来的..作者嘛..一个来自伯克力分校..一个来自斯坦佛大学...学计算机的..risc架构有了解的人都应该知道他们是谁...
至于谦虚嘛...我受的教育让我知道....不管什么事情..知之为知之.不知为不知..我从来不会对那些我并不清楚的事情还一口咬定说自己很清楚..更不会把狂妄当作是自信...没有办法我从小受的教育就这样....幼稚就幼稚了呗... 至于我说删除filter key..只是想说明他的存在是一个driver被加载的必要条件..如果你一定要说是因为地球的存在..driver才会被加载..我也没有办法说你说的不对..地球都不存在了..driver还加载什么啊..呵呵.. 既然你手头上有win2000的源代码 那你为什么不看看那个IopSafebootDriverLoad函数的实现呢 为什么要回避这个问题呢....看看这个函数不就知道我说的错还是对了....我又不是那种说错了话还死不承认的人... 早知道我就贴源代码上来了..还费劲的用ida去反..呵呵..觉得自己很搞笑... 既然你都贴出ifsddk里面的原话..那就是我说错了..对不起.. 另外 我知道你是看见IopCallDriverAddDeviceQueryRoutine这个函数里面 传递了一个FALSE... 所以我说你知其然不知其所以然 为什么这里要传递一个FALSE.... 在同一个文件的上面有一个叫IopCallDriverAddDevice的函数 你看看....他已经作过一次判断了...line 2654..已经用class的guid作为参数调用过IopSafebootDriverLoad函数了.... 够了...这个问题我不再回复了... 好吧..我承认自己小白..自己幼稚..自己无知..所以现在都还没有找到工作..... 最后还请大侠见谅... 幼稚无知的小白可耻的参上... |
|
16楼#
发布于:2005-01-13 06:27
> 既然自己有这么多只是知道然不知道所以然得东西...
一切工业产品都是在component的基础上的. 只要知道接口(然)就行了, 不需要知道具体的实现过程(所以然). 如果你要往里追究, 你的程序是跑在OS上的, OS跑在CPU上, CPU里面有复杂的解码和时序电路, 这些你又知道多少? 当然是知道得越多越好, 可是只要接口定义得好, 内部机制其实什么都不需要知道. 我们希望知道WINDOWS的内部机制, 是因为WINDOWS的接口定义不全/不好, 现有接口使我们无法完成目标. > 是不是应该要谦虚一点呢.... 真不明白你说的是什么. 谦虚? 你是不是在这社会上混的? 现在社会需要的是自信! 找过工作的人都知道, 谦虚只会让你失去一次次的工作机会. 退一步说, 这个BBS是给大家讨论问题的, 不是发表专利的. 我发一个贴子是因为我自己认为这是对的, 也许客观上这是错的, 这叫不谦虚吗? 我是不是要先找MS去认证一下我的观点是正确的, 然后才能贴出来? 关于第三点, filter组和ntoskrnl本来就都是OS的成分. 如果你能用更改OS的东西(删filter组看看)来证明你的观点, 为什么我不能用改OS的东西(patch kernel)来反驳它呢? 关于第四点, 给你贴一个IFSDDK上的原话: If a file system filter driver does not specify a load order group, it is loaded after all other drivers of the same start type that do specify a load order group. 这很清楚地说明了, 文件过滤驱动可以不属于任何group. 关于第五点, 当然不能在DriverEntry里面简单地返回一个错误码, 不同的驱动处理方式不一样. 具体在Q837643里有描述. 最后我也贴一段代码: NTSTATUS IopLoadDriver( IN HANDLE KeyHandle, IN BOOLEAN CheckForSafeBoot ) { ... if (CheckForSafeBoot && InitSafeBootMode) { ... bLoadInSafeMode = IopSafebootDriverLoad(...); ... } ... } 如果CheckForSafeBoot是FALSE, 那么不管当前是不是安全模式,更不管这个驱动是不是在tiamo所说的注册表中的位置, 系统都会试图去LOAD这个驱动. PNP就是这么LOAD驱动的. toad |
|
17楼#
发布于:2005-01-12 21:30
哟...有人跟我叫板....
既然自己有这么多只是知道然不知道所以然得东西... 是不是应该要谦虚一点呢.... 第一点..既然你强调那么清楚..那就算是我理解错误行了吧.呵呵 第二点..我记得我自己是在这些地方都看到有提到过...如果这些里面都没有的话..那我表示道歉.. 第三点..这个我可以肯定的说..我是知道为什么加入safeboot就能在safe mode下使用..至于你说什么ntoskrnl打patch一类的话...如果你要这样说的话..我也就没有语言了..你怎么不叫我把cpu给拔下来看看是不是还能在安全模式下加载呢..这种争论有任何的意义么..自己不知道为什么的事情是不是应该用一种谨慎的态度呢.. 第四点..我只能说你理解的有问题..好好看看ddk里面的文档..一个file system filter都应该是一个什么样子的group... 第五点..driver判断是否加载?什么意思...你代码是怎么运行的?os不加载你的driver,你能写下if else语句来判断当前是否是安全模式再决定加载不加载自己么...你的代码不运行你有办法知道当前的模式么....表告诉我你说的是在driverentry里面返回一个错误啊... 说正题...windows在安全模式下都加载什么样子的driver 其实很简单...下面都是指没有被第三方打过patch的系统 在current control set 下的control下面的safeboot 下面有两个key 一个是Minimal一个是Network 简单的情况就是你按f8出来的菜单选安全模式就使用Minimal 如果你选带网络的安全模式就是Network 这两个key下面还有很多的key 每一个标记了一个或者一组要在安全模式下加载的驱动 这下面的每一个key的default都有设置值 要么是driver..就表示这个key的名字代表了一个要加载的driver 要么是driver group..就表示这个key代表了一个driver group 所有属于这个group的driver都会被加载... 凡是没有被这些描述到的driver都不会被加载... 或者是Service表示这是一个服务 如果是GUID形式的key那表示是一个class 我记得我是在好几个地方看到过这个描述的.. 至于出处....如果真的确认是我说的不对...那我道歉... 如果你觉得描述的不好理解 代码贴上来... windows 2003 server up ntoskrnl.exe PAGE:805C0A2D ; __stdcall IopLoadDriver(x,x,x,x) PAGE:805C0A2D _IopLoadDriver@16 proc near PAGE:805C0A2D push ebp PAGE:805C0A2E lea ebp, [esp-68h] ...... 判断第一个参数是否是0.是则跳过安全模式检查 如果不是0还要检查_InitSafeBootMode变量值 都满足了跳转 PAGE:805C0B32 cmp [ebp+74h], bl ;arg0 PAGE:805C0B35 jz short loc_805C0B43 PAGE:805C0B37 cmp _InitSafeBootMode, ebx PAGE:805C0B3D jnz loc_80601AC6 PAGE:805C0B43 push 1 PAGE:805C0B45 mov edi, offset _PsLoadedModuleResource PAGE:805C0B4A push edi PAGE:805C0B4B call _ExAcquireResourceSharedLite@8 ........ 获取Group的值 PAGE:80601AC6 push offset aGroup PAGE:80601ACB lea eax, [ebp+38h] PAGE:80601ACE push eax PAGE:80601ACF call _RtlInitUnicodeString@8 PAGE:80601AD4 push 13h PAGE:80601AD6 pop ecx PAGE:80601AD7 xor eax, eax PAGE:80601AD9 lea edi, [ebp-38h] PAGE:80601ADC rep stosd PAGE:80601ADE lea eax, [ebp+74h] PAGE:80601AE1 push eax PAGE:80601AE2 push 4Ch PAGE:80601AE4 lea eax, [ebp-38h] PAGE:80601AE7 push eax PAGE:80601AE8 push 2 PAGE:80601AEA lea eax, [ebp+38h] PAGE:80601AED push eax PAGE:80601AEE push dword ptr [ebp+70h] PAGE:80601AF1 call _NtQueryValueKey@24 PAGE:80601AF6 test eax, eax PAGE:80601AF8 jl short loc_80601B1F 用这个group的值作为参数调用_IopSafebootDriverLoad函数 检查返回值如果是TRUE就跳转到加载代码(805C0B43) PAGE:80601AFA mov eax, [ebp-30h] PAGE:80601AFD add eax, 0FFFFFFFEh PAGE:80601B00 mov [ebp+38h], ax PAGE:80601B04 mov [ebp+3Ah], ax PAGE:80601B08 lea eax, [ebp-2Ch] PAGE:80601B0B mov [ebp+3Ch], eax PAGE:80601B0E lea eax, [ebp+38h] PAGE:80601B11 push eax PAGE:80601B12 call _IopSafebootDriverLoad@4 PAGE:80601B17 test al, al PAGE:80601B19 jnz loc_805C0B43 如果是FALSE 则再用driver的名字作为参数调用_IopSafebootDriverLoad函数 PAGE:80601B1F lea eax, [ebp+5Ch] PAGE:80601B22 push eax PAGE:80601B23 call _IopSafebootDriverLoad@4 PAGE:80601B28 test al, al PAGE:80601B2A jnz loc_805C0B43 如果返回TRUE则正常加载(805C0B43) 如果还是返回FALSE,则加入一个bootlog 同时dbgprint SAFEBOOT: skipping device = %wZ(%wZ),0Ah的字符串 PAGE:80601B30 push ebx PAGE:80601B31 lea eax, [ebp+5Ch] PAGE:80601B34 push eax PAGE:80601B35 call _IopBootLog@8 PAGE:80601B3A lea eax, [ebp+38h] PAGE:80601B3D push eax PAGE:80601B3E lea eax, [ebp+5Ch] PAGE:80601B41 push eax PAGE:80601B42 push offset aSafebootSkippi PAGE:80601B47 call _DbgPrint PAGE:80601B4C add esp, 0Ch PAGE:80601B4F push ebx PAGE:80601B50 push 2 PAGE:80601B52 call _HeadlessKernelAddLogEntry@8 PAGE:80601B57 xor eax, eax PAGE:80601B59 jmp loc_805C074E 再看看关键函数 PAGE:806398BB ; __stdcall IopSafebootDriverLoad(x) PAGE:806398BB _IopSafebootDriverLoad@4 proc near PAGE:806398BB push ebp PAGE:806398BC mov ebp, esp PAGE:806398BE sub esp, 18h 先根据_InitSafeBootMode的值选择一个key string PAGE:806398C1 mov eax, _InitSafeBootMode PAGE:806398C6 dec eax ;eax =1 Minimal PAGE:806398C7 jz short loc_806398E4 PAGE:806398C9 dec eax ;eax = 2 Network PAGE:806398CA jz short loc_806398DD PAGE:806398CC dec eax ;eax = 3 直接返回1 PAGE:806398CD jz short loc_806398D6 PAGE:806398CF xor al, al 否则返回0 PAGE:806398D1 jmp locret_806399B3 PAGE:806398D6 mov al, 1 PAGE:806398D8 jmp locret_806399B3 PAGE:806398DD push offset aNetwork ; "NETWORK" PAGE:806398E2 jmp short loc_806398E9 PAGE:806398E4 push offset aMinimal ;"MINIMAL" PAGE:806398E9 lea eax,[ebp+SourceString] PAGE:806398EC push eax PAGE:806398ED call _RtlInitUnicodeString@8 PAGE:806398F2 push ebx PAGE:806398F3 push esi PAGE:806398F4 mov esi, [ebp+arg_0] PAGE:806398F7 xor eax, eax PAGE:806398F9 mov ax, [esi] PAGE:806398FC add ax, [ebp+SourceString.Length] 分配内存放key PAGE:80639900 push ' oI' PAGE:80639905 xor ebx, ebx PAGE:80639907 mov word ptr [ebp+Destination], bx PAGE:8063990B add eax, 8 PAGE:8063990E mov word ptr [ebp+Destination+2], ax PAGE:80639912 movzx eax, ax PAGE:80639915 push eax PAGE:80639916 push 1 PAGE:80639918 call _ExAllocatePoolWithTag@12 PAGE:8063991D cmp eax, ebx PAGE:8063991F mov [ebp-0Ch], eax PAGE:80639922 jnz short loc_8063992B PAGE:80639924 xor al, al ;失败直接返回0 PAGE:80639926 jmp loc_806399B1 PAGE:8063992B lea eax, [ebp+SourceString] PAGE:8063992E push eax PAGE:8063992F lea eax, [ebp+Destination] PAGE:80639932 push eax PAGE:80639933 call _RtlCopyUnicodeString@8 PAGE:80639938 push offset asc_806399D8 ;反斜杠 PAGE:8063993D lea eax, [ebp+Destination] PAGE:80639940 push eax PAGE:80639941 call _RtlAppendUnicodeToString@8 PAGE:80639946 test eax, eax PAGE:80639948 jl short loc_806399A2 PAGE:8063994A push esi PAGE:8063994B lea eax, [ebp+Destination] PAGE:8063994E push eax PAGE:8063994F call _RtlAppendUnicodeStringToString@8 根据当前的模式..生成key string PAGE:80639954 test eax, eax PAGE:80639956 jl short loc_806399A2 PAGE:80639958 push ebx PAGE:80639959 mov esi, 0F003Fh PAGE:8063995E push esi PAGE:8063995F push offset _CmRegistryMachineSystemCurrentControlSetControlSafeBoot PAGE:80639964 push ebx PAGE:80639965 lea eax, [ebp+KeyHandle] PAGE:80639968 push eax PAGE:80639969 call _IopOpenRegistryKey@20 打开这个safeboot key,失败就跳转 PAGE:8063996E test eax, eax PAGE:80639970 jl short loc_806399A2 然后打开生成的key string PAGE:80639972 push ebx PAGE:80639973 push esi PAGE:80639974 lea eax, [ebp+Destination] PAGE:80639977 push eax PAGE:80639978 push [ebp+KeyHandle] PAGE:8063997B lea eax, [ebp+var_8] PAGE:8063997E push eax PAGE:8063997F call _IopOpenRegistryKey@20 关闭safe bootkey PAGE:80639984 push ebx PAGE:80639985 push [ebp+KeyHandle] PAGE:80639988 mov esi, eax PAGE:8063998A call _ObpCloseHandle@8 判断打开成功与否失败了就跳转,否则关闭 PAGE:8063998F cmp esi, ebx PAGE:80639991 jl short loc_806399A2 PAGE:80639993 push ebx PAGE:80639994 push [ebp+var_8] PAGE:80639997 call _ObpCloseHandle@8 设置返回值1 PAGE:8063999C mov byte ptr [ebp+arg_0+3], 1 PAGE:806399A0 jmp short loc_806399A5 失败了就跳转到这里,设置返回值0 PAGE:806399A2 mov byte ptr [ebp+arg_0+3], bl 释放key string的内存 PAGE:806399A5 push ebx PAGE:806399A6 push dword ptr [ebp-0Ch] PAGE:806399A9 call _ExFreePoolWithTag@8 设置返回的eax PAGE:806399AE mov al, byte ptr [ebp+arg_0+3] 返回 PAGE:806399B1 pop esi PAGE:806399B2 pop ebx PAGE:806399B3 leave PAGE:806399B4 retn 4 非常清楚了...这个函数很简单 除了几个特别处理的返回地方 其他的都是用[ebp+arg_0+3]作为返回值 修改她的地方有两个 一个就是出错跳转的地址806399A2,设置成0 ebx一直是0 另外一个就是所有条件都满足了设置成了1 我想...我要说的已经很明白了... 没有什么好争论的了吧...代码面前.. 如果有人觉得我说得话有些过分或者其他的 我在这里道歉.... 以上 调整了下排版 [编辑 - 1/12/05 by tiamo] |
|
18楼#
发布于:2005-01-12 15:17
Q837643有说怎么从驱动里detect安全模式.
toad |
|
驱动老牛
![]() |
19楼#
发布于:2005-01-12 14:48
SafeMood的时候操作系统怎么决定加载那些驱动的?
|
|
上一页
下一页