前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了hosts文件,病毒通过劫持这个文件来达到劫持你的域名的目的,很有可能你输入了www.baidu.com,访问的却是一个带颜色的网站,并稀里哗啦在后台下了上百个病毒,扯远了,呵呵。

其实sdk里面有个API能够使你在ring3层通过拷贝文件句柄给另外一个进程的方式来达到占用某个文件的目录(ring3层就是应用层),编程实现也不难,不过可能有些用户权限不够,访问不了某些系统进程,这在开始就要有一个提权限的过程了。

提权限的代码如下:

  1. // -------------------------------------------------------------------------
  2. // 函数       : RaiseToDebugP
  3. // 功能       : 提升进程权限到debug权限
  4. // 返回值  : void
  5. // 附注       : 该函数就是提升调用进程的权限到DEBUG权限
  6. // -------------------------------------------------------------------------
  7. void RaiseToDebugP()
  8. {
  9. HANDLE hToken;
  10. // 获取当前进程句柄
  11. HANDLE hProcess = GetCurrentProcess();
  12. // 打开当前进程的Token,就是一个权限令牌,第二个参数可以用TOKEN_ALL_ACCESS
  13. if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  14. {
  15. TOKEN_PRIVILEGES tkp;
  16. if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))
  17. {
  18. tkp.PrivilegeCount = 1;
  19. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  20. //通知系统修改进程权限
  21. BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
  22. }
  23. CloseHandle(hToken);
  24. }
  25. }

再调用下面的代码之前,先调用上面的函数。

关键地方就是DuplicateHandle这个API的使用,它的具体功能和使用方法大家可以去查MSDN,这里我就不说了,下面的代码有详细的代码说明,关键是首先要找一个系统的常驻进程像system,svchost.exe和system idle process之类的,然后打开一个文件,在把这个文件的句柄拷贝给这个系统进程,这样在自身进程退出之后,某个系统进程仍然持有这个文件的句柄,这样其他的进程再去打开的时候就会被拒绝了。

  1. // -------------------------------------------------------------------------
  2. // 函数       : OccupyFile
  3. // 功能       : 打开一个文件句柄,然后和system进程共享该句柄
  4. // 返回值  : BOOL
  5. // 参数       : LPCTSTR lpFileName
  6. // 附注       :
  7. // -------------------------------------------------------------------------
  8. BOOL OccupyFile(LPCTSTR lpFileName)
  9. {
  10. BOOL    bRet;
  11. // 提升权限
  12. RaiseToDebugP();
  13. // 打开syetem进程,2000下PID是8,没有去看,也许吧,打开的时候必须赋予PROCESS_DUP_HANDLE权限
  14. HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 5776);    // 4为system进程号
  15. if (hProcess == NULL)
  16. {
  17. hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 8);
  18. if (hProcess == NULL)
  19. return FALSE;
  20. }
  21. HANDLE hFile;
  22. HANDLE hTargetHandle;
  23. // 创建一个文件,当然这个文件可以是本来就存在的
  24. hFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_EXECUTE | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  25. if (hFile == INVALID_HANDLE_VALUE)
  26. {
  27. // 文件创建或打开失败
  28. CloseHandle( hProcess );
  29. return FALSE;
  30. }
  31. // 这个是关键的API调用了,复制句柄操作
  32. // 这里复制句柄的这个API还有些其他的用法,可以获取当前进程或线程的真实句柄
  33. bRet = DuplicateHandle(GetCurrentProcess(),                                 // 拥有源句柄的那个进程的句柄,这里就是当前进程
  34. hFile,                                              // 指定对象的句柄,也就是要拷贝的句柄
  35. hProcess,                                           // 即将拥有新对象句柄的一个进程的句柄,这是是system进程的句柄
  36. &hTargetHandle,                                     // 指定用于装载新句柄的一个长整型变量
  37. 0,                                                  // 新句柄的安全访问级别
  38. FALSE,                                              // 是否可以继承
  39. DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE      //
  40. );
  41. CloseHandle(hProcess);
  42. return bRet;
  43. }

vista下system的进程ID不是4,如果想结束文件被占有,可以使用unlock,pocessxp之类的小工具,vista下面比较奇怪的是,直接用unlock还要重启后才能有效果。

http://blog.csdn.net/magictong/article/details/2944076

ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)相关推荐

  1. python复制文件的方法是_Python中复制文件的9种方法

    Python 中有许多"开盖即食"的模块(比如 os,subprocess 和 shutil)以支持文件 I/O 操作.在这篇文章中,你将会看到一些用 Python 实现文件复制的 ...

  2. python的文件读写方法有哪些_python读写文件的方法有哪些

    python读写文件的方法有哪些 发布时间:2020-08-07 11:58:05 来源:亿速云 阅读:87 作者:小新 这篇文章主要介绍python读写文件的方法有哪些,文中介绍的非常详细,具有一定 ...

  3. mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置

    默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题. 首先要说明一下,这些文件都是mysql的日志文件,如 ...

  4. 计算机用户文件夹怎么改名称,win10修改用户名文件夹方法_win10怎么改用户文件夹名称-win7之家...

    我们都知道,在win10系统中,用户文件夹通常都是放置在系统中,能够方便用户进行查找,可是近日有些用户总觉得自己电脑中的用户文件夹名称很是普遍,因此就想要进行修改,那么win10怎么改用户文件夹名称呢 ...

  5. 【LaTex】利用ins文件和dtx文件生成cls或sty文件,latex宏包的生成与创建方法;配置宏包文件的方法,latex宏包文件放置目录

    一.宏包文件无法找到 在编译tex文件时,如果宏包文件并不在配置目录中,就会发出类似[LaTeX Error: File `pageno.sty' not found.]的错误. 二.解决方法就是自己 ...

  6. win10删除休眠文件的方法是什么_windows10休眠文件怎么删除

    原文地址::http://www.xitongcheng.com/jiaocheng/win10_article_61789.html 相关文章 1.win10如何删除电脑休眠文件hiberfil.s ...

  7. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...

  8. mac 安装exe文件的方法 mac怎么安装exe文件

    朋友新入MacBook Pro,选购和适应过程中遇到一些困扰,回想我刚开始接触苹果电脑时候也各种懵逼,所以就把能想到的tips都总结下好啦,希望可以帮助到你就最好了.总之呢,大家都有第一次,都是从不熟 ...

  9. 固态硬盘文件恢复方法有哪些?四种恢复方法助您解忧

    固态硬盘简称ssd,又叫固态驱动器,而固态硬盘对比机械硬盘,它的读取速度更快.耐摔耐震,但是不论是什么设备或多或少都会出现文件丢失问题,那么固态硬盘文件怎么找回来?固态硬盘文件恢复方法有哪些呢?下面小 ...

最新文章

  1. c语言hook内核作用,hook内核函数的基本方法(附代码,经测试不蓝屏)
  2. 如何理解虚表及其计算含虚函数的类的大小
  3. android handler封装_Handler都没搞懂,你拿什么去跳槽啊?!
  4. win7系统5分钟就会自动注销的解决教程
  5. 单基因gsea_这篇3+分核心基因筛选,点个在看,我们复现这篇文章!
  6. Hybrid Data Fusion (HDF)——数据融合
  7. svn访问方式 linux,ssh+svn 方式访问svn
  8. vue routes路由
  9. 穷人和富人在处事方式上的区别
  10. PR视频旋转处理方法
  11. 内存碎片产生原因及解决方法
  12. 全面了解小微信贷风控
  13. 使用c语言打印九九乘法表
  14. No service of type FactoryLoggingManagerInternal available in ProjectScopeServices.
  15. Java网络编程并实现一对一聊天室功能
  16. 设计word模板添加书签
  17. ajax实现直播功能,jquery实现直播弹幕效果
  18. 直播画面已被主播锁定!输入正确的密码后可解锁画面。斗鱼直播主播锁定画面解锁方法(网页版)
  19. R语言独立性检验-基础
  20. Invalid bound statement (not found): com.example.demo.mapper.getUser.

热门文章

  1. TRIZ系列(发明的层次)
  2. 【YOLOv5实战3】基于YOLOv5的交通标志识别系统-模型训练
  3. 设计模式——桥接模式实验报告
  4. MacBook键盘无法正常工作?故障排除指南
  5. 爬虫之爬取网贷之家在档P2P平台基本数据并存入数据库
  6. python限制输入类型_《计算机二级Python语言程序设计考试》第3章:基本数据类型...
  7. noip2012 摆花 (动态规划)
  8. oppovivo会用鸿蒙系统么,鸿蒙系统风头无两,小米、OPPO、vivo会采用吗?
  9. Linux less命令
  10. 快讯:好奇号传回信息,凿岩工作准备完毕