TWProcHelper.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #ifndef _TWINKLE_PROCESS_HELPER_H_
  2. #define _TWINKLE_PROCESS_HELPER_H_
  3. #pragma comment(lib, "advapi32.lib")
  4. #include <windows.h>
  5. #include <stdio.h>
  6. #include <tchar.h>
  7. #include <Psapi.h>
  8. #include <Sddl.h>
  9. #include <AccCtrl.h>
  10. #include <Aclapi.h>
  11. #include <userenv.h>
  12. #include <TlHelp32.h>
  13. #include <Accctrl.h>
  14. #include <Aclapi.h>
  15. #include <Ntsecapi.h>
  16. //#include <Ntstatus.h>
  17. #include "SpFSM.h"
  18. #ifndef STATUS_SUCCESS
  19. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
  20. #endif
  21. #pragma comment(lib, "Psapi.lib")
  22. #pragma comment(lib, "netapi32.lib")
  23. #pragma comment(lib, "Userenv.lib")
  24. #include <lm.h>
  25. #define MAX_NAME 256
  26. #define TWHeapAlloc(x) (HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, x))
  27. #define TWHeapFree(x) (HeapFree(GetProcessHeap(), 0, x))
  28. #define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | \
  29. DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | \
  30. DESKTOP_JOURNALPLAYBACK | DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | \
  31. DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_REQUIRED)
  32. #define WINSTA_ALL (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | \
  33. WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | \
  34. WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | \
  35. WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN | \
  36. STANDARD_RIGHTS_REQUIRED)
  37. #define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | \
  38. GENERIC_EXECUTE | GENERIC_ALL)
  39. BOOL StartInteractiveClientProcess (
  40. LPTSTR lpszUsername, // client to log on
  41. LPTSTR lpszDomain, // domain of client's account
  42. LPTSTR lpszPassword, // client's password
  43. LPTSTR lpCommandLine, // command line to execute
  44. LPSTARTUPINFO psi,
  45. DWORD fdwCreate,
  46. PDWORD pDwProcessId
  47. );
  48. class CTWProcHelper
  49. {
  50. public:
  51. CTWProcHelper(void);
  52. CTWProcHelper(HANDLE hJob);
  53. ~CTWProcHelper(void);
  54. operator HANDLE() const { return(m_hJob); }
  55. BOOL Create(PSECURITY_ATTRIBUTES psa, PCTSTR pszName);
  56. BOOL Open(PCTSTR pszName, DWORD dwDesiredAccess, BOOL fInheritHandle);
  57. BOOL AssignProcess(HANDLE hProcess);
  58. BOOL AssignProcess(DWORD dwProcessId);
  59. BOOL DestoryProcess(DWORD dwProcessId);
  60. void GetProcessName(DWORD PID, PTSTR szProcessName, size_t cchSize);
  61. BOOL SetBasicLimitInfo(PJOBOBJECT_BASIC_LIMIT_INFORMATION pjobli);
  62. BOOL SetExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjobeli);
  63. BOOL SetBasicUIRestrictions(DWORD fdwLimits);
  64. BOOL SetSecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjobsli);
  65. BOOL SetEndOfJobInfo(DWORD fdwEndOfJobInfo = JOB_OBJECT_TERMINATE_AT_END_OF_JOB);
  66. BOOL QueryEndOfJobTimeInfo(PDWORD pfdwEndOfJobTimeInfo);
  67. BOOL QueryBaseAndIOInfo(PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION pjobai);
  68. BOOL QueryExtendLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjobeli);
  69. BOOL QueryBasicProcessIdList(
  70. DWORD dwMaxProcesses, PDWORD pdwProcessIdList, PDWORD pdwProcessesReturned);
  71. BOOL QueryBasicUIRestrictions(PDWORD pfdwRestrictions);
  72. BOOL QuerySecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli);
  73. BOOL AssociateCompletionPort(HANDLE hIOCP, ULONG_PTR CompKey);
  74. BOOL QueryAssociatedCompletionPort(PJOBOBJECT_ASSOCIATE_COMPLETION_PORT pjoacp);
  75. BOOL Terminate(UINT uExitCode);
  76. private:
  77. HANDLE m_hJob;
  78. public:
  79. /*++
  80. Function : ModifyDefaultDacl
  81. Synopsis : Add EVERYONE ACE to the process token DACL.
  82. Parameter: hProcess - Handle to process to modify the DACL.
  83. Return : 0 if successful, otherwise error code.
  84. --*/
  85. static DWORD ModifyDefaultDacl(HANDLE hProcess);
  86. //Allow or disallow a process to perform system-level actions.
  87. //See more: https://msdn.microsoft.com/en-us/library/bb530716(v=vs.85).aspx
  88. static BOOL SetPrivilege(
  89. HANDLE hToken, // access token handle
  90. LPCTSTR lpszPrivilege, // name of privilege to enable/disable
  91. BOOL bEnablePrivilege // to enable or disable privilege
  92. );
  93. static BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege);
  94. //<param:lpCommandLine>: command line to execute
  95. static BOOL CreateLowerProcess(LPTSTR lpCommandLine);
  96. static BOOL GetProcessIntegrityLevel(HANDLE hProcess, PDWORD pIntegrityLevel,
  97. PDWORD pPolicy, PDWORD pResourceIntegrityLevel, PDWORD pResourcePolicy);
  98. static BOOL GetProcessIntegrityLevel(DWORD PID, PDWORD pIntegrityLevel,
  99. PDWORD pPolicy, PDWORD pResourceIntegrityLevel, PDWORD pResourcePolicy);
  100. static BOOL CreateSecurityDescriptor();
  101. static DWORD AddAceToObjectsSecurityDescriptor (
  102. LPTSTR pszObjName, // name of object
  103. SE_OBJECT_TYPE ObjectType, // type of object
  104. LPTSTR pszTrustee, // trustee for new ACE
  105. TRUSTEE_FORM TrusteeForm, // format of trustee structure
  106. DWORD dwAccessRights, // access mask for new ACE
  107. ACCESS_MODE AccessMode, // type of ACE
  108. DWORD dwInheritance // inheritance flags for new ACE
  109. ) ;
  110. static BOOL TakeOwnership(LPTSTR lpszOwnFile);
  111. static BOOL FindOwnerOfFile(LPCTSTR lpszOwnFile, LPTSTR lpszOwnerAccount);
  112. static LPCTSTR ErrorMessage(DWORD error);
  113. static void PrintError(LPCTSTR errDesc);
  114. static void PrintInfo(LPCTSTR lpszDesc);
  115. //降低线程的完整性级别
  116. static BOOL LowerThreadIntegirtyLevel();
  117. static void SetLowLabelToFile(LPCTSTR lpszFileName);
  118. static BOOL GetSecurityDescriptorOfFile(LPCSTR lpszFileName, PSECURITY_DESCRIPTOR *ppSD);
  119. static BOOL CustomAccessCheck(LPTSTR lpszFileName);
  120. static BOOL ImpersonateAndCheckAccess(
  121. PSECURITY_DESCRIPTOR pSD, // security descriptor to check
  122. DWORD dwAccessDesired, // access rights to check
  123. PGENERIC_MAPPING pGeneric, // generic mapping for object
  124. PDWORD pdwAccessAllowed // returns allowed access rights
  125. );
  126. static BOOL SearchTokenGroupsForSID (VOID);
  127. static BOOL AddUserAccount();
  128. static BOOL AddMemberToGroup();
  129. static BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName);
  130. static BOOL GetPIDByName(LPCTSTR lpszPName, DWORD& dwProcessID);
  131. static BOOL CreateSystemProcess( LPTSTR szProcessName);
  132. static BOOL GetPrivilegeLUIDWithSID(PSID pSID, PLUID *pLUID, PDWORD pDwCount);
  133. };
  134. #endif //_TWINKLE_PROCESS_HELPER_H_