如何以同账号不同大小写启动Windows子进程且无需密码
问题解决方案
Windows内核层面用户身份以SID为唯一标识,用户名大小写仅为显示属性,不存在大小写不同的两个独立同SID账户,不需要获取用户密码即可实现需求,以下是两种可直接落地的方案:
方案1:复制自有令牌创建子进程(无额外注入)
- 调用
OpenProcessToken打开当前服务进程的访问令牌,申请TOKEN_DUPLICATE、TOKEN_QUERY、TOKEN_ADJUST_DEFAULT权限 - 调用
DuplicateTokenEx将当前令牌复制为主令牌(Primary Token),注意不要生成模拟级别令牌,模拟令牌无法直接用于创建新进程 - 调用
SetTokenInformation传入TokenUser信息类,将令牌关联的用户名显示值修改为小写的user1234,这一步不会修改系统SAM库中的账户信息,仅修改当前令牌副本的显示字段 - 调用
CreateProcessWithTokenW传入修改后的令牌启动第三方工具,该接口不需要提供用户密码,仅要求持有合法的对应账户主令牌即可完成进程创建
注意:该方案在部分开启了强制令牌完整性校验的Windows Server版本上可能触发ERROR_BAD_TOKEN_TYPE错误,测试时需要覆盖目标部署环境的系统版本。
方案2:挂起进程+API Hook(兼容性最高,推荐)
这个方案完全不触碰系统令牌的敏感修改逻辑,稳定性最好:
- 调用
CreateProcess启动第三方工具时,传入CREATE_SUSPENDED标志,让子进程初始化完成后保持主线程挂起状态,不执行入口代码 - 向挂起的子进程注入一个体积极小的轻量DLL,DLL仅做逻辑:Hook
GetUserNameA、GetUserNameW、GetUserNameExA、GetUserNameExW四个用户名查询API,当检测到调用方是第三方工具主模块时,直接返回小写的user1234,其余所有调用全部透传给系统原生API - 调用
ResumeThread恢复子进程主线程运行,第三方工具后续所有用户名查询操作拿到的都是符合要求的小写值 - 整个流程不需要获取、存储用户密码,也不会修改系统全局配置,所有改动仅在目标子进程内部生效,不会影响服务本身或其他进程的运行逻辑
不推荐的路径说明
- 不要尝试调用
LogonUser系列接口生成小写用户名的令牌,这类接口必须传入明文密码,不符合你的安全约束 - 不需要尝试做跨大小写的身份模拟,Windows内核层面
USER1234和user1234对应同一个SID,不存在两个独立身份,模拟逻辑没有意义 - 直接用.NET默认的
Process.Start或原生CreateProcess启动子进程会直接继承父进程令牌的用户名字段大小写,无法满足第三方工具的校验要求
内容的提问来源于stack exchange,提问作者PersonalNexus
相关产品推荐
相关产品推荐

