国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
創(chuàng)建高權(quán)限進(jìn)程

Author: sinister
Email: sinister@whitecell.org
Homepage:http://www.whitecell.org
Date: 2006-02-12

/*****************************************************************
文件名 : wssrun.c
描述 : 創(chuàng)建高權(quán)限進(jìn)程
作者 : sinister
最后修改日期 : 2006.2.09

*****************************************************************/

//
// 寫這個初衷是為了讓 Windows 任務(wù)管理器可以結(jié)束掉一些服務(wù)
// 和僵死進(jìn)程,用 pslist/pskill 之類工具無法獲得象任務(wù)管理
// 器那樣豐富的信息,還得來回切換,麻煩的很。最初想寫個驅(qū)動
// 監(jiān)視任務(wù)管理器運(yùn)行,使用 SYSTEM 進(jìn)程 TOKEN 替換來達(dá)到目的。
// 后來覺得通用性不好,就改用了這種方法。此方法還可使 regedit
// 查看、編輯 SAM 等注冊表鍵,何樂而不為。
//
// wssrun taskmgr.exe
// wssrun regedit.exe
//

C++代碼
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include

  8. #pragma comment(lib,”Shlwapi.lib”)


  9. /////////////////////////////////////////////////////////////////
  10. // 函數(shù)類型 :自定義工具函數(shù)
  11. // 函數(shù)模塊 :
  12. ////////////////////////////////////////////////////////////////
  13. // 功能 :提升當(dāng)前進(jìn)程權(quán)限
  14. // 注意 :
  15. /////////////////////////////////////////////////////////////////
  16. // 作者 : sinister
  17. // 發(fā)布版本 : 1.00.00
  18. // 發(fā)布日期 : 2006.2.09
  19. /////////////////////////////////////////////////////////////////
  20. // 重 大 修 改 歷 史
  21. ////////////////////////////////////////////////////////////////
  22. // 修改者 :
  23. // 修改日期 :
  24. // 修改內(nèi)容 :
  25. /////////////////////////////////////////////////////////////////

  26. BOOL
  27. EnableDebugPriv( LPCTSTR szPrivilege )
  28. {
  29. HANDLE hToken;
  30. LUID sedebugnameValue;
  31. TOKEN_PRIVILEGES tkp;

  32. if ( !OpenProcessToken( GetCurrentProcess(),
  33. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
  34. &hToken ) )
  35. {
  36. return FALSE;
  37. }
  38. if ( !LookupPrivilegeValue( NULL, szPrivilege, &sedebugnameValue ) )
  39. {
  40. CloseHandle( hToken );
  41. return FALSE;
  42. }

  43. tkp.PrivilegeCount = 1;
  44. tkp.Privileges[0].Luid = sedebugnameValue;
  45. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  46. if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
  47. {
  48. CloseHandle( hToken );
  49. return FALSE;
  50. }

  51. return TRUE;
  52. }

  53. /////////////////////////////////////////////////////////////////
  54. // 函數(shù)類型 :自定義工具函數(shù)
  55. // 函數(shù)模塊 :
  56. ////////////////////////////////////////////////////////////////
  57. // 功能 :通過指定進(jìn)程名得到其進(jìn)程 ID
  58. // 注意 :
  59. /////////////////////////////////////////////////////////////////
  60. // 作者 : sinister
  61. // 發(fā)布版本 : 1.00.00
  62. // 發(fā)布日期 : 2006.2.09
  63. /////////////////////////////////////////////////////////////////
  64. // 重 大 修 改 歷 史
  65. ////////////////////////////////////////////////////////////////
  66. // 修改者 :
  67. // 修改日期 :
  68. // 修改內(nèi)容 :
  69. /////////////////////////////////////////////////////////////////

  70. DWORD
  71. GetProcessId( LPCTSTR szProcName )
  72. {
  73. PROCESSENTRY32 pe;
  74. DWORD dwPid;
  75. DWORD dwRet;
  76. BOOL bFound = FALSE;

  77. //
  78. // 通過 TOOHLP32 函數(shù)枚舉進(jìn)程
  79. //

  80. HANDLE hSP = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  81. if ( hSP )
  82. {
  83. pe.dwSize = sizeof( pe );

  84. for ( dwRet = Process32First( hSP, &pe );
  85. dwRet;
  86. dwRet = Process32Next( hSP, &pe ) )
  87. {
  88. //
  89. // 使用 StrCmpNI 比較字符傳,可忽略大小寫
  90. //
  91. if ( StrCmpNI( szProcName, pe.szExeFile, strlen( szProcName ) ) == 0 )
  92. {
  93. dwPid = pe.th32ProcessID;
  94. bFound = TRUE;
  95. break;
  96. }
  97. }

  98. CloseHandle( hSP );

  99. if ( bFound == TRUE )
  100. {
  101. return dwPid;
  102. }
  103. }

  104. return NULL;
  105. }

  106. /////////////////////////////////////////////////////////////////
  107. // 函數(shù)類型 :自定義工具函數(shù)
  108. // 函數(shù)模塊 :
  109. ////////////////////////////////////////////////////////////////
  110. // 功能 : 創(chuàng)建具有高權(quán)限的進(jìn)程
  111. // 注意 :
  112. /////////////////////////////////////////////////////////////////
  113. // 作者 : sinister
  114. // 發(fā)布版本 : 1.00.00
  115. // 發(fā)布日期 : 2006.2.09
  116. /////////////////////////////////////////////////////////////////
  117. // 重 大 修 改 歷 史
  118. ////////////////////////////////////////////////////////////////
  119. // 修改者 :
  120. // 修改日期 :
  121. // 修改內(nèi)容 :
  122. /////////////////////////////////////////////////////////////////

  123. BOOL
  124. CreateSystemProcess( LPTSTR szProcessName )
  125. {
  126. HANDLE hProcess;
  127. HANDLE hToken, hNewToken;
  128. DWORD dwPid;

  129. PACL pOldDAcl = NULL;
  130. PACL pNewDAcl = NULL;
  131. BOOL bDAcl;
  132. BOOL bDefDAcl;
  133. DWORD dwRet;

  134. PACL pSacl = NULL;
  135. PSID pSidOwner = NULL;
  136. PSID pSidPrimary = NULL;
  137. DWORD dwAclSize = 0;
  138. DWORD dwSaclSize = 0;
  139. DWORD dwSidOwnLen = 0;
  140. DWORD dwSidPrimLen = 0;

  141. DWORD dwSDLen;
  142. EXPLICIT_ACCESS ea;
  143. PSECURITY_DESCRIPTOR pOrigSd = NULL;
  144. PSECURITY_DESCRIPTOR pNewSd = NULL;

  145. STARTUPINFO si;
  146. PROCESS_INFORMATION pi;

  147. BOOL bError;

  148. if ( !EnableDebugPriv( “SeDebugPrivilege” ) )
  149. {
  150. printf( “EnableDebugPriv() to failed!\n” );

  151. bError = TRUE;
  152. goto Cleanup;
  153. }

  154. //
  155. // 選擇 WINLOGON 進(jìn)程
  156. //
  157. if ( ( dwPid = GetProcessId( “WINLOGON.EXE” ) ) == NULL )
  158. {
  159. printf( “GetProcessId() to failed!\n” );

  160. bError = TRUE;
  161. goto Cleanup;
  162. }

  163. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPid );
  164. if ( hProcess == NULL )
  165. {
  166. printf( “OpenProcess() = %d\n”, GetLastError() );

  167. bError = TRUE;
  168. goto Cleanup;
  169. }

  170. if ( !OpenProcessToken( hProcess, READ_CONTROL | WRITE_DAC, &hToken ) )
  171. {
  172. printf( “OpenProcessToken() = %d\n”, GetLastError() );

  173. bError = TRUE;
  174. goto Cleanup;
  175. }

  176. //
  177. // 設(shè)置 ACE 具有所有訪問權(quán)限
  178. //
  179. ZeroMemory( &ea, sizeof( EXPLICIT_ACCESS ) );
  180. BuildExplicitAccessWithName( &ea,
  181. “Everyone”,
  182. TOKEN_ALL_ACCESS,
  183. GRANT_ACCESS,
  184. 0 );

  185. if ( !GetKernelObjectSecurity( hToken,
  186. DACL_SECURITY_INFORMATION,
  187. pOrigSd,
  188. 0,
  189. &dwSDLen ) )
  190. {
  191. //
  192. // 第一次調(diào)用給出的參數(shù)肯定返回這個錯誤,這樣做的目的是
  193. // 為了得到原安全描述符 pOrigSd 的長度
  194. //
  195. if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
  196. {
  197. pOrigSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
  198. HEAP_ZERO_MEMORY,
  199. dwSDLen );
  200. if ( pOrigSd == NULL )
  201. {
  202. printf( “Allocate pSd memory to failed!\n” );

  203. bError = TRUE;
  204. goto Cleanup;
  205. }

  206. //
  207. // 再次調(diào)用才正確得到安全描述符 pOrigSd
  208. //
  209. if ( !GetKernelObjectSecurity( hToken,
  210. DACL_SECURITY_INFORMATION,
  211. pOrigSd,
  212. dwSDLen,
  213. &dwSDLen ) )
  214. {
  215. printf( “GetKernelObjectSecurity() = %d\n”, GetLastError() );
  216. bError = TRUE;
  217. goto Cleanup;
  218. }
  219. }
  220. else
  221. {
  222. printf( “GetKernelObjectSecurity() = %d\n”, GetLastError() );
  223. bError = TRUE;
  224. goto Cleanup;
  225. }
  226. }

  227. //
  228. // 得到原安全描述符的訪問控制列表 ACL
  229. //
  230. if ( !GetSecurityDescriptorDacl( pOrigSd, &bDAcl, &pOldDAcl, &bDefDAcl ) )
  231. {
  232. printf( “GetSecurityDescriptorDacl() = %d\n”, GetLastError() );

  233. bError = TRUE;
  234. goto Cleanup;
  235. }

  236. //
  237. // 生成新 ACE 權(quán)限的訪問控制列表 ACL
  238. //
  239. dwRet = SetEntriesInAcl( 1, &ea, pOldDAcl, &pNewDAcl );
  240. if ( dwRet != ERROR_SUCCESS )
  241. {
  242. printf( “SetEntriesInAcl() = %d\n”, GetLastError() );
  243. pNewDAcl = NULL;

  244. bError = TRUE;
  245. goto Cleanup;
  246. }

  247. if ( !MakeAbsoluteSD( pOrigSd,
  248. pNewSd,
  249. &dwSDLen,
  250. pOldDAcl,
  251. &dwAclSize,
  252. pSacl,
  253. &dwSaclSize,
  254. pSidOwner,
  255. &dwSidOwnLen,
  256. pSidPrimary,
  257. &dwSidPrimLen ) )
  258. {
  259. //
  260. // 第一次調(diào)用給出的參數(shù)肯定返回這個錯誤,這樣做的目的是
  261. // 為了創(chuàng)建新的安全描述符 pNewSd 而得到各項(xiàng)的長度
  262. //
  263. if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
  264. {
  265. pOldDAcl = ( PACL ) HeapAlloc( GetProcessHeap(),
  266. HEAP_ZERO_MEMORY,
  267. dwAclSize );
  268. pSacl = ( PACL ) HeapAlloc( GetProcessHeap(),
  269. HEAP_ZERO_MEMORY,
  270. dwSaclSize );
  271. pSidOwner = ( PSID ) HeapAlloc( GetProcessHeap(),
  272. HEAP_ZERO_MEMORY,
  273. dwSidOwnLen );
  274. pSidPrimary = ( PSID ) HeapAlloc( GetProcessHeap(),
  275. HEAP_ZERO_MEMORY,
  276. dwSidPrimLen );
  277. pNewSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
  278. HEAP_ZERO_MEMORY,
  279. dwSDLen );

  280. if ( pOldDAcl == NULL ||
  281. pSacl == NULL ||
  282. pSidOwner == NULL ||
  283. pSidPrimary == NULL ||
  284. pNewSd == NULL )
  285. {
  286. printf( “Allocate SID or ACL to failed!\n” );

  287. bError = TRUE;
  288. goto Cleanup;
  289. }

  290. //
  291. // 再次調(diào)用才可以成功創(chuàng)建新的安全描述符 pNewSd
  292. // 但新的安全描述符仍然是原訪問控制列表 ACL
  293. //
  294. if ( !MakeAbsoluteSD( pOrigSd,
  295. pNewSd,
  296. &dwSDLen,
  297. pOldDAcl,
  298. &dwAclSize,
  299. pSacl,
  300. &dwSaclSize,
  301. pSidOwner,
  302. &dwSidOwnLen,
  303. pSidPrimary,
  304. &dwSidPrimLen ) )
  305. {
  306. printf( “MakeAbsoluteSD() = %d\n”, GetLastError() );

  307. bError = TRUE;
  308. goto Cleanup;
  309. }
  310. }
  311. else
  312. {
  313. printf( “MakeAbsoluteSD() = %d\n”, GetLastError() );

  314. bError = TRUE;
  315. goto Cleanup;
  316. }
  317. }

  318. //
  319. // 將具有所有訪問權(quán)限的訪問控制列表 pNewDAcl 加入到新的
  320. // 安全描述符 pNewSd 中
  321. //
  322. if ( !SetSecurityDescriptorDacl( pNewSd, bDAcl, pNewDAcl, bDefDAcl ) )
  323. {
  324. printf( “SetSecurityDescriptorDacl() = %d\n”, GetLastError() );

  325. bError = TRUE;
  326. goto Cleanup;
  327. }

  328. //
  329. // 將新的安全描述符加到 TOKEN 中
  330. //
  331. if ( !SetKernelObjectSecurity( hToken, DACL_SECURITY_INFORMATION, pNewSd ) )
  332. {
  333. printf( “SetKernelObjectSecurity() = %d\n”, GetLastError() );

  334. bError = TRUE;
  335. goto Cleanup;
  336. }

  337. //
  338. // 再次打開 WINLOGON 進(jìn)程的 TOKEN,這時已經(jīng)具有所有訪問權(quán)限
  339. //
  340. if ( !OpenProcessToken( hProcess, TOKEN_ALL_ACCESS, &hToken ) )
  341. {
  342. printf( “OpenProcessToken() = %d\n”, GetLastError() );

  343. bError = TRUE;
  344. goto Cleanup;
  345. }

  346. //
  347. // 復(fù)制一份具有相同訪問權(quán)限的 TOKEN
  348. //
  349. if ( !DuplicateTokenEx( hToken,
  350. TOKEN_ALL_ACCESS,
  351. NULL,
  352. SecurityImpersonation,
  353. TokenPrimary,
  354. &hNewToken ) )
  355. {
  356. printf( “DuplicateTokenEx() = %d\n”, GetLastError() );

  357. bError = TRUE;
  358. goto Cleanup;
  359. }


  360. ZeroMemory( &si, sizeof( STARTUPINFO ) );
  361. si.cb = sizeof( STARTUPINFO );

  362. //
  363. // 不虛擬登陸用戶的話,創(chuàng)建新進(jìn)程會提示
  364. // 1314 客戶沒有所需的特權(quán)錯誤
  365. //
  366. ImpersonateLoggedOnUser( hNewToken );


  367. //
  368. // 我們僅僅是需要建立高權(quán)限進(jìn)程,不用切換用戶
  369. // 所以也無需設(shè)置相關(guān)桌面,有了新 TOKEN 足夠
  370. //


  371. //
  372. // 利用具有所有權(quán)限的 TOKEN,創(chuàng)建高權(quán)限進(jìn)程
  373. //
  374. if ( !CreateProcessAsUser( hNewToken,
  375. NULL,
  376. szProcessName,
  377. NULL,
  378. NULL,
  379. FALSE,
  380. NULL, //NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
  381. NULL,
  382. NULL,
  383. &si,
  384. π ) )
  385. {
  386. printf( “CreateProcessAsUser() = %d\n”, GetLastError() );

  387. bError = TRUE;
  388. goto Cleanup;
  389. }

  390. bError = FALSE;

  391. Cleanup:
  392. if ( pOrigSd )
  393. {
  394. HeapFree( GetProcessHeap(), 0, pOrigSd );
  395. }
  396. if ( pNewSd )
  397. {
  398. HeapFree( GetProcessHeap(), 0, pNewSd );
  399. }
  400. if ( pSidPrimary )
  401. {
  402. HeapFree( GetProcessHeap(), 0, pSidPrimary );
  403. }
  404. if ( pSidOwner )
  405. {
  406. HeapFree( GetProcessHeap(), 0, pSidOwner );
  407. }
  408. if ( pSacl )
  409. {
  410. HeapFree( GetProcessHeap(), 0, pSacl );
  411. }
  412. if ( pOldDAcl )
  413. {
  414. HeapFree( GetProcessHeap(), 0, pOldDAcl );
  415. }

  416. CloseHandle( pi.hProcess );
  417. CloseHandle( pi.hThread );
  418. CloseHandle( hToken );
  419. CloseHandle( hNewToken );
  420. CloseHandle( hProcess );

  421. if ( bError )
  422. {
  423. return FALSE;
  424. }

  425. return TRUE;
  426. }


  427. void
  428. main( int argc, char** argv )
  429. {
  430. if ( argc < 2 )
  431. {
  432. printf( “Usage: wssrun \n” );
  433. return ;
  434. }

  435. if ( CreateSystemProcess( argv[1] ) == FALSE )
  436. {
  437. printf( “wssrun: CreateSystemProcess() to failed!\n” );
  438. return ;
  439. }
  440. }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)機(jī)有關(guān)的函數(shù)
三個給進(jìn)程提權(quán)的方法 (c/cpp)
文件占坑法過360查殺
WINDOWS系統(tǒng)下木馬程序的設(shè)計(jì)與實(shí)現(xiàn)
獲取進(jìn)程模塊的信息
C++ 讓電腦關(guān)機(jī),重啟,注銷
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服