<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Запуск скрипта с UIAccess с токеном от системного процесса.]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=17864</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=17864&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Запуск скрипта с UIAccess с токеном от системного процесса.».]]></description>
		<lastBuildDate>Mon, 10 Jul 2023 11:50:43 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AHK: Запуск скрипта с UIAccess с токеном от системного процесса.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=158701#p158701</link>
			<description><![CDATA[<p>Нашел интересный хак: как запустить скрипт с флагом UIAccess без использования AutoHotkeyU64_UIA, а с присваиванием токена из системного процесса.<br /><a href="https://www.autoitscript.com/forum/topic/210526-make-your-program-super-topmost-uiaccess-udf/">https://www.autoitscript.com/forum/topi … ccess-udf/</a><br />На ahk будет как-то так (нужно запускать скрипт от имени администратора):<br /></p><div class="codebox"><pre><code>#SingleInstance Force
RunWithUiAccess()
Gui, +HWNDhGui +AlwaysOnTop
DllCall(&quot;GetWindowBand&quot;, &quot;uptr&quot;, hGui, &quot;uint*&quot;, band)
msgbox % band
return

RunWithUiAccess()
{
   Gui, +HWNDhGui +AlwaysOnTop
   DllCall(&quot;GetWindowBand&quot;, &quot;uptr&quot;, hGui, &quot;uint*&quot;, band)
   Gui, Destroy
   hGui := &quot;&quot;
   if (band = 1)
   {
      if !DllCall(&quot;advapi32\LookupPrivilegeValueW&quot;, &quot;ptr&quot;, 0, &quot;str&quot;, &quot;SeTcbPrivilege&quot;, &quot;int64*&quot;, luid)
      {
         msgbox LookupPrivilegeValueW error`n%A_LastError%
         exitapp
      }
      VarSetCapacity(PRIVILEGE_SET, 20, 0)
      NumPut(1, PRIVILEGE_SET, 0, &quot;uint&quot;)
      NumPut(PRIVILEGE_SET_ALL_NECESSARY := 1, PRIVILEGE_SET, 4, &quot;uint&quot;)
      NumPut(luid, PRIVILEGE_SET, 8, &quot;int64&quot;)
      DllCall(&quot;advapi32\OpenProcessToken&quot;, &quot;ptr&quot;, DllCall(&quot;GetCurrentProcess&quot;, &quot;ptr&quot;), &quot;uint&quot;, 0x0008|0x0002, &quot;ptr*&quot;, hTokenSelf)   ; TOKEN_QUERY|TOKEN_DUPLICATE
      DllCall(&quot;advapi32\GetTokenInformation&quot;, &quot;ptr&quot;, hTokenSelf, &quot;uint&quot;, 12, &quot;uint*&quot;, TokenSelfSessionId, &quot;uint&quot;, 4, &quot;uint*&quot;, ReturnLength)
      hSnapshot := DllCall(&quot;CreateToolhelp32Snapshot&quot;, &quot;uint&quot;, TH32CS_SNAPPROCESS := 0x00000002, &quot;uint&quot;, 0, &quot;ptr&quot;)
      VarSetCapacity(PROCESSENTRY32, A_PtrSize*3 + 544, 0)
      NumPut(A_PtrSize*3 + 544, PROCESSENTRY32, 0, &quot;uint&quot;)
      loop
      {
         if (A_Index = 1)
            hr := DllCall(&quot;Process32FirstW&quot;, &quot;ptr&quot;, hSnapshot, &quot;ptr&quot;, &amp;PROCESSENTRY32)
         else
            hr := DllCall(&quot;Process32NextW&quot;, &quot;ptr&quot;, hSnapshot, &quot;ptr&quot;, &amp;PROCESSENTRY32)
         if !hr
            break
         if (StrGet(&amp;PROCESSENTRY32 + A_PtrSize*2 + 28, &quot;utf-16&quot;) = &quot;winlogon.exe&quot;)
         {
            hProcess := DllCall(&quot;OpenProcess&quot;, &quot;uint&quot;, PROCESS_QUERY_LIMITED_INFORMATION := 0x1000, &quot;int&quot;, false, &quot;uint&quot;, NumGet(PROCESSENTRY32, 8, &quot;uint&quot;), &quot;ptr&quot;)
            DllCall(&quot;advapi32\OpenProcessToken&quot;, &quot;ptr&quot;, hProcess, &quot;uint&quot;, 0x0008|0x0002, &quot;ptr*&quot;, hToken)   ; TOKEN_QUERY|TOKEN_DUPLICATE
            DllCall(&quot;advapi32\PrivilegeCheck&quot;, &quot;ptr&quot;, hToken, &quot;ptr&quot;, &amp;PRIVILEGE_SET, &quot;int*&quot;, pfResult)
            if pfResult
            {
               DllCall(&quot;advapi32\GetTokenInformation&quot;, &quot;ptr&quot;, hToken, &quot;uint&quot;, 12, &quot;uint*&quot;, TokenSessionId, &quot;uint&quot;, 4, &quot;uint*&quot;, ReturnLength)
               if (TokenSessionId = TokenSelfSessionId)
               {
                  DllCall(&quot;advapi32\GetTokenInformation&quot;, &quot;ptr&quot;, hToken, &quot;uint&quot;, 1, &quot;ptr&quot;, 0, &quot;uint&quot;, 0, &quot;uint*&quot;, ReturnLength)
                  VarSetCapacity(TokenUser, ReturnLength, 0)
                  DllCall(&quot;advapi32\GetTokenInformation&quot;, &quot;ptr&quot;, hToken, &quot;uint&quot;, 1, &quot;ptr&quot;, &amp;TokenUser, &quot;uint&quot;, ReturnLength, &quot;uint*&quot;, ReturnLength)
                  if DllCall(&quot;advapi32\IsWellKnownSid&quot;, &quot;ptr&quot;, NumGet(TokenUser), &quot;uint&quot;, WinLocalSystemSid := 22)
                     DllCall(&quot;advapi32\DuplicateTokenEx&quot;, &quot;ptr&quot;, hToken, &quot;uint&quot;, TOKEN_IMPERSONATE := 0x0004, &quot;ptr&quot;, 0, &quot;int&quot;, SecurityImpersonation := 2, &quot;int&quot;, TokenImpersonation := 2, &quot;ptr*&quot;, hTokenSystem)
               }
            }
            DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, hProcess)
            DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, hToken)
            if hTokenSystem
               break
         }
      }
      DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, hSnapshot)
      if !hTokenSystem
      {
         msgbox RunWithUiAccess error
         exitapp
      }
      DllCall(&quot;advapi32\SetThreadToken&quot;, &quot;ptr&quot;, 0, &quot;ptr&quot;, hTokenSystem)
      DllCall(&quot;advapi32\DuplicateTokenEx&quot;, &quot;ptr&quot;, hTokenSelf, &quot;uint&quot;, 0x0008|0x0002|0x0001|0x0080, &quot;ptr&quot;, 0, &quot;int&quot;, SecurityAnonymous := 0, &quot;int&quot;, TokenPrimary := 1, &quot;ptr*&quot;, hTokenUIAccess)   ; TOKEN_QUERY|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_DEFAULT
      DllCall(&quot;advapi32\SetTokenInformation&quot;, &quot;ptr&quot;, hTokenUIAccess, &quot;uint&quot;, TokenUIAccess := 26, &quot;uint*&quot;, true, &quot;uint&quot;, 4)
      DllCall(&quot;advapi32\RevertToSelf&quot;)
      DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, hTokenSystem)
      DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, hTokenSelf)
      VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 8, 0)
      VarSetCapacity(STARTUPINFO, A_PtrSize*9 + 32, 0)
      NumPut(A_PtrSize*9 + 32, STARTUPINFO, 0, &quot;uint&quot;)
      DllCall(&quot;GetStartupInfo&quot;, &quot;ptr&quot;, &amp;STARTUPINFO)
      DllCall(&quot;advapi32\CreateProcessAsUserW&quot;, &quot;ptr&quot;, hTokenUIAccess, &quot;ptr&quot;, 0, &quot;wstr&quot;, DllCall(&quot;GetCommandLineW&quot;, &quot;wstr&quot;), &quot;ptr&quot;, 0, &quot;ptr&quot;, 0, &quot;int&quot;, 0, &quot;uint&quot;, 0, &quot;ptr&quot;, 0, &quot;wstr&quot;, A_ScriptDir, &quot;ptr&quot;, &amp;STARTUPINFO, &quot;ptr&quot;, &amp;PROCESS_INFORMATION)
      DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, NumGet(PROCESS_INFORMATION, 0, &quot;ptr&quot;))
      DllCall(&quot;CloseHandle&quot;, &quot;ptr&quot;, NumGet(PROCESS_INFORMATION, A_PtrSize, &quot;ptr&quot;))
      sleep 1000
   }
}</code></pre></div><p><a href="http://forum.script-coding.com/viewtopic.php?pid=158702">Тема для обсуждения</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Mon, 10 Jul 2023 11:50:43 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=158701#p158701</guid>
		</item>
	</channel>
</rss>
