模拟用户登录
2012-05-26 11:05
260 查看
我不知道这能不能算一个好点子,但我觉得这真的不错:模拟一个权力更大的用户进行某些无法完成的操作。
举个例子来说:你在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权限,权限足够。
举个例子来说:你在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权限,权限足够。
相关文章推荐
- 《java入门第一季》之类小案例(模拟用户登录)
- android 访问web端与解析json,模拟用户登录
- asp.net访问网络路径方法(模拟用户登录)
- linux shell编程模拟用户登录
- 【JavaWeb】XML文件_使用xml文件作为数据库并且使用xpath技术模拟用户登录
- 模拟用户登录
- 常见对象_模拟用户登录案例
- 《java入门第一季》之类小案例(模拟用户登录)
- C语言之(for循环)模拟用户登录情景
- C#模拟网站用户登录
- 用缓冲输入输出字符流模拟用户注册登录
- c# 模拟用户登录
- 在服务中模拟当前登录用户读取HKEY_CURRENT_USER
- c# 实现网页上用户自动登陆|asp.net 模拟网站登录
- 模拟用户登录
- python3下使用scrapy实现模拟用户登录与cookie存储—— 中级篇(百度云俱乐部)
- 【CURL】模拟登录网站并获取用户信息
- 【C语言】模拟用户登录系统 以及演示多个字符从两端向中间靠拢
- MFC 方法记录 模拟用户登录系统
- python3.0 模拟用户登录,三次错误锁定