zoukankan      html  css  js  c++  java
  • 模拟用户登录

    我不知道这能不能算一个好点子,但我觉得这真的不错:模拟一个权力更大的用户进行某些无法完成的操作。
    举个例子来说:你在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;
     
                    FILEhFile = 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权限,权限足够。
  • 相关阅读:
    运算符、基本数据类型-----整型、字符串
    练习题
    python安装与初识(python起源、分类,if语句、while语句、基本数据类型、变量的命名)
    hdu2187悼念512汶川大地震遇难同胞——老人是真饿了(贪心 简单题)
    牛客小白月赛9 A签到(分数取模,逆元)
    牛客小白月赛9H论如何出一道水题(两个连续自然数互质)
    EOJ3134. 短信激活码(大数幂取模)
    EOJ3650 转机折扣(26进制,字符串)
    hdu1042 N!(大数求阶乘)
    hdu2061 Treasure the new start, freshmen!(暴力简单题)
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1893185.html
Copyright © 2011-2022 走看看