可不可以下代碼用 VB 來實現
原理是以独占的方式打开文件,再把文件句柄复制到另一个程序中去,达到本程序退出后目标文件仍被打开的目的  这是delphi代码:  program createfile;  
uses  
  Windows, SysUtils;  
//提权函数  
procedure SetPrivilege;  
var  
  TPPrev, TP: TTokenPrivileges;  
  TokenHandle: THandle;  
  dwRetLen: DWORD;  
  lpLuid: TLargeInteger;  
begin  
  OpenProcessToken(GetCurrentProcess, TOKEN_ALL_ACCESS, TokenHandle);  
  if (LookupPrivilegeValue(nil, ’SeDebugPrivilege’, lpLuid)) then  
  begin  
    TP.PrivilegeCount := 1;  
    TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
    TP.Privileges[0].Luid := lpLuid;  
    AdjustTokenPrivileges(TokenHandle, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);  
  end;  
  CloseHandle(TokenHandle);  
end;  
procedure OccupyFile(lpFileName: string);  
var  
  hProcess, hFile, hTargetHandle: thandle;  
begin  
 //打开一个pid为4的进程,只要是存在的进程,都可以  
  hProcess := OpenProcess(PROCESS_DUP_HANDLE, FALSE, 4);  
  if (hProcess = 0) then exit;  
  //以独占模式打开目标文件  
  hFile := CreateFileA(PChar(lpFileName), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  
  if (hFile = INVALID_HANDLE_VALUE) then  
  begin  
    CloseHandle(hProcess);  
    exit;  
  end;  
  //把文件句柄复制到pid=4的进程中去,这样,只要pid=4的进程不退出,谁也动不了目标文件  
  DuplicateHandle(GetCurrentProcess(), hFile, hProcess, @hTargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS or DUPLICATE_CLOSE_SOURCE);  
  CloseHandle(hProcess);    
end;  
begin  
  SetPrivilege;  
  OccupyFile(’D:\Program Files\工具软件\任务管理.exe’);//这是要保护的程序名  
end.  以下是vc6.0代码  
//VC-ConsoleWithApi  
#include   //提权函数  
void RaiseToDebugP()  
{  
HANDLE hToken;  
HANDLE hProcess = GetCurrentProcess();  
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);  
}      
}  
  BOOL OccupyFile( LPCTSTR lpFileName )  
  {  
      BOOL    bRet;  
      //提升自身权限  
      RaiseToDebugP();  
   //打开一个pid为4的进程,只要是存在的进程,都可以  
   HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4为system进程号  
     
      if ( hProcess == NULL )  
      {            
    return FALSE;  
      }  
     
      HANDLE hFile;  
      HANDLE hTargetHandle;  
   //以独占模式打开目标文件  
   hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);      
     
     
      if ( hFile == INVALID_HANDLE_VALUE )  
      {  
          CloseHandle( hProcess );  
          return FALSE;  
      }  
     
   //把文件句柄复制到pid=4的进程中去,这样,只要pid=4的进程不退出,谁也动不了目标文件  
  bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,   
          0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);  
     
      CloseHandle( hProcess );  
     
      return bRet;  
  }  
    
    
  //入口函数  
  int main()  
  {  
      OccupyFile("D:\\Program Files\\工具软件\\任务管理.exe");  
     
      return 0;  
  } 

解决方案 »

  1.   

    看代码来说是可以的
    因为没有使用dll 调用的也是一般的api我实现看看吧不过ring3下的这种办法过不了本版精华里的一个软件unlock
      

  2.   

    搞定
    Private Const ANYSIZE_ARRAY = 1
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_QUERY = &H8
    Private Const SE_PRIVILEGE_ENABLED = &H2
    Private Type LUID
        LowPart As Long
        HighPart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
        pLuid As LUID
        Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Declare Function DuplicateHandle Lib "kernel32" (ByVal hSourceProcessHandle As Long, ByVal hSourceHandle As Long, ByVal hTargetProcessHandle As Long, lpTargetHandle As Long, ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwOptions As Long) As Long
    Private Declare Function CreateFile Lib "kernel32" _
       Alias "CreateFileA" _
      (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
       ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, _
       ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
       ByVal hTemplateFile As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Const OPEN_EXISTING As Long = 3
    Private Const OPEN_ALWAYS As Long = 4
    Private Const FILE_SHARE_READ As Long = &H1
    Private Const FILE_SHARE_WRITE As Long = &H2
    Private Const GENERIC_READ As Long = &H80000000
    Private Const GENERIC_WRITE As Long = &H40000000
    Private Const INVALID_HANDLE_VALUE = -1Private Const PROCESS_DUP_HANDLE = (&H40)'set the shut down privilege for the current application
    Private Sub EnablePrivilege()
        Dim hProc As Long
        Dim hToken As Long
        Dim mLUID As LUID
        Dim mPriv As TOKEN_PRIVILEGES
        Dim mNewPriv As TOKEN_PRIVILEGES
        hProc = GetCurrentProcess()
        OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
        LookupPrivilegeValue "", "SeDebugPrivilege", mLUID
        mPriv.PrivilegeCount = 1
        mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
        mPriv.Privileges(0).pLuid = mLUID
        ' enable shutdown privilege for the current application
        AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
    End SubPrivate Sub Command1_Click()
    OccupyFile "c:\1.txt"
    End SubPrivate Sub Form_Load()
    EnablePrivilegeEnd SubPrivate Sub OccupyFile(lpFileName As String)
    hProcess = OpenProcess(PROCESS_DUP_HANDLE, False, 4)
      If (hProcess = 0) Then Exit Sub
      hFile = CreateFile(lpFileName, _
                          GENERIC_READ, _
                          0, _
                          0&, _
                          OPEN_EXISTING, _
                          0, _
                          0&)
                               
    '  hFile = CreateFile(lpFileName, GENERIC_READ, 0, 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)
      If (hFile = INVALID_HANDLE_VALUE) Then
        CloseHandle (hProcess)
        Exit Sub
    End Ifs = DuplicateHandle(GetCurrentProcess(), hFile, hProcess, hTargetHandle, 0, False, DUPLICATE_SAME_ACCESS Or DUPLICATE_CLOSE_SOURCE)
      CloseHandle (hProcess)End Sub
      

  3.   

    测试通过当打开1v.txt的时候弹出该文件正在被打开 无法访问,然后显示空白的文本,实际上文本是有内容的