系统环境块,又是一个深坑

又是史前巨坑级别。维护服务代码的时候,发现里面有一个常用的CreateProcessAsUser。本来这个功能用在其他地方啥事没有,这一天我突然接到一个需求,要调用一个只能在用户权限运行的程序。本来获取User token,再Create Process一气呵成。跟踪一下却有些蹊跷

xxxy.png

卧槽这什么鬼,明明是当前用户起来的,仔细看了代码,果不其然,lpEnviroment用的是NULL,使用父进程的Enviroment,然而父进程是SYSTEM起的。

bfa1af.png

某智能Handle类 hDumpToken; 
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDumpToken))
{
  return;
}

LPVOID lpEnvironmentBlock = NULL;
if (!CreateEnvironmentBlock(&lpEnvironmentBlock, hDumpToken, FALSE))
{
  return;
}

BOOL ret = CreateProcessAsUserW(hDumpToken, NULL,
  (LPWSTR)strFile.c_str(),
  NULL, NULL, FALSE,
  NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, lpEnvironmentBlock, NULL,
  &si, &pi);

wtf。

标签:none

添加新评论

captcha
请输入验证码