我们在使用binder时候的大致流程是先获取servicemanger的binder,然后通过该binder获取目标服务的binder,最后调用该binder的接口。本篇就介绍下第一步的内容,涉及了从native到驱动,fwk部分先不涉及,希望可以完全理解servicemanager的获取流程。
整个流程的起点是IServiceManager::defaultServiceManager()
可以看到这是一个单例,在首次调用的时候会进行初始化获取servicemanager的binder,然后用智能指针封装一下。
可以看到这儿还是一个单例,对于参与binder IPC的进程,和binder驱动交互部分就是通过ProcessState实现的。
对于android,有三种binder驱动节点,下面列一下区别:
接下来看下ProcessState的构造方法:
这儿有两个和驱动交互的部分,一个是open_driver,一个是mmap,这里先介绍下open_driver:
这儿的流程比较直接,就是打开节点,用ioctl获取了版本号,设置了线程池数量,设置了允许异步调用检测。接下来看下open 的内容,这时候就会进入内核,因为binder驱动定义了自己的open,ioctl,mmap方法。
接下来看下init_binder_device的实现:
这儿就是将binder驱动设备注册为一个misc设备,并指定了它的 *** 作实现方法。
因为上层是先调用的open,因此看下这儿binder_open的实现:
这儿主要就是创建了一个binder_proc结构,并和当前用户态进程current关联起来。
再看下ioctl的内容:
看到这一块,之前的三个ioctl命令内容就清楚了。接下来需要看下一个关键的地方,就是mmap,对应的实现就是binder_mmap:
这儿没做啥,看下binder_alloc_mmap_handler:
这时候驱动做的事情就是将用户态的地址保存到proc自己的结构里面。 mmap暂时告一段落。
继续回到用户态,继续ProcessState::self()->getContextObject(nullptr) 获取serviemanager的binder过程,前一部分介绍完了,接下来应该是getContextObject部分,看下实现:
对于servicemanager,handle为0,看下getStrongProxyForHandle的内容:
如果本地没有servicemanager的proxy binder,那么就需要用驱动获取。继续看下获取流程:
看下transact:
可以看到transact里面的流程就是封装数据包和与驱动交互,如果有返回值,则直接写入reply。先看下如何封装的数据包:
这时候就把请求相关的写入了parcel,接下来看下waitForResponse:
看下talkWithDriver:
这儿就是将请求写入binder_write_read,并和驱动进行交互。在进入驱动前,先看下binder_write_read的结构:
在驱动中,ioctl的 *** 作如下:
先看下binder_get_thread的 *** 作:
binder_get_thread_ilocked的逻辑如下:
拿到线程后,接下来就是binder_ioctl_write_read:
这儿就是读取内容,然后解析出命令,对于我们,命令是BC_TRANSACTION, 然后调用binder_transaction进行 *** 作:
到这里,过去servicemanager的binder流程就结束了。最后再简单看下binder_proc_transaction的内容:
介绍到这里,defaultServiceManager涉及的流程就介绍完了,最后用一个流程图总结下:
本篇介绍了下servicemanager proxy的获取流程,涉及了ProcessState(进程单例), IPCThreadState(线程单例)。 binder驱动的open,mmap,ioctl部分。该流程比起其他调用流程稍微简单一些,不过对于熟悉binder 工作流程还是很有帮助的。
看看能进安全模式吗,重启按f8,选择安全模式,确定就可以了。
能进就好说。运行msconfig,在启动里,把不用的启动项目都去掉(只留输入法和杀毒软件就好了)。然后,重启。
如果不能进,可能是中毒导致的。
不过,有的时候中毒会导致进安全模式缓慢。要是病毒的话,你得下个windows清理助手在别的电脑升级后,复制到你电脑的安全模式里,然后杀毒再说。
实在不行,只能重装一次系统,修复下了。
事实上有没有呢,你去看看,如果真如它说的,下载更新,如果不是,你的电脑可能已经中毒,赶紧杀吧
1、获得文件全路径以及判断时机
除在所有 IRP_MJ_XXX 之前自己从头创建 IRP 发送到下层设备查询全路径外,不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE
中才会使用 ObCreateObject() 来建立一个有效的 FILE_OBJECT。而在 IRP_READ IRP_WRITE 中它们是直接 *** 作 FCB (File Control Block)的。
2、从头建立 IRP 发送关注点
无论你建立什么样的 IRP,是 IRP_MJ_CREATE 也好还是 IRP_MJ_DIRECTORY_CONTROL也罢,最要提醒的就是一些标志。不同的标志会代来不同的结果,有些结果是直接返回失败。这里指的标志不光是 IRP->Flags,还要考虑 IO_STACK_LOCATION->Flags还有其它等等。尤其是你要达到一些特殊目的,这时候更需要注意,如 IRP_MN_QUERY_DIRECTORY,不同的标志结果有很大的不同。
3、从头建立 IRP 获取全路径注意点
自己从头建立一个 IRP_MJ_QUERY_INFORMATION 的 IRP 获取全路径时需要注意,不仅在 IRP_MJ_CREATE 要做区别处理,在 IRP_MJ_CLOSE 也要做同样的处理,否则如果目标是 NTFS 文件系统的话可能产生 deadlock。如果是 NTFS 那么在 IRP_MJ_CLEANUP 的时候也需要对 FO_STREAM_FILE 类型的文件做同样处理。
4、获得本地/远程访问用户名(域名/SID)
方法只有在 IRP_MJ_CREATE 中才可用,那是因为 IO_SECURITY_CONTEXT 只有在 IO_STACK_LOCATION->ParametersCreateSecurityContext 才会有效。这样你才有可能从 IO_SECURITY_CONTEXT->SecurityContext->AccessState->SubjectSecurityContextXXXToken 中获得访问 TOKEN,从而进一步得到用户名或 SID。记得 IFS 中有一个库,它的 LIB 导出一个函数可以让你在获得以上信息后得到用户名与域名。但如果你想兼容 NT4 的话,只能自己分析来得出本地和远程的 SID。
5、文件与目录的判断
正确的方法在楚狂人的文档里已经说过了,再补充一句。如果你的文件过滤驱动要兼容所有文件系统,那么不要十分相信从 FileObject->FsContext 里取得的数据。正确的方法还是在你传递下去 IRP_MJ_CREATE 后从最下层文件系统延设备栈返回到你这里后再获得。
6、加/解密中判断点
只判断 IRP_PAGING_IO,IRP_SYNCHRONOUS_PAGING_IO,IRP_NOCACHE 是没错的。如果有问题,相信是自己的问题。关于有人提到在 FILE_OBJECT->Flags中的 FO_NO_INTERMEDIATE_BUFFERING 是否需要判断,对此问题的回答是只要你判断了 IRP_NOCACHE 就不用再判断 FILE_OBJECT 中的,因为它最终会设置 IRP->Flags 为 IRP_NOCACHE。关于你看到的诸如 IRP_DEFER_IO_COMPLETION 等 IRP 不要去管它,因为它只是一个过程。最终读写还是如上所介绍。至于以上这些 IRP 哪个是由 CC MGR 发送的,哪些是由 I/O MGR 发送和在什么时候发送的,这个已经有很多讨论了,相信可以找到。
7、举例说明关于 IRP 传递与完成注意事项
只看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介绍的流程,自己没有实际的体会还是不够的,那里只介绍了基础概念,让自己有了知识。知道如何用,在什么情况下用,用哪种方法,能够用的稳定这叫有了技术。我们从另一个角度出发,把问题分为两段来看,这样利于总结。一个 IRP 在过滤驱动中,把它分为需要安装 CompleteRoutine 的与无需安装 CompleteRoutine 的。那么在不需要安装 CompleteRoutine 的有以下几类情况。
(1) 拿到这个 IRP 后什么都不做,直接调用 IoCompleteRequest() 来返回。
(2) 拿到这个 IRP 后什么都不做,直接传递到底层设备,使用IoSkipCurrentIrpStackLocation() 后调用 IoCallDriver() 传递。
(3) 使用 IoBuildSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()来建立 IRP 的。
以上几种根据需要直接使用即可,除了一些参数与标志需要注意外,没有什么系统机制相关的东西需要注意了。那么再来看需要安装 CompleteRoutine 的情况。我们把这种情况再细分为两种,一是在 CompleteRoutine 中返回标志为STATUS_MORE_PROCESSING_REQUIRED 的情况。二是返回处这个外的标志,需要使用函数IoMarkIrpPending() 的情况。在 CompleteRoutine 中绝大多数就这么两种情况,你需要使用其中的一种情况。那么为什么需要安装 CompleteRoutine 呢?那是因为我们对其 IRP 从上层驱动,经过我们驱动,在经过底层设备栈返回到我们这一层驱动时需要得到其中内容作为参考依据的,还有对其中内容需要进行修改的。再有一种情况是没有经过上层驱动,而 IRP 的产生是在我们驱动直接下发到底层驱动,而经过设备栈后返回到我们这一层,且我们不在希望它继续向上返回的,因为这个 IRP 本身就不是从上层来的。综上所述,先来看下 IoMarkIrpPending() 的情况。
(1) 在 CompleteRoutine 中判断 Irp->PendingReturned 并使用 IoMarkIrpPending()然后返回。这种方法在没有使用 KeSetEvent() 的情况下,且不是自建 IRP 发送到底层驱动返回时使用。也就是说有可能我所做的工作都是在 CompleteRoutine 中进行的。比如加/解密时,我在这里对下层驱动返回数据的判断并修改。修改后因为没有使用 STATUS_MORE_PROCESSING_REQUIRED 标志,它会延设备堆一直向上返回并到用户得到数据为止。这里一定要注意,在这种情况下 CompleteRoutine返回后,不要在碰这个 IRP。也就是说如果这个时候你使用了 IoCompleteRequest()的话会出现一个 MULTIPLE_IRP_COMPLIETE_REQUEST 的 BSOD 错误。
(2) 在 CompleteRoutine 中直接返回 STATUS_MORE_PROCESSING_REQUIRED 标志。这种情况在使用了 KeSetEvent() 的函数下出现。这里又有两个小小的分之。
1) 出现于上层发送到我这里,当我这里使用 IoCallDriver() 后,底层返回数据经过我这一层时,我想让它暂时停止继续向上传递,让这个 IRP 稍微歇息一会,等我对这个 IRP 返回的数据 *** 作完成后(一般是没有在 CompleteRoutine中对返回数据进行 *** 作情况下,也就是说等到完成例程返回后再进行 *** 作),由我来调用 IoCompleteRequest() 让它延着设备栈继续返回。这里要注意,我们是想让它返回的,所以调用了 IoCompleteRequest()。这个可不同于下面所讲的自己从头分配 IRP 时在 CompleteRoutine 中已经调用 IoFreeIrp() 释放了当前IRP 的情况。比如我在做一个改变文件大小,向文件头写入加密标志的驱动时,在上层发来了 IRP_MJ_QUERY_INFORMATION 查询文件,我想在这个时候获得文件信息进行判断,然后根据我的判断结果再移动文件指针。注意:上面是两步,第一步是先获得文件大小,那么在这个时候我就需要用到上述办法,先让这个 IRP传递下去,得到我想要的东西后在进行对比。等待适当时机完成这个 IRP,让数据继续传递,直到用户收到为止。第二步我会结合下面小节来讲。
2) 出现于自己从头建立 IRP,当使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()创建 IRP 调用 IoCallDriver() 后,底层返回数据到我这一层时,我不想让这个 IRP 继续向上延设备栈传递。因为这个 IRP 就是在我这层次建立的,上层本就不知道有这么一个 IRP。那么到这里我就要在 CompleteRoutine 中使用 IoFreeIrp()来释放掉这个 IRP,并不让它继续传递。这里一定要注意,在 CompleteRoutine函数返回后,这个 IRP 已经释放了,如果这个时候在有任何关于这个 IRP 的 *** 作那么后果是灾难性的,必定导致 BSOD 错误。前面 1) 小节给出的例子只完成了第一步这里继续讲第二步,第一步我重用这个 IRP 得到了文件大小,那么这个时候虽然知道大小,但我还是无法知道这个文件是否被我加过密。这时,我就需要在这里自己从头建立一个 IRP_MJ_READ 的 IRP 来读取文件来判断是否我加密过了的文件,如果是,则要减少相应的大小,然后继续返回。注意:这里的返回是指让第一步的IRP 返回。而不是我们自己创建的。我们创建的都已经在CompleteRoutine 中销毁了。
8、关于完成 IRP 的动作简介
当一个底层驱动调用了 IoCompleteRequest() 函数时,基本上所有设备栈相关 IRP 处理工作都是在它那里完成的。包括 IRP->Flags 的一些标志的判断,对 APC 的处理,抛出MULTIPLE_IRP_COMPLETE_REQUESTS 错误等。当它延设备栈一直调用驱动所安装的 CompleteRoutine时,如果发现 STATUS_MORE_PROCESSING_REQUIRED 这个标志,则会停止向上继续回滚。这也是为什么在 CompleteRoutine 中使用这个标志即可暂停 IRP 的原因。
9、关于 ObQueryNameString 的使用
这个函数的使用,在有些环境下会有问题。它的上层函数是 ZwQueryObject()。在某些情况下会导致系统挂起,或者直接 BSOD。它是从 对象管理器中的 ObpRootDirectoryObject开始遍历,通过 OBJECT_HEADER_TO_NAME_INFO 获得对象名称。今天问了下 PolyMeta好象是在处理 PIPE 时会挂启,这个问题出现在 2000 系统。在 XP 上好象补丁了。
10、关于重入问题
其实这个问题在很久前的 IFS FAQ 里已经介绍的很清楚,包括处理方法以及每种方法可能带来的问题。IFS FAQ 里的 Q34 一共介绍了四种方法,包括自己从头建立 IRP发送,使用 ShadowDevice,使用特征字符串,根据线程 ID,在 XP 下使用IoCreateFileSpecifyDeviceObjectHint() 函数。并且把以上几种在不同环境下使用要处理的问题也做了简单的介绍。且在 Q33 里介绍了在 CIFS 碰到的 FILE_COMPLETE_IF_OPLOCKED 问题的解决方法。
你好,很高兴为你解答:
NTFS是WinNT以上版本支持的一种提供安全性、可靠性的高级文件系统。在Windows2000和WindowsXP中,NTFS还可以提供诸如文件和文件夹权限、加密、磁盘配额和压缩这样的高级功能。
一、加密文件或文件夹
步骤一:打开Windows资源管理器。
步骤二:右键单击要加密的文件或文件夹,然后单击“属性”。
步骤三:在“常规”选项卡上,单击“高级”。选中“加密内容以便保护数据”复选框
在加密过程中还要注意以下五点:
1要打开“Windows 资源管理器”,请单击“开始→程序→附件”,然后单击“Windows 资源管理器”。
2只可以加密NTFS分区卷上的文件和文件夹,FAT分区卷上的文件和文件夹无效。
3被压缩的文件或文件夹也可以加密。如果要加密一个压缩文件或文件夹,则该文件或文件夹将会被解压。
4无法加密标记为“系统”属性的文件,并且位于systemroot目录结构中的文件也无法加密。
5在加密文件夹时,系统将询问是否要同时加密它的子文件夹。如果选择是,那它的子文件夹也会被加密,以后所有添加进文件夹中的文件和子文件夹都将在添加时自动加密。
二、解密文件或文件夹
步骤一:打开Windows资源管理器。
步骤二:右键单击加密文件或文件夹,然后单击“属性”。
步骤三:在“常规”选项卡上,单击“高级”。
步骤四:清除“加密内容以便保护数据”复选框。
同样,我们在使用解密过程中要注意以下问题:
1要打开“Windows资源管理器”,请单击“开始→程序→附件”,然后单击“Windows资源管理器”。
2在对文件夹解密时,系统将询问是否要同时将文件夹内的所有文件和子文件夹解密。如果选择仅解密文件夹,则在要解密文件夹中的加密文件和子文件夹仍保持加密。但是,在已解密文件夹内创立的新文件和文件夹将不会被自动加密。
以上就是使用文件加、解密的方法!而在使用过程中我们也许会遇到以下一些问题,在此作以下说明:
1高级按钮不能用
原因:加密文件系统(EFS)只能处理NTFS文件系统卷上的文件和文件夹。如果试图加密的文件或文件夹在FAT或FAT32卷上,则高级按钮不会出现在该文件或文件夹的属性中。
解决方案:
将卷转换成带转换实用程序的NTFS卷。
打开命令提示符。键入:
Convert [drive]/fs:ntfs
(drive 是目标驱动器的驱动器号)
2当打开加密文件时,显示“拒绝访问”消息
原因:加密文件系统(EFS)使用公钥证书对文件加密,与该证书相关的私钥在本计算机上不可用。
解决方案:
查找合适的证书的私钥,并使用证书管理单元将私钥导入计算机并在本机上使用。
3用户基于NTFS对文件加密,重装系统后加密文件无法被访问的问题的解决方案(注意:重装Win2000/XP前一定要备份加密用户的证书):
步骤一:以加密用户登录计算机。
步骤二:单击“开始→运行”,键入“mmc”,然后单击“确定”。
步骤三:在“控制台”菜单上,单击“添加/删除管理单元”,然后单击“添加”。
步骤四:在“单独管理单元”下,单击“证书”,然后单击“添加”。
步骤五:单击“我的用户账户”,然后单击“完成”(如图2,如果你加密用户不是管理员就不会出现这个窗口,直接到下一步) 。
步骤六:单击“关闭”,然后单击“确定”。
步骤七:双击“证书——当前用户”,双击“个人”,然后双击“证书”。
步骤八:单击“预期目的”栏中显示“加密文件”字样的证书。
步骤九:右键单击该证书,指向“所有任务”,然后单击“导出”。
步骤十:按照证书导出向导的指示将证书及相关的私钥以PFX文件格式导出(注意:推荐使用“导出私钥”方式导出,这样可以保证证书受密码保护,以防别人盗用。另外,证书只能保存到你有读写权限的目录下)。
4保存好证书
注意将PFX文件保存好。以后重装系统之后无论在哪个用户下只要双击这个证书文件,导入这个私人证书就可以访问NTFS系统下由该证书的原用户加密的文件夹(注意:使用备份恢复功能备份的NTFS分区上的加密文件夹是不能恢复到非NTFS分区的)。
最后要提一下,这个证书还可以实现下述用途:
(1)给予不同用户访问加密文件夹的权限
将我的证书按“导出私钥”方式导出,将该证书发给需要访问这个文件夹的本机其他用户。然后由他登录,导入该证书,实现对这个文件夹的访问。
(2)在其也WinXP机器上对用“备份恢复”程序备份的以前的加密文件夹的恢复访问权限
将加密文件夹用“备份恢复”程序备份,然后把生成的Backupbkf连同这个证书拷贝到另外一台WinXP机器上,用“备份恢复”程序将它恢复出来(注意:只能恢复到NTFS分区)。然后导入证书,即可访问恢复出来的文件了。
WindowsXP中的文件加密功能及其使用
作者:lvvl 来源:赛迪网安全社区
Windows XP文件加密功能强大并且简单易用,因而许多用户都使用它来保护自己的重要文件。但由于大部分用户对该功能了解不足,在使用过程中经常出现问题,在本刊“电脑医院”中我们也频繁地收到读者的求助信,为此,CHIP在这里将特意为您详细介绍有关该功能的使用技巧。
微软在Windows2000中内建了文件加密功能,该功能后来被移植到WinXP中。使用该功能,我们只需简单地单击几下鼠标就可以将指定的文件或者文件夹进行加密,而且在加密后我们依然可以和没加密前一样方便地访问和使用它们,非常方便。而且加密后即使黑客侵入系统,完全掌握了文件的存取权,依然无法读取这些文件与文件夹。
但简单强大的文件加密功能也给许多用户带来了困扰。由于使用简单,许多用户都乐于使用它来保护自己的重要文件,但大部分用户由于缺乏对该功能的真正了解,在使用时泄密、无法解密等问题频繁发生,恰恰被加密的文件往往是重要的文件,影响非常大。为此,笔者特意整理了有关该功能的一些相关知识和使用技巧与您分享。
加密和解密文件与文件夹
Windows2000系列和WinXP专业版及Windows2003的用户都可使用内建的文件加密功能,但前提是准备加密的文件与文件夹所在的磁盘必须采用NTFS文件系统。同时要注意,由于加密解密功能在启动时还不能够起作用,因此系统文件或在系统目录中的文件是不能被加密的,如果 *** 作系统安装目录中的文件被加密了,系统就无法启动。另外,NTFS文件系统还提供一种压缩后用户可以和没压缩前一样方便访问文件与文件夹的文件压缩功能,但该功能不能与文件加密功能同时使用,使用ZIP、RAR等其他压缩软件压缩的文件不在此限。
加密时,只需使用鼠标右键单击要加密的文件或者文件夹,然后选择“属性”,在“属性”对话框的“常规”选项卡上单击“高级”按钮,在“高级属性”对话框上选中“加密内容以保护数据”复选框并确认即可对文件进行加密,如果加密的是文件夹,系统将进一步d出“确认属性更改”对话框要求您确认是加密选中的文件夹,还是加密选中的文件夹、子文件夹以及其中的文件。而解密的步骤与加密相反,您只需在“高级属性”对话框中清除“加密内容以保护数据”复选框上的选中标记即可(如图1),而在解密文件夹时将同样d出“确认属性更改”对话框要求您确认解密 *** 作应用的范围。
图1
加密后,用户可以像使用普通文件一样直接打开和编辑,又或者执行复制、粘贴等 *** 作,而且用户在加密文件夹内创建的新文件或从其他文件夹拷贝过来的文件都将自动被加密。被加密的文件和文件夹的名称将默认显示为淡绿色,如您的电脑上被加密的文件和文件夹的名称不是彩色显示,您可以单击“我的电脑|工具|文件夹选项”,然后在“文件夹选项”对话框中单击“查看”选项卡,选中“以彩色显示加密或压缩的NTFS文件”复选框即可。
赋予或撤销其他用户的权限
如果需要,您可赋予其他用户对加密文件的完全访问权限,但要明白,Windows所采用的是基于密钥的加密方案,并且是在用户第一次使用该功能时才为用户创建用于加密的密钥,因此您准备赋予权限的用户也必须曾经使用过系统的加密功能,否则将无法成功赋予对方权限。Windows内建的文件加密功能只允许赋予其他用户访问加密文件的完全权限,而不允许将加密文件夹的权限赋予给其他用户。
要赋予或撤销其他用户对加密文件的访问权限,可用鼠标右键单击已加密的文件,选择“属性”,在“属性”对话框的“常规”选项卡上单击“高级”按钮,在“高级属性”对话框中单击“详细信息”按钮,即可通过“添加”和“删除”按钮添加或删除其他可以访问该文件的用户。
备份密钥
有许多读者在系统发生故障或重新安装系统以后,无法再访问之前他们加密过的文件与文件夹而向本刊“电脑医院”求助。但此时为时已晚,Windows内建的加密功能与用户的账户关系非常密切,同时用于解密的用户密钥也存储在系统内,任何导致用户账户改变的 *** 作和故障都有可能带来灾难,要避免这种情况的发生,您必须未雨绸缪,在使用加密功能后马上备份加密密钥。
备份密钥的 *** 作并不复杂,您只需单击“开始|运行”,键入“certmgrmsc”打开证书管理器,在左边窗口中依次单击控制台,打开“证书-当前用户”下的“个人”中的“证书”,然后在右边窗口中用鼠标右键单击“预期目的”是“加密文件系统”的证书,指向“所有任务|导出”,系统将打开“证书导出向导”指引您进行 *** 作,向导将询问您是否需要导出私钥,您应该选择“导出私钥”,并按照向导的要求输入密码保护导出的私钥,然后选择存储导出后文件的位置即可完成。
建议您将导出的证书存储在系统盘以外的其他磁盘上,以避免在使用磁盘镜像之类的软件恢复系统时将备份的证书覆盖掉。备份后,当加密文件的账户出现问题或重新安装了系统后需要访问或解密以前加密的文件时,您只需要使用鼠标右键单击备份的证书,选择“安装PFX”,系统将d出“证书导入向导”指引您的 *** 作,您只需要键入当初导出证书时输入用于保护备份证书的密码,然后选择让向导“根据证书类型,自动选择证书存储区”即可完成,完成后就可以访问以前的加密文件了。
指定恢复代理
如果您同时使用多个账户或者与其他用户共用一台电脑,担心更换账户或者其他账户加密的文件出问题,那么您可以考虑指定一个文件故障恢复代理,恢复代理可以解密系统内所有通过内建加密功能加密的文件,一般用于网络管理员在网络上处理文件故障,并能使管理员在职员离职后解密职员加密的工作资料。在Win2000中,默认Administrator为恢复代理,而在WinXP上,如果需要恢复代理则必须自行指定。但需要注意,恢复代理只能够解密指定恢复代理后被加密的文件,所以您应该在所有人开始使用加密功能前先指定恢复代理。
如果您所使用的电脑是企业网络中的,那么您需要联系管理员查询是否已经制定了故障恢复策略,而如果您只是在使用一台单独的电脑,那么您可以按照下面的步骤指定恢复代理。首先,您需要使用准备指定为恢复代理的用户账户登录,申请一份故障恢复证书,该用户必须是管理员或者拥有管理员权限的管理组成员。对于企业网络上的电脑,登录后可以通过上面介绍过的“证书管理器”,在“使用任务”中的“申请新证书”中向服务器申请。而在个人电脑上,您必须单击“开始|附件|命令提示符”,在命令行窗口中键入“cipher /r:c:\efstxt”(efstxt可以是任一文件),命令行窗口将提示您输入保护证书的密码并生成我们需要的证书。生成的证书一个是PFX文件,一个是CER文件,先使用鼠标右键单击PFX文件,选择“安装PFX”,通过d出的“证书导入向导”选择“根据证书类型,自动选择证书存储区” 导入证书。
接下来再单击“开始|运行”,键入“gpeditmsc”打开组策略编辑器,在左边控制台上依次单击“本地计算机策略|计算机配置|Windows 设置|安全设置|公钥策略|加密文件系统”,然后在右边窗口中用鼠标右键单击选择“添加数据恢复代理”(如图2),然后在d出的“添加数据恢复代理向导”中浏览并选择刚才生成的证书中的CER文件,在键入保护证书的密码后,向导将导入证书,完成指定恢复代理的工作。完成后,在以后需要的时候,只需使用被指定为恢复代理的账户登录,就可以解密系统内所有在指定恢复代理后被加密的文件。
图2
禁止加密功能
在多用户共用电脑的环境下,我们往往通过将其他用户指定为普通用户权限,限制他们使用某些功能,但由于普通用户账户默认允许使用加密功能,因此在一些多用户共用的电脑上经常会带来一些困扰。如果担心电脑上其他用户乱加密磁盘上的文件,您可以设置特定的文件夹禁止被加密,也可以完全禁止文件加密功能。
如果您希望将某个文件夹设置为禁止加密,可以编辑一个文本文件,内容包括“[Encryption]”和“Disable=1”两行,然后命名为“Desktopini”,将其放到不希望被加密的文件夹中即可。当其他用户试图加密该文件夹时,系统将提示用户该文件夹加密功能被禁止。但需要注意,您只能使用这种方法禁止其他用户加密该文件夹,文件夹中的子文件夹将不受保护。
如果需要,您也可以完全禁止文件加密功能,在Win2000中,只需使用Administrator登录并运行“secpolmsc”打开策略编辑器,用鼠标右键单击左边控制台上的“安全设置|公钥策略|加密文件系统”,选择“属性”,在属性对话框上清除“允许用户使用文件加密系统(EFS)来加密文件”复选框上的选中标记,然后重新启动电脑即可。而在WinXP上虽然也有相应的选项,但实际上并不能够起作用,您需要通过编辑注册表来禁止文件加密功能。首先单击“开始|运行”,键入“regeditexe”打开注册表编辑器,依次单击 “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows NT\CurrentVersion\EFS”,再用鼠标右键单击建立一个“DWORD”值,双击新建的值并赋值为“1”,关闭注册表后重新启动电脑。这样,当其他用户试图使用文件加密功能时,系统将提示加密功能已被禁止(如图3)。
图3
防止泄密
由于对文件加密功能缺乏了解,许多读者对该功能是否能够真正发挥作用抱有怀疑态度,而另外一些用户却又因为过分地放心而导致泄密事件频繁发生。首先,对于该功能的加密效果您大可放心,不必因为在您使用加密文件时不需要输入密码而怀疑加密效果,在加密后能够透明地使用恰恰正是该功能的优点。虽然有一些第三方软件曾经成功地破解使用该功能加密的文件,但这种软件暂时对于Windows XP是无效的,而且即使在其他版本的Windows *** 作系统上,也是可以避免的。
但您需要小心由于自己的失误引起加密失效,也需要了解该功能的特点。Windows XP内建的文件加密功能与用户的账户是联系在一起的,换言之,如果您的Windows账户没有保护好,密码被其他人获得,那么对方也就可以像您一样登录系统访问加密的文件。另外,当已加密的文件被拷贝或者移动到非NTFS文件系统磁盘上时,文件将被解密。在文件通过网络传输时,也是以明文方式进行传输的。这些您都需要清楚,避免错误 *** 作引起泄密。而最主要的是加密后的文件并不是绝对安全的,虽然可以确保不被读取,但却无法避免被删除。
此外,在加密文件的过程中,系统将把原来的文件存储到缓冲区,然后在加密后将原文件删除。这些被删除掉的文件在系统上并不是不可能恢复的,通过磁盘文件恢复工具很有可能被恢复过来而造成泄密,此时您需要考虑通过其他磁盘安全工具,或者使用系统内建的“cipher”命令对磁盘上的已删除文件进行清除,具体的步骤是,单击“开始|附件|命令提示符”,在命令行窗口中键入“cipher /w C:\foldername”即可清除C盘foldername文件夹中已删除文件残留的碎片,如果不输入文件夹名称则将对整个磁盘进行清理。
疑难排解
当您的Windows登录账户变更而无法访问已加密的文件时,由于用户的账户名称或者密码变更时将无法与原来的加密证书联系上,因而您需要考虑是否在使用其他账户时更改了当前账户的名称或者密码?又或者是管理员进行了这样的 *** 作?如果的确如此,您可以尝试将自己的账户名称和密码更改成原来的,问题应该能够解决。但需要注意,根据微软的说法,改回账户名称与密码的方法在管理员账户上可能无效,而且如果您的账户并不是改变而是被删除后重建,也就是说是一个全新的账户,那么您只能够求助于恢复代理或者导入备份的证书。
如果您已经重新格式化了硬盘、重新安装了系统又或者使用尚未加密文件时的系统盘镜像恢复了系统而导致无法访问加密文件,那么您只能够通过导入自己的证书或者恢复代理的方法来解决问题,这时基本上已经没有其他方法可以帮助您取回文件。另外,Windows XP SP1版后使用了新的加密算法,如果您加密时使用的是Windows XP SP1版本,那么当您尝试挽救数据时也应该使用该版本,或者未来的更新版本,否则在其他版本上乱试,加密文件可能会损毁。
系统安全 深入理解加密文件系统EFS
微软在NTFS40及后续版本的文件系统中,捆绑了两个功能强大的工具:压缩文件系统和加密文件系统。这个选项在文件夹的属性-高级里面。是一个单选框。压缩文件系统在这里就不多提了,不过有一点,可能有心的朋友注意得到,就是这两个选项不可以同时选。这个原因很简单,因为不论是加密文件还是压缩文件,我们都是在改变文件,我们通过改变他们的读码框架来加密或者压缩文件。这里可能有人要问,WinRAR为什么可以及加密文件又压缩文件。其实WinRAR加密的方法是在基于WinRAR这个文件压缩系统,而不是基于文件本身。我们还是言归正传。
这里面要提到的一点叫做加密方式。相信有些朋友对Alice和Bob这两个名字非常熟悉,这两个名字最早用于IBM出版的一本图书中,用来解释对称加密和非对称加密。对称加密,简单一点说就是加密所使用的密码和解密所使用的密码是同一个密码。非对称呢,加密使用的和解密是不同的密码。这个不同的密码,一个被称为私钥,另一个就是公钥。从名字上面可以看出来,私钥,是无论如何不会公开的,公钥,则是发布出去的。
详细解释一下,熟悉非对称加密的朋友可以跳过这一段。egAlice要发送一份敏感数据给BOB,显然需要加密。非对称加密,使用两个不同的密码加密和解密。就是说,如果alice的公钥和私钥为一组密码,分别是alice的公钥和alice的私钥。那么,用alice公钥加密的东西只有使用alice的私钥可以解密,对应的,如果使用alice公钥加密的东西,只有alice的私钥可以解开。那么对于bob也是一样。如果我们采用对称加密的方法,也就是加密和解密的过程使用的是一个密码,那么这个密码是无论如何不能被第三方截获的。互联网络,可以截获;电话,可以监听;甚至当面交换,都可以被窃听。所以这是对称加密的一个重大缺陷。如果采用非对称加密,alice和bob都不公开自己的私钥,然后他们在交换信息前,互相交换公钥。这样,alice使用bob的公钥加密alice要给bob的文件,这个使用bob公钥加密过的文件,仅有bob的私钥可以解开。而bob从来没有公开过他的私钥,所以,我们看到,这样的加密,是安全的。这个信息加密解密,交换公钥的过程,就是非对称加密。
解释过非对称加密,我们也可以简单的比较出两者在安全性上的优越性。不过非对称加密一个重要的缺陷,就是运算时间很长,对称加密在工作效率上可能是非对称加密的100-1000倍。所以微软也是在看到这一点后,在EFS中集成了两者的优点。EFS使用了对称加密和非对称加密结合的工作方式,即先生成一个字符串作为密钥采用对称加密方法加密文件,然后,再使用非对称加密加密这个密钥。这个密钥具体位数我记不得了,大约在70位。这里出现一个问题,实际在 *** 作系统中,公钥和私钥是怎么获得的?为什么管理员可以解开所有用户的加密文件?
依照微软的白皮书中解释,加密文件系统中的用户证书的获得,有两种途径,一个是从CA(CertificationAuthority)获得,另一种是在企业级CA失效的时候由本机为自己颁发一个数字证书。这里需要解释的是证书和密钥的关系,证书是密钥的载体,在证书中包含了密钥。这里可能又有人要问,用户的私钥是存放在什么地方?用户的私钥是通过另外一种验证机制实现的,这个在系统层面,日后我会写文章加以阐释。除了这两个密钥,还有一个用于直接加密文件的密钥,这个根据用户自己的SID计算出来的,微软没有公开这方面的信息,还请有心人共同尝试理解其中的工作原理。管理员之所以可以管理所有用户的加密文件,是为了保证系统的稳定,如果每一个用户的文件都只有创建者可以修改,那么计算机可能因此陷入混乱的状态。
近日听闻有些软件可以破解微软的EFS,我本为之兴奋,结果下载后研究了一下,这种软件的工作原理是备份出管理员的帐户信息,通过ERA(紧急恢复代理)实现加密文件的恢复。事实上,如果用户不慎在重新安装系统的时候忘记备份出相应的密钥,那么这个加密过的文件可能永远打不开。这一点不难理解,因为每一次安装 *** 作系统, *** 作系统会随即生成一个SID号,当然,如果用户的人品足够好,还是可能生成一样的SID号的(开个玩笑)。关于备份管理员账号和密码,可以通过Windows2000及后续版本中内建的忘记密码向导来帮助备份密码。希望可以给大家一些帮助
可以使用XCACLS来给相应的sid赋予读写C盘的权限。
XCACLS 是微软提供的一款文件及目录访问控制列表的命令行加强工具
你可以在下面的地址下载到:
>
尊敬的金山网络用户您好:
如果主程序打开的话进程是两个drivergeniusexe和dgserviceexe,如果主程序没有打开的话进程只有dgserviceexe。
感谢您的支持,祝您生活愉快!
如仍有疑问,欢迎您向金山企业知道提问
我用我的小办桶水来讲讲我的意见,SID才是ORACLE核心提供的东西,任何的数据库最终访问的承受者,在初始安装是建议你配的就是就是这个SERVICE NAME是服务名,好象是在服务培植文件中定义的可以是在ORACLE服务器端定义,也可以是在客户端配置一个让它指向服务器上的服务,客户端的应用程序就可以通过本身的服务名进行服务了用数据库的观点是,数据库服务器可有多哥SID,SID可有多个SERVICE_NAME
要想获取进程的用户名和账号,应首先调用OpenProcessToken打开进程的令牌(Token),打开方式设为TOKEN_QUERY,然后将TOKEN_INFORMATION_CLASS设为 TokenUser调用GetTokenInformation枚举进程的令牌信息块SID,通常称为安全标识(Security Identifier),最后调用LookupAccountSid从SID中检索用户名和账号。
char buf[256], szUser[128], szComputer[128];
HANDLE hProcess, hToken;
DWORD cbUser, cbComputer;
SID_NAME_USE snu;
if(ProcessID <= 0x0c)
显示用户名为"SYSTEM";
Else
显示用户名为"SERVICE ";
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessID);
OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);
cbComputer=sizeof(szComputer);
LookupAccountSid(NULL, (DWORD )((DWORD )buf), szUser,
&cbUser, szComputer, &cbComputer, &snu);
CloseHandle(hToken);
CloseHandle(hProcess);
示例里,已经把所有进程相关信息保存在ll_processes[]数组里
进程名字列表在lb_1里
知道进程名字,调用
ll_hprocess = OpenProcess(PROCESS_ALL_ACCESS, 0, ll_processes[ll_index])
可以得到你进程的句柄
然后:
OpenProcessToken(ll_hprocess , TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenUser, &buf, 256, &cbUser);
cbComputer=sizeof(szComputer);
LookupAccountSid(NULL, (DWORD )((DWORD )buf), szUser, &cbUser, szComputer, &cbComputer, &snu);
则 用户名和账号分别到存放变量szUser和szComputer中。
OpenProcessToken GetTokenInformation LookupAccountSid 我只找到了函数原型,没有找到如何在PB中声明。
-----------------
BOOL OpenProcessToken( __in HANDLE ProcessHandle, //要修改访问权限的进程句柄 __in DWORD DesiredAccess, //指定你要进行的 *** 作类型 __out PHANDLE TokenHandle //返回的访问令牌指针 );
BOOL WINAPI GetTokenInformation(
__in HANDLE TokenHandle,
__in TOKEN_INFORMATION_CLASS TokenInformationClass,
__out_opt LPVOID TokenInformation,
__in DWORD TokenInformationLength,
__out PDWORD ReturnLength
);
别名:LookupAccountSidA
库名:advapi32dll
说明:
返回值:
实例:
参数表:
声明:Declare Function LookupAccountSid Lib "advapi32dll" Alias "LookupAccountSidW" (ByVal lpSystemName As Any, Sid As Any, Name As Any, cbName As Long, ReferencedDomainName As Any, cbReferencedDomainName As Long, peUse As Integer) As Long
以上就是关于defaultServiceManager介绍全部的内容,包括:defaultServiceManager介绍、windows server 2003更改SID后,导致在系统启动时至少有一个服务或驱动程序产生错误、windows10文件驱动过滤等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)