模拟用户登录(张佩)

我不知道这能不能算一个好点子,但我觉得这真的不错:模拟一个权力更大的用户进行某些无法完成的操作。
举个例子来说:你在Administrator用户下,打开文件1.exe的安全设置页面,添加并设置Guest用户的权限为file control拒否,如下图所示:
 
这样,按照正常的办法,Guest用户将访问不到1.exe文件了。但是一点其他的办法都没有吗?也不是的,我告诉你一个:模拟高权用户!
这是一个很别扭的例子,是我为了说明问题而“多此一举”。但有的时候,你可能要在用户 每次登进系统的时候,修改某些系统设置。要完成这些设置,也许需要一定的用户权限,而像guest这样的低权限用户可能就完成不了。如果这样的话,你将会 对这些用户失去控制。这时你可能就要用到这里的方法了。
我下面的例子,仍然只以1.exe的访问来说明问题。读者看了我上面写的内容后,自然能够举一反三的吧。
         HANDLE  hToken ;
        DWORD dwError ;
        STARTUPINFOW    si ;  
        PROCESS_INFORMATION  pi ;  
 
        ZeroMemory (&si , sizeof (si ));
        ZeroMemory (&pi , sizeof (pi ));
        si .cb = sizeof (si );
 
        if (0 == LogonUser ("  administ  ", ".", "  password  ", LOGON32_LOGON_INTERACTIVE , LOGON32_PROVIDER_DEFAULT , &hToken ))
        {
                printf ("Failed to call LogonUser/r/n");
                dwError = GetLastError ();
        }
        else
        {
                 if(  CreateProcessAsUserW  (hToken , L "c://  1. exe ", NULL ,
                        NULL , NULL ,
                        FALSE , NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE ,
                        NULL , NULL , &si , &pi )  )
                 {
printf  ("Success! Call CreateProcessAsUserW/r/n");
}
        }
代码很简单,就是正确使用LogonUser和 CreateProcessAsUser这两个API。我再简单地说一下,LogonUser的目的是取得一个指定用户的令牌Token,令牌代表了用户 所拥有的权限。CreateProcessAsUser里面利用了这个令牌创建进程。
如果你不是创建进程怎么办呢?比如你只是要打开一个1.txt文档对它进行读写操作。看如下代码:
 
bRet  = ImpersonateLoggedOnUser (hToken );
                if (bRet == FALSE )
                        return 1;
 
                FILE * hFile = fopen ("c://  1  .txt", "r");
 
            RevertToSelf ();
 
    什么意思?ImpersonateLoggedOnUser的作用是让当前进程模拟一个用户,直到RevertToSelf被调用。所以,fopen是以Administrator的权限调用的,hFile将返回一个正确的值。
    甚至还有另外的一种方法,它可以避免用LogonUser取得一个用户Token。因为这个API必须要调用者提供用户名和密码的参数,可移植性太差了。如果知道一个进程,而此进程总是以很高的用户权限运行的话,只要取得这个进程的Token就可以了。
    现在正好有这样一个进程,它就是winlogon.exe。我把代码放到下面(这段代码的作者是jiurl):
   
        pid = FindWinlogon ();  //  取得  winlogon.exe  的进程  ID
        if ( pid <0 )
        {
                return 0;
        }
 
        hProcess = OpenProcess ( PROCESS_ALL_ACCESS , FALSE , pid );
        if ( hProcess ==NULL )
        {
                return 0;
        }
 
        rc = OpenProcessToken ( hProcess , TOKEN_ALL_ACCESS , &hOldToken );
        if ( rc ==0 )
        {
                CloseHandle (hProcess );
                return 0;
        }
 
        rc = DuplicateTokenEx (hOldToken , NULL , NULL , SecurityIdentification , TokenPrimary , &hNewToken );
        if ( rc ==0 )
        {
                CloseHandle (hProcess );
                CloseHandle (hOldToken );
                //printf("DuplicateTokenEx Error: %d/n", GetLastError());
                return 0;
        }
    最后得到的 hNewToken就是我们要找的Token,接下来你就可以用它来调用CreateProcessAsUser或者 ImpersonateLoggedOnUser了。一般来说,上面的代码需要在服务里面运行,否则可能会因为权限不够,导致OpenProcess和 OpenProcessToken调用失败。服务是system权限,权限足够。
转自:http://blog.chinaunix.net/u/21790/showart_484973.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值