ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:18.88KB ,
资源ID:9882396      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9882396.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(CreateProcessAsUser.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

CreateProcessAsUser.docx

1、CreateProcessAsUsersystem服务程序中创建一个进程,当前登陆用户,用createProcessByUser()#define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK | DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP | STANDARD

2、_RIGHTS_REQUIRED)#define WINSTA_ALL (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN | STANDARD_RIGHTS_REQUIRED)#define GENERIC_ACCESS (GENERIC_

3、READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL)BOOL AddAceToWindowStation(HWINSTA hwinsta, PSID psid);BOOL AddAceToDesktop(HDESK hdesk, PSID psid);BOOL GetLogonSID (HANDLE hToken, PSID *ppsid);VOID FreeLogonSID (PSID *ppsid);BOOL StartInteractiveClientProcess ( LPTSTR lpszUsername, / client to

4、 log on LPTSTR lpszDomain, / domain of clients account LPTSTR lpszPassword, / clients password LPTSTR lpCommandLine / command line to execute) HANDLE hToken; HDESK hdesk = NULL; HWINSTA hwinsta = NULL, hwinstaSave = NULL; PROCESS_INFORMATION pi; PSID pSid = NULL; STARTUPINFO si; BOOL bResult = FALSE

5、;/ Log the client on to the local computer. if (!LogonUser( lpszUsername, lpszDomain, lpszPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken) ) goto Cleanup; / Save a handle to the callers current window station. if ( (hwinstaSave = GetProcessWindowStation() ) = NULL) goto Cleanu

6、p;/ Get a handle to the interactive window station. hwinsta = OpenWindowStation( Lwinsta0, / the interactive window station FALSE, / handle is not inheritable READ_CONTROL | WRITE_DAC); / rights to read/write the DACL if (hwinsta = NULL) goto Cleanup;/ To get the correct default desktop, set the cal

7、lers / window station to the interactive window station. if (!SetProcessWindowStation(hwinsta) goto Cleanup;/ Get a handle to the interactive desktop. hdesk = OpenDesktop( Ldefault, / the interactive window station 0, / no interaction with other desktop processes FALSE, / handle is not inheritable R

8、EAD_CONTROL | / request the rights to read and write the DACL WRITE_DAC | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS);/ Restore the callers window station. if (!SetProcessWindowStation(hwinstaSave) goto Cleanup; if (hdesk = NULL) goto Cleanup;/ Get the SID for the clients logon session. if (!GetLogo

9、nSID(hToken, &pSid) goto Cleanup;/ Allow logon SID full access to interactive window station. if (! AddAceToWindowStation(hwinsta, pSid) ) goto Cleanup;/ Allow logon SID full access to interactive desktop. if (! AddAceToDesktop(hdesk, pSid) ) goto Cleanup;/ Impersonate client to ensure access to exe

10、cutable file. if (! ImpersonateLoggedOnUser(hToken) ) goto Cleanup;/ Initialize the STARTUPINFO structure./ Specify that the process runs in the interactive desktop. ZeroMemory(&si, sizeof(STARTUPINFO); si.cb= sizeof(STARTUPINFO); si.lpDesktop = TEXT(winsta0default);/ Launch the process in the clien

11、ts logon session. bResult = CreateProcessAsUser( hToken, / clients access token NULL, / file to execute lpCommandLine, / command line NULL, / pointer to process SECURITY_ATTRIBUTES NULL, / pointer to thread SECURITY_ATTRIBUTES FALSE, / handles are not inheritable NORMAL_PRIORITY_CLASS | CREATE_NEW_C

12、ONSOLE, / creation flags NULL, / pointer to new environment block NULL, / name of current directory &si, / pointer to STARTUPINFO structure &pi / receives information about new process ); / End impersonation of client. RevertToSelf(); if (bResult & pi.hProcess != INVALID_HANDLE_VALUE) WaitForSingleO

13、bject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); if (pi.hThread != INVALID_HANDLE_VALUE) CloseHandle(pi.hThread); Cleanup: if (hwinstaSave != NULL) SetProcessWindowStation (hwinstaSave);/ Free the buffer for the logon SID. if (pSid) FreeLogonSID(&pSid);/ Close the handles to the interactive w

14、indow station and desktop. if (hwinsta) CloseWindowStation(hwinsta); if (hdesk) CloseDesktop(hdesk);/ Close the handle to the clients access token. if (hToken != INVALID_HANDLE_VALUE) CloseHandle(hToken); return bResult;BOOL AddAceToWindowStation(HWINSTA hwinsta, PSID psid) ACCESS_ALLOWED_ACE *pace;

15、 ACL_SIZE_INFORMATION aclSizeInfo; BOOL bDaclExist; BOOL bDaclPresent; BOOL bSuccess = FALSE; DWORD dwNewAclSize; DWORD dwSidSize = 0; DWORD dwSdSizeNeeded; PACL pacl; PACL pNewAcl; PSECURITY_DESCRIPTOR psd = NULL; PSECURITY_DESCRIPTOR psdNew = NULL; PVOID pTempAce; SECURITY_INFORMATION si = DACL_SE

16、CURITY_INFORMATION; unsigned int i; _try / Obtain the DACL for the window station. if (!GetUserObjectSecurity( hwinsta, &si, psd, dwSidSize, &dwSdSizeNeeded) ) if (GetLastError() = ERROR_INSUFFICIENT_BUFFER) psd = (PSECURITY_DESCRIPTOR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwSdSizeNeeded);

17、if (psd = NULL) _leave; psdNew = (PSECURITY_DESCRIPTOR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwSdSizeNeeded); if (psdNew = NULL) _leave; dwSidSize = dwSdSizeNeeded; if (!GetUserObjectSecurity( hwinsta, &si, psd, dwSidSize, &dwSdSizeNeeded) ) _leave; else _leave; / Create a new DACL. if (!In

18、itializeSecurityDescriptor( psdNew, SECURITY_DESCRIPTOR_REVISION) ) _leave; / Get the DACL from the security descriptor. if (!GetSecurityDescriptorDacl( psd, &bDaclPresent, &pacl, &bDaclExist) ) _leave; / Initialize the ACL. ZeroMemory(&aclSizeInfo, sizeof(ACL_SIZE_INFORMATION); aclSizeInfo.AclBytes

19、InUse = sizeof(ACL); / Call only if the DACL is not NULL. if (pacl != NULL) / get the file ACL size info if (!GetAclInformation( pacl, (LPVOID)&aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation) ) _leave; / Compute the size of the new ACL. dwNewAclSize = aclSizeInfo.AclBytesInUse + (2*si

20、zeof(ACCESS_ALLOWED_ACE) + (2*GetLengthSid(psid) - (2*sizeof(DWORD); / Allocate memory for the new ACL. pNewAcl = (PACL)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwNewAclSize); if (pNewAcl = NULL) _leave; / Initialize the new DACL. if (!InitializeAcl(pNewAcl, dwNewAclSize, ACL_REVISION) _leave;

21、 / If DACL is present, copy it to a new DACL. if (bDaclPresent) / Copy the ACEs to the new ACL. if (aclSizeInfo.AceCount) for (i=0; i AceSize) ) _leave; / Add the first ACE to the window station. pace = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACCESS_ALLOWED_ACE) +

22、 GetLengthSid(psid) - sizeof(DWORD); if (pace = NULL) _leave; pace-Header.AceType = ACCESS_ALLOWED_ACE_TYPE; pace-Header.AceFlags = CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE; pace-Header.AceSize = sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(psid) - sizeof(DWORD); pace-Mask = GENERI

23、C_ACCESS; if (!CopySid(GetLengthSid(psid), &pace-SidStart, psid) _leave; if (!AddAce( pNewAcl, ACL_REVISION, MAXDWORD, (LPVOID)pace, pace-Header.AceSize) ) _leave; / Add the second ACE to the window station. pace-Header.AceFlags = NO_PROPAGATE_INHERIT_ACE; pace-Mask = WINSTA_ALL; if (!AddAce( pNewAc

24、l, ACL_REVISION, MAXDWORD, (LPVOID)pace, pace-Header.AceSize) ) _leave; / Set a new DACL for the security descriptor. if (!SetSecurityDescriptorDacl( psdNew, TRUE, pNewAcl, FALSE) ) _leave; / Set the new security descriptor for the window station. if (!SetUserObjectSecurity(hwinsta, &si, psdNew) _le

25、ave; / Indicate success. bSuccess = TRUE; _finally / Free the allocated buffers. if (pace != NULL) HeapFree(GetProcessHeap(), 0, (LPVOID)pace); if (pNewAcl != NULL) HeapFree(GetProcessHeap(), 0, (LPVOID)pNewAcl); if (psd != NULL) HeapFree(GetProcessHeap(), 0, (LPVOID)psd); if (psdNew != NULL) HeapFr

26、ee(GetProcessHeap(), 0, (LPVOID)psdNew); return bSuccess;BOOL AddAceToDesktop(HDESK hdesk, PSID psid) ACL_SIZE_INFORMATION aclSizeInfo; BOOL bDaclExist; BOOL bDaclPresent; BOOL bSuccess = FALSE; DWORD dwNewAclSize; DWORD dwSidSize = 0; DWORD dwSdSizeNeeded; PACL pacl; PACL pNewAcl; PSECURITY_DESCRIP

27、TOR psd = NULL; PSECURITY_DESCRIPTOR psdNew = NULL; PVOID pTempAce; SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION; unsigned int i; _try / Obtain the security descriptor for the desktop object. if (!GetUserObjectSecurity( hdesk, &si, psd, dwSidSize, &dwSdSizeNeeded) if (GetLastError() = ERROR_I

28、NSUFFICIENT_BUFFER) psd = (PSECURITY_DESCRIPTOR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwSdSizeNeeded ); if (psd = NULL) _leave; psdNew = (PSECURITY_DESCRIPTOR)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwSdSizeNeeded); if (psdNew = NULL) _leave; dwSidSize = dwSdSizeNeeded; if (!GetUserO

29、bjectSecurity( hdesk, &si, psd, dwSidSize, &dwSdSizeNeeded) ) _leave; else _leave; / Create a new security descriptor. if (!InitializeSecurityDescriptor( psdNew, SECURITY_DESCRIPTOR_REVISION) ) _leave; / Obtain the DACL from the security descriptor. if (!GetSecurityDescriptorDacl( psd, &bDaclPresent, &pacl, &bDaclExist) ) _leave; / Initialize. ZeroMemory(&aclSizeInfo, sizeof(ACL_SIZE_INFORMATION); aclSizeInfo.AclBytesInUse = size

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2