R3文件占坑大法

本文来自PEDIY

 

 1 #include <windows.h>
 2 #include <stdio.h>
 3 
 4 BOOL OccupyFile( LPCTSTR lpFileName );
 5 
 6 
 7 int main()
 8 {
 9     OccupyFile(L"C:\\1.txt");
10     system("pause");
11     return 0;
12 }
13 
14 
15 void RaiseToDebugP()
16 {
17     HANDLE hToken;
18     HANDLE hProcess = GetCurrentProcess();
19     if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
20     {
21         TOKEN_PRIVILEGES tkp;
22         if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
23         {
24             tkp.PrivilegeCount = 1;
25             tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
26 
27             BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
28         }
29         CloseHandle(hToken);
30     }    
31 }
32 
33 BOOL OccupyFile( LPCTSTR lpFileName )
34 {
35     BOOL    bRet;
36 
37     RaiseToDebugP();
38 
39     HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4为system进程号
40 
41     if ( hProcess == NULL )
42     {
43         hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);        // 2K下是 8??
44 
45         if ( hProcess == NULL )
46             return FALSE;
47     }
48 
49     HANDLE hFile;
50     HANDLE hTargetHandle;
51 
52     hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);    
53 
54 
55     if ( hFile == INVALID_HANDLE_VALUE )
56     {
57         CloseHandle( hProcess );
58         return FALSE;
59     }
60 
61     bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle, 
62         0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
63 
64     CloseHandle( hProcess );
65 
66     return bRet;
67 }

The DuplicateHandle function duplicates an object handle. The duplicate handle refers to the same object as the original handle.Therefore, any changes to the object are reflected through both handles.For example, the current file mark for a file handle is always the same for both handles.
BOOL DuplicateHandle(
  HANDLE hSourceProcessHandle,  // handle to source process
  HANDLE hSourceHandle,         // handle to duplicate
  HANDLE hTargetProcessHandle,  // handle to target process
  LPHANDLE lpTargetHandle,      // duplicate handle
  DWORD dwDesiredAccess,        // requested access
  BOOL bInheritHandle,          // handle inheritance option
  DWORD dwOptions               // optional actions
);
hTargetProcessHandle 
Handle to the process that is to receive the duplicated handle. The handle must have PROCESS_DUP_HANDLE access. 

==============

其实就是把该文件的句柄(真正的句柄)复制给了system进<vb_highlight>程。更详细的东西可以查看windows programming application。

==============

函数比较:

GetCurrentProcess():

GetCurrentProcess得到得到的称之为"伪句柄"
只是一个标识,你可以发现,其实就是返回$FFFFFFFF,
每个进<vb_highlight>程得句柄都是一样得,只是实用于进<vb_highlight>程内部得使用.
如果你想得到实际得句柄,在进<vb_highlight>程间进行通讯,必需要进行转化,
调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭.
其实,你应该明白了为何"伪句柄"得存在,就是使用简单,不用关闭,
不会造成内存泄漏.

同样道理,GetCurrentThread也是伪句柄,其值永远是$FFFFFFFE,只是适用于线内部得使用.


DuplicateHandle() :

在系统中,对象分两类:核心对象和用户对象.如进<vb_highlight>程对象,线对象,文件映射 
对象等就是核心对象;而向窗口,菜单等都是用户对象. 
两者是有差别的,用于标示用户对象的句柄是系统唯一的,也就是说,一个进<vb_highlight>程 
完全可以对另外一个进<vb_highlight>程中的用户对象进行操作,比如两个进<vb_highlight>程间通信的方法之一, 
就是发送消息.正是由于窗口是用户对象,所以句柄是系统唯一,通过FindWindow(), 
得到另外一个进<vb_highlight>程的窗口句柄,然后用SendMessage(),让hWnd的窗口过来处理消 
息,实现了进<vb_highlight>程间的通信.因此,对于用户对象,你根本不用DuplicateHandle(),直接 
把句柄拿来用就行了. 
而核心对象则不一样.核心对象是为了加强系统的稳定性,因此,核心对象句柄是 
进<vb_highlight>程相关的,在每一个进<vb_highlight>程中都有一个核心对象表,每一个对象的索引(不完全是)作为内和对象的句柄,从而实现进<vb_highlight>程相关.同一个对象在不同的进<vb_highlight>程中可能有不同的索引,即句柄.对核心对象进行操作时,系统还要进行安全检验,看一下你是否有权来操作这个对象.因此你不能同用户对象一样,直接把句柄拿过来用.比方说,你想操作另一个进<vb_highlight>程中的文件映射对象,这个文件映射对象句柄在那个进<vb_highlight>程中假设是0x000001,但在你的进<vb_highlight>程中,很有可能0x00000001时表示另一个核心对象,此时的操作就永远不会成功,甚至会产生灾难性的后果.此时,就有必要用DuplicateHandle().

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值