ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)
前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了hosts文件,病毒通过劫持这个文件来达到劫持你的域名的目的,很有可能你输入了www.baidu.com,访问的却是一个带颜色的网站,并稀里哗啦在后台下了上百个病毒,扯远了,呵呵。
其实sdk里面有个API能够使你在ring3层通过拷贝文件句柄给另外一个进程的方式来达到占用某个文件的目录(ring3层就是应用层),编程实现也不难,不过可能有些用户权限不够,访问不了某些系统进程,这在开始就要有一个提权限的过程了。
提权限的代码如下:
- // -------------------------------------------------------------------------
- // 函数 : RaiseToDebugP
- // 功能 : 提升进程权限到debug权限
- // 返回值 : void
- // 附注 : 该函数就是提升调用进程的权限到DEBUG权限
- // -------------------------------------------------------------------------
- void RaiseToDebugP()
- {
- HANDLE hToken;
- // 获取当前进程句柄
- HANDLE hProcess = GetCurrentProcess();
- // 打开当前进程的Token,就是一个权限令牌,第二个参数可以用TOKEN_ALL_ACCESS
- if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
- {
- TOKEN_PRIVILEGES tkp;
- if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))
- {
- tkp.PrivilegeCount = 1;
- tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- //通知系统修改进程权限
- BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
- }
- CloseHandle(hToken);
- }
- }
再调用下面的代码之前,先调用上面的函数。
关键地方就是DuplicateHandle这个API的使用,它的具体功能和使用方法大家可以去查MSDN,这里我就不说了,下面的代码有详细的代码说明,关键是首先要找一个系统的常驻进程像system,svchost.exe和system idle process之类的,然后打开一个文件,在把这个文件的句柄拷贝给这个系统进程,这样在自身进程退出之后,某个系统进程仍然持有这个文件的句柄,这样其他的进程再去打开的时候就会被拒绝了。
- // -------------------------------------------------------------------------
- // 函数 : OccupyFile
- // 功能 : 打开一个文件句柄,然后和system进程共享该句柄
- // 返回值 : BOOL
- // 参数 : LPCTSTR lpFileName
- // 附注 :
- // -------------------------------------------------------------------------
- BOOL OccupyFile(LPCTSTR lpFileName)
- {
- BOOL bRet;
- // 提升权限
- RaiseToDebugP();
- // 打开syetem进程,2000下PID是8,没有去看,也许吧,打开的时候必须赋予PROCESS_DUP_HANDLE权限
- HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 5776); // 4为system进程号
- if (hProcess == NULL)
- {
- hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 8);
- if (hProcess == NULL)
- return FALSE;
- }
- HANDLE hFile;
- HANDLE hTargetHandle;
- // 创建一个文件,当然这个文件可以是本来就存在的
- hFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_EXECUTE | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile == INVALID_HANDLE_VALUE)
- {
- // 文件创建或打开失败
- CloseHandle( hProcess );
- return FALSE;
- }
- // 这个是关键的API调用了,复制句柄操作
- // 这里复制句柄的这个API还有些其他的用法,可以获取当前进程或线程的真实句柄
- bRet = DuplicateHandle(GetCurrentProcess(), // 拥有源句柄的那个进程的句柄,这里就是当前进程
- hFile, // 指定对象的句柄,也就是要拷贝的句柄
- hProcess, // 即将拥有新对象句柄的一个进程的句柄,这是是system进程的句柄
- &hTargetHandle, // 指定用于装载新句柄的一个长整型变量
- 0, // 新句柄的安全访问级别
- FALSE, // 是否可以继承
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE //
- );
- CloseHandle(hProcess);
- return bRet;
- }
vista下system的进程ID不是4,如果想结束文件被占有,可以使用unlock,pocessxp之类的小工具,vista下面比较奇怪的是,直接用unlock还要重启后才能有效果。
http://blog.csdn.net/magictong/article/details/2944076
ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)的更多相关文章
- 与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件
与改写url取文件的方法:NetworkRequest和DataAccessSerivice 文件 CMDNMapDataCache.cpp 读取二进制代码的方法
- iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
时间2013-08-20 12:49:20 GoWhich原文 http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...
- mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题. 首先要说明一下,这些文件都是mysql的日志文件,如 ...
- 使用java 程序创建格式为utf-8文件的方法(写入和读取json文件)
使用java 程序创建格式为utf-8文件的方法: try{ File file=new File("C:/11.jsp"); ...
- 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...
- java、android 对比两个目录或文件是否是同一个目录或文件的方法
由于软链接及android的外部卡mount方式存在,导致一个文件夹可能同时有两个路径,如: /mnt/sdcard1 /storage/ext_sdcard ,如果通过某种方式(如moun ...
- Linux删除乱码文件的方法
当文件名为乱码的时候,无法通过键盘输入文件名,所以在终端下就不能直接利用rm,mv等命令管理文件了. 我们可以通过以下几种方法删除linux下的乱码文件.(文件名为乱码) l 方法1 我们知道每个文 ...
- C语言对文件的读写操作以及处理CSV文件的方法
#include <stdio.h> #define F_PATH "d:\myfile\file.txt" int main(void) { FILE *fp = N ...
- C#中准确跟踪错误异常所在的文件位置方法
准确跟踪错误异常所在的文件位置方法是在发布改文件所在的DLL时候,把对应的pdb文件也一同发布. pdb文件是:PDB全称Program Database,不知道中文翻译叫什么.相信使用过VS的人对于 ...
随机推荐
- 【严肃脸】使用caffe实现色情图片的识别
前言 前几天看到了雅虎开源了一个色情图片的识别模型新闻,上Github一看,是基于caffe的.试了试,模型效果很赞.Github地址:https://github.com/yahoo/open_ns ...
- Canvas范围裁切和几何变换
范围裁切 clipRect() canvas.save(); canvas.clipRect(left, top, right, bottom); canvas.drawBitmap(bitmap, ...
- Web报表进度条显示
创建插件 <script src="../CreateControl.js" type="text/javascript"></script& ...
- Redis实战:如何构建类微博的亿级社交平台
微博及 Twitter 这两大社交平台都重度依赖 Redis 来承载海量用户访问.本文介绍如何使用 Redis 来设计一个社交系统,以及如何扩展 Redis 让其能够承载上亿用户的访问规模. 虽然单台 ...
- 窗体的基类中没有设定大小,所以才不能居中,若要窗体居中,必须使用setfixedsize()函数或者resize()函数设定窗体的大小,居中才能正常使用
最近开发中,遇到了窗体不能居中的问题,看了网上的很多文章,窗口居中,无非都是move至窗口的中心目标; 有两种方式, 一种在构造函数中直接计算中心坐标; 另一种是在窗口show后再move至相应坐标. ...
- WPF中取得系统字体列表
原文:WPF中取得系统字体列表 在GDI+中,我们可以通过如下方式取得系统所有字体: foreach(FontFamily f in FontFamily.Families){ // 处理代码} ...
- WPF实现抽屉效果
原文:WPF实现抽屉效果 界面代码(xaml): <Window x:Class="TransAnimation.MainWindow" xmlns="http:/ ...
- 怎么快速构建自己的C/C++程序?——有关编译、静态链接和SCons
怎么快速构建自己的C/C++程序?--有关编译.静态链接和SCons 1. 写在前面 最初写C++是在Visual Studio这个IDE里,那时我并没有makefile的概念,对程序的编译和链接的一 ...
- WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口
原文:WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口 如果无人触摸:60s自动关闭窗口 xmal:部分 <s:SurfaceWindow x:Class=&qu ...
- ASP .NET Views文件夹下面的文件找不到
习惯将页面和它对应的js,css文件放在一个文件夹下,将这些都放在Views文件夹下 运行的时候发现找不到js和css文件 因为在MVC中,是不建议直接去访问Views文件夹的我们建立的ASP ...