C++程序如下:
BOOL userfunction()
{
  HANDLE hProcess = ::GetCurrentProcess();
  SID_IDENTIFIER_AUTHORITY sia = SECURITY_WORLD_SID_AUTHORITY;
  PSID pSid;
  BOOL bSus = FALSE;
  if (::AllocateAndInitializeSid(&sia,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&pSid))
  {
    HANDLE hToken;
    if(::OpenProcessToken(hProcess,TOKEN_QUERY,&hToken))
    {
      DWORD dwReturnLength;
      ::GetTokenInformation(hToken,TokenUser,NULL,NULL,&dwReturnLength);
      if(dwReturnLength <= 0x400)
      {
        LPVOID TokenInformation;
        TokenInformation = ::LocalAlloc(LPTR,0x400);//这里就引用SDK的函数不引用CRT的了
        DWORD dw;
        if (::GetTokenInformation(hToken,TokenUser,TokenInformation,0x400,&dw))
        {
          PTOKEN_USER pTokenUser = (PTOKEN_USER)TokenInformation;
          BYTE Buf[0x200];
          PACL pAcl = (PACL)&Buf;
          if ((::InitializeAcl(pAcl,1024,ACL_REVISION))
            && (::AddAccessDeniedAce(pAcl,ACL_REVISION,0x000000FA,pSid))
            && (::AddAccessAllowedAce(pAcl,ACL_REVISION,0x00100701,pTokenUser->User.Sid))
            && (::SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION,NULL,NULL,pAcl,NULL) == 0)
            )
          {
            bSus = TRUE;
          }
        }    
        
      }
      
    }
  };  //Cleanup
  if(hProcess != NULL)
  {
    ::CloseHandle(hProcess);
  }
  if(pSid != NULL)
  {
    ::FreeSid(pSid);
  }
  return bSus;
}关键是这里很多变量类型在delphi里面找不到对应的,十分困扰,请教delphi windows api编程的高手。

解决方案 »

  1.   


    function UserFunction: Boolean;
    var
      hProcess: THandle;
      hToken: THandle;
      sia: TSIDIdentifierAuthority;
      sid: PSID;
      dwReturnLength: DWord;
      TokenInformation: Pointer;
      dw: DWORD;
      TokenUserInfo: PTokenUser;
      Buf: array[0..$200 - 1] of Byte;
      Acl: PACL;
    begin
      hProcess := GetCurrentProcess;
      FillChar(sia, SizeOf(sia), 0);
      sia.Value[5] := 1;  Result := False;
      if AllocateAndInitializeSid(sia, 1, 0, 0, 0, 0, 0, 0, 0, 0, sid) then
      begin
        if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
        begin
          GetTokenInformation(hToken, TokenUser, nil, 0, dwReturnLength);
          if dwReturnLength < $400 then
          begin
            TokenInformation := Pointer(LocalAlloc(LPTR, $400));
            if GetTokenInformation(hToken, TokenUser, TokenInformation, $400, dw) then
            begin
              TokenUserInfo := PTokenUser(TokenInformation);
              Acl := PACL(@Buf[0]);
              if InitializeAcl(Acl^, 1024, 2)
                and AddAccessDeniedAce(Acl^, 2, $000000FA, sid)
                and AddAccessAllowedAce(Acl^, 2, $00100701, TokenUserInfo^.User.Sid)
                and (SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION or $80000000, nil, nil, Acl, nil) = 0) then
              begin
                Result := True;
              end;
            end;
          end;
        end;
      end;  //Cleanup
      if hProcess <> NULL then
      begin
        CloseHandle(hProcess);
      end;  if sid <> nil then
      begin
        FreeSid(sid);
      end;
    end;
      

  2.   

    具体api函数倒不是问题,问题是那些类型,不知用啥替代
      

  3.   


    变量类型还是不对,那个PTokenUser另外不知为什么,SetSecurityInfo函数也不对
      

  4.   


    Delphi中都有对应的类型申明的, 绝大多数你可以在Windows单元中找到它们。
      

  5.   

    应该是某些unit没引用,但不知该引用哪些
      

  6.   

    没,windows单元,默认是加进去了,还是没有
      

  7.   

    搞定,引用aclapi,accctrl单元
    并手动申明如下变量类型
    type
      PTOKENUSER   =   ^TOKEN_USER;
      _TOKEN_USER   =   record
          User:   TSidAndAttributes;
      end;
      TOKEN_USER   =   _TOKEN_USER;
      

  8.   

    type
      PTOKEN_USER = ^TOKEN_USER;
      _TOKEN_USER = record
        User: SID_AND_ATTRIBUTES ;
      end;
      TOKEN_USER = _TOKEN_USER;  SE_OBJECT_TYPE = (
      SE_UNKNOWN_OBJECT_TYPE       = 0,
      SE_FILE_OBJECT,
      SE_SERVICE,
      SE_PRINTER,
      SE_REGISTRY_KEY,
      SE_LMSHARE,
      SE_KERNEL_OBJECT,
      SE_WINDOW_OBJECT,
      SE_DS_OBJECT,
      SE_DS_OBJECT_ALL,
      SE_PROVIDER_DEFINED_OBJECT,
      SE_WMIGUID_OBJECT,
      SE_REGISTRY_WOW64_32KEY 
    );Const   SECURITY_NULL_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,0)); 
      SECURITY_WORLD_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,1)); 
      SECURITY_LOCAL_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,2)); 
      SECURITY_CREATOR_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,3)); 
      SECURITY_NON_UNIQUE_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,4)); 
      SECURITY_NT_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,5));  function SetSecurityInfo(
      handle: THANDLE ;
      ObjectType: SE_OBJECT_TYPE;
      SecurityInfo: SECURITY_INFORMATION;
      psidOwner: PSID;
      psidGroup: PSID;
      pDacl: PACL ;
      pSacl: PACL
    ):LongWord; stdcall;external advapi32 name 'SetSecurityInfo';
      function AllocateAndInitializeSid(const pIdentifierAuthority: PSIDIdentifierAuthority; (*Delphi 2007当中此参数的声明有问题*)
      nSubAuthorityCount: Byte; nSubAuthority0, nSubAuthority1: DWORD;
      nSubAuthority2, nSubAuthority3, nSubAuthority4: DWORD;
      nSubAuthority5, nSubAuthority6, nSubAuthority7: DWORD;
      var pSid: Pointer): BOOL; stdcall; external advapi32 name 'AllocateAndInitializeSid';
    //下列API的第一个参数声明不应该使用var,所以重新声明
    function InitializeAcl( pAcl: PACL; nAclLength, dwAclRevision: DWORD): BOOL; stdcall;external advapi32 name 'InitializeAcl';
    function AddAccessDeniedAce(pAcl: PACL; dwAceRevision: DWORD;
      AccessMask: DWORD; pSid: PSID): BOOL; stdcall;external advapi32 name 'AddAccessDeniedAce';
    function AddAccessAllowedAce(pAcl: PACL; dwAceRevision: DWORD;
      AccessMask: DWORD; pSid: PSID): BOOL; stdcall;external advapi32 name 'AddAccessAllowedAce';
    function userfunction: LongBool;
    var
      hProcess: THandle;
      sia: SID_IDENTIFIER_AUTHORITY;
      _pSid: PSID;
      bSus: LongBool;
      hToken: THandle;
      dwReturnLength: LongWord;
      TokenInformation: Pointer;
      dw: LongWord;
      pTokenUser: PTOKEN_USER;
      Buf: array [0..$200 - 1] of Byte;
      _pAcl: PACL;
    begin
      hProcess := GetCurrentProcess();
      sia := SECURITY_WORLD_SID_AUTHORITY;
      bSus := FALSE;
      if (AllocateAndInitializeSid(@sia ,1,0,0,0,0,0,0,0,0,_pSid)) then
      begin
        if(OpenProcessToken(hProcess,TOKEN_QUERY,hToken)) then
        begin
          GetTokenInformation(hToken,TokenUser,Nil,0,&dwReturnLength);
          if(dwReturnLength <= $400) then
          begin
            TokenInformation := Pointer(LocalAlloc(LPTR,$400));//这里就引用SDK的函数不引用CRT的了
            if (GetTokenInformation(hToken,TokenUser,TokenInformation,$400,dw)) then
            begin
              pTokenUser := PTOKEN_USER(TokenInformation);
              _pAcl := PACL(@Buf[0]);
              if ((InitializeAcl(_pAcl,1024, 2(*ACL_REVISION*)))
                and (AddAccessDeniedAce(_pAcl,2(*ACL_REVISION*),$000000FA,_pSid))
                and (AddAccessAllowedAce(_pAcl,2(*ACL_REVISION*),$00100701,pTokenUser^.User.Sid))
                and (SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION or $80000000 (*PROTECTED_DACL_SECURITY_INFORMATION*),Nil,NIL,_pAcl,NIL) = 0)
                ) then
              begin
                bSus := TRUE;
              end;
            end;
            
          end;
          
        end;
      end;  //Cleanup
      if(hProcess <> 0) then
      begin
        CloseHandle(hProcess);
      end;  if(_pSid <> NIL) then
      begin
        FreeSid(_pSid);
      end;
      Result := bSus;
    end;