前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持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. 与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件

    与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件 CMDNMapDataCache.cpp  读取二进制代码的方法

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

    时间2013-08-20 12:49:20 GoWhich原文  http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...

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

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

  4. 使用java 程序创建格式为utf-8文件的方法(写入和读取json文件)

    使用java 程序创建格式为utf-8文件的方法:  try{            File file=new   File("C:/11.jsp");              ...

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

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

  6. java、android 对比两个目录或文件是否是同一个目录或文件的方法

    由于软链接及android的外部卡mount方式存在,导致一个文件夹可能同时有两个路径,如: /mnt/sdcard1      /storage/ext_sdcard ,如果通过某种方式(如moun ...

  7. Linux删除乱码文件的方法

    当文件名为乱码的时候,无法通过键盘输入文件名,所以在终端下就不能直接利用rm,mv等命令管理文件了. 我们可以通过以下几种方法删除linux下的乱码文件.(文件名为乱码) l  方法1 我们知道每个文 ...

  8. C语言对文件的读写操作以及处理CSV文件的方法

    #include <stdio.h> #define F_PATH "d:\myfile\file.txt" int main(void) { FILE *fp = N ...

  9. C#中准确跟踪错误异常所在的文件位置方法

    准确跟踪错误异常所在的文件位置方法是在发布改文件所在的DLL时候,把对应的pdb文件也一同发布. pdb文件是:PDB全称Program Database,不知道中文翻译叫什么.相信使用过VS的人对于 ...

随机推荐

  1. Smart internet of things services

    A method and apparatus enable Internet of Things (IoT) services based on a SMART IoT architecture by ...

  2. 调制:调幅(AM)与调频(FM)

    AM:amplitude modulation,幅度调制: FM:Frequency Modulation,频率调制: 1. 为什么要调制 MW:Medium Wave,中波,SW:Short Wav ...

  3. URAL 1577. E-mail(简单二维dp)

    给你两个子串,让你找出来一个最短的字符串包括这两个子串,输出最多的子串有多少种. 类似于最长公共子序列,相等的话长度+1,不想等的话比較长度,使用长度小的. 1577. E-mail Time lim ...

  4. Delphi程序员如何找到高薪的工作?(赚不到钱,原因只有一个,就是他们没有被公司录取。Delphi必须要独自进行深入研究,才能精通,同时也不能自由性太强)

    转帖自:http://www.tommstudio.com/ViewNews.aspx?ID=187http://hi.baidu.com/rarnu/blog/ 本文翻译自<美国优秀经理观念大 ...

  5. Leetcode 136 Single Number 亦或

    题意就是从一堆数中找出唯一的一个只存在一个的数.除了那个数,其他的数都是两个相同的数. 通过亦或的性质: 1)a^a = 0 0^a = a 2)交换律 a^b = b^ a 3)结合律 (a^b)^ ...

  6. 简明Python3教程 2.序言

    Python也许是为数不多的既简单又强大的编程语言.这有利于新手甚至于专家,更重要的是用它编程所带来的乐趣. 这本书的目的是帮助您了解这种神奇的语言,展示如何快速而轻松地完成事情——事实上”编程问题的 ...

  7. 方阵的迹(trace)及其微分(导数)

    trace 的一个十分重要的性质在于线性性, Tr(A+B)=Tr(A)+Tr(B)Tr(cA)=cTr(A) 1. 基本性质 Tr(A)=Tr(AT) Tr(AB)=Tr(BA) Tr(ABC)=T ...

  8. WPF使用DynamicDataDisplay.dll显示CPU及内存使用曲线

    原文:WPF使用DynamicDataDisplay.dll显示CPU及内存使用曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshub ...

  9. 卷积(convolution)与相关(correlation)(matlab 实现)

    1. 卷积(convolution) 输出 y(n) 是作为在 x(k) 和 h(n−k)(反转和移位)重叠之下的样本和求出的. 考虑下面两个序列: x(n)=[3,11,7,0,−1,4,2],−3 ...

  10. Mac OS X通过结合80port

    Mac OS X 由于要绑定80port须要ROOT权限, 可是假设用root权限启动eclipse或tomcat又会造成, 启动创建的各类文件是root的,普通用户无法删除. 为此. 我们能够通过p ...