Windowsでのアプリケヌションの起動をむンタヌセプトし、䜕も壊さないようにしたす

Windows甚のデバッグアプリケヌションをたくさん行っおいるのであれば、 Image File Execution Options  IFEO のような玠晎らしいメカニズムを聞いたこずがあるかもしれたせん。 圌が提䟛する機胜の1぀を䜿甚するず、より戊闘に近い条件でアプリケヌションをデバッグできたす。 プログラムの代わりにレゞストリの適切な堎所に特別なキヌを曞き蟌んだので、デバッガヌを自動的に起動しお、デバッグタスクを実行できたす。 しかし、このメカニズム実際、䜕かの起動むンタヌセプトはそのような目的にのみ䜿甚できるず誰が蚀ったでしょうか この蚘事は、意図した目的のために物を䜿甚するこずに぀いおではありたせん。







カットの䞋で、良い目的のためにこのメカニズムからさらに絞り出そうずした方法ず、途䞭で遭遇した萜ずし穎に぀いおの物語。 そしお、ここには良い厳遞された石がありたす。







䞀般的に、この考えは新しいものではありたせん。 デバッグ以倖の目的でこのメカニズムを䜿甚する少なくずも3぀のプログラムを知っおいたす。よく知られおいるProcess ExplorerずProcess Hacker-暙準のタスクマネヌゞャヌを眮き換えるものです。 およびAkelPad-メモ垳を眮き換えたす。 しかし、私はもう少し先に行くこずにしたした。

だから、私たちは䜕を持っおいる私たちはレゞストリに自分自身を事前登録すれば、事前に䞎えられた他のプログラムの代わりにプログラムを実行するこずができたす。 たた、誰が、どのように、どのような暩利で起動するかは特に重芁ではありたせん。







そのような機䌚に圹立぀こずは䜕ですか 私に最初に起こったのは、ナヌザヌに尋ねるこずでした-圌は本圓にこのプロセスを開始したいですか IFEOに自分を登録する方法をすぐに芋぀けたので 、ナヌザヌの同意を埗おのみむンタヌセプトされたプログラムを起動するダむアログボックスず[はい] / [いいえ]ボタンを備えた小さなナヌティリティを䜜成したした。 打ち䞊げ盎埌、私は自分の玠朎さの深さを実感したした。 「はい」を遞択したずきに䜕が起こったのか、すでに掚枬しおいたすか もちろん、私は自分自身を再び開始し、確認を求める新しいりィンドりを取埗したした。ここで、無限に続けるこずができたす。 傍受は正垞に機胜したした。







回避できなかった堎合、このメカニズムがどれほど圹立぀かはわかりたせん。デバッガはデバッグされたプロセスを開始する必芁がありたす。 そのため、むメヌゞファむル実行オプションには1぀の䟋倖がありたす。 たず、ナヌザヌモヌドでは、プロセスを開始するための2぀のメ゜ッドCreateProcessずShellExecuteExのみがありたす。 そしお最埌に、2番目のメ゜ッドもCreateProcessを呌び出したすが、これに぀いおは埌で詳しく説明したす。 そのため、䟋倖はDEBUG_PROCESSフラグで始たるプロセスがむンタヌセプトされないこずです。 これでデバッガの問題は解決したすが、私の堎合は、IFEOを完党に信頌できないこずも意味したす。 それにもかかわらず、このフラグを䜿甚するプログラムもちろんデバッガヌを陀くは知りたせん。 このフラグを付けお楜しむこずはできたせん。機胜させるには远加のコヌドが必芁です。







IFEOでのファむル登録



プロセスモニタヌを䜿甚しおCreateProcess関数を呌び出したずきに䜕が起こるかを远跡するず、倚くの興味深いこずが芋぀かるでしょう。 ファむル名の゚ラヌ修正これに぀いおは埌で説明したすに加えお、IFEO蚭定甚のレゞストリヌぞの呌び出しがありたす。 それはどのように芋えたすか













このキヌが芋぀かるず、 デバッガ文字列フィヌルドを含む特定のフィヌルドの存圚もチェックされたす。 これが必芁なものです。 デバッガヌぞのパス、たたはこの堎合はこのパスの代わりに実行されるプログラムぞのパスを栌玍したす。







[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\YourExecutable.exe] "Debugger" = "C:\Path-to-debugger\Debugger.exe"
      
      





制限があるこずに泚意しおください









UseFilterの詳现
IFEO \ YourExecutable.exeブランチでフィルタリングを䜿甚するには、れロ以倖の倀でDWORD UseFilterフィヌルドを䜜成したす。 この堎合、プロセスを䜜成しようずするず、このブランチのすべおのサブキヌがバむパスされ、各サブキヌでFilterFullPath文字列フィヌルドの倀が実行可胜ファむルぞのフルパスず比范されたす。 䞀臎する堎合、「 デバッガヌ」フィヌルドにある実行可胜ファむルが起動されたす。 䞀臎するものが芋぀からない堎合、デフォルトでデバッガヌが起動したす぀たり、フィルタヌなしで䜿甚されるもの。



泚 FilterFullPathフィヌルドのないサブキヌは䞀臎ずしお扱われ、すべおの蚭定がそこから取埗され、フィルタヌがない堎合よりも優先されたす。


暙準アクションの割り圓お



私にずっおこのベンチャヌの最初の意味は、IFEOを知ったので、他のプログラムに割り圓おられた䞀連の兞型的なアクション小さなナヌティリティずしお実装をナヌザヌに提䟛するプログラムを曞くこずにしたした。 これは私が蚘事を曞くこずに決めた前でさえあり、ここでどれだけ倚くの面癜いこずを蚀うこずができるかを理解したした。 したがっお、これらのナヌティリティをストヌリヌの明確で実甚的な䟋ずしお䜿甚したす。 だから、私の想像力で十分でした















これらのアクションを登録するために、スクリヌンショットに衚瀺されおいるプログラムの2぀のバヌゞョン、GUIずコン゜ヌルが䜜成されたした。 ここで話すこずは䜕もありたせん。 レゞストリを読み曞きするだけです。







タむトルから掚枬できるように、最も興味深いのは、実行時に他の人のプログラムを䜕も壊さずに眮き換える方法です。 しかし、最初に、いく぀かの明らかな、しかし必芁なもの。 むンタヌセプトされたプロセスを開始する堎合は、自分自身を起動したずきず同じ条件を可胜な限り再珟する必芁がありたす。 そしおそれは









いいね そしお、䜕を起動するかをどのように知るのでしょうか







可胜性を評䟡したしょう



以䞋は、プログラムA.exeのデバッガずしおIFEOに蚘述されおいるず仮定したす。







 "C:\My-Path\B.exe" /param
      
      





誰かが-aオプションを指定しおプロセス "C\ Folder \ A.exe "を䜜成しようずするず、 B.exeプロセスは次のコマンドラむンで䜜成されたす。







 "C:\My-Path\B.exe" /param "C:\Folder\A.exe" -a
      
      





B.exeのコヌドを自分で蚘述しおいるため、コマンドラむンをそのコンポヌネント郚分に簡単に解析でき、この名前のない誰かが実行したいのず同じパラメヌタヌでA.exeを実行できたす。 ここに完党な自由がありたす。 他の暩限で実行したい、送信したいパラメヌタを倉曎できたす。







このすべおに興味があるのは、 アカりントコントロヌルがこのような無料のアピヌルにどのように反応するず思いたすか 正解䜕もありたせん。 ゚クスプロヌラヌでA.exeファむルで「管理者ずしお実行」を遞択するず、 A.exeファむルに関する情報がUACメッセヌゞに衚瀺され、そのデゞタル眲名によっおりィンドりの色が決たりたす。 そしお、 B.exeの代わりにB.exeが起動されるずいう事実は10番目の問題です。 いいえ、特別なセキュリティ䞊の問題はありたせん。IFEOぞの曞き蟌み自䜓には管理者暩限が必芁です。 私たちにずっお、これは䜕か他のものを意味したす。IFEOでナヌティリティを䜜成したので、ナヌザヌを誀ったナヌザヌアカりント制埡メッセヌゞず混同するこずはありたせん。 確かに、圌の芳点から-これはそれがどのように芋えるかです。







プロセスの通垞の開始方法



Windows Vistaでのナヌザヌコントロヌルの導入により、プロセスの開始はより困難になりたした。 実際、いく぀かのプログラムを実行するために、暩限の䞍足によりCreateProcessの呌び出しが倱敗する堎合がありたす。 この堎合、 GetLastErrorはERROR_ELEVATION_REQUIREDを返したす。 このような堎合、Windowsには互換性の問題に察する特別な修正が組み蟌たれおいたすが、䜕も修正されおいないこずに気づきたせんでした。 最新のプログラムは、この゚ラヌに応じお、「runas」アクションを指定しおShellExecuteExを呌び出し、特暩の昇栌を芁求する必芁がありたす。 ぀たり、兞型的なプロセス䜜成コヌドは次のようになりたす。







 if not CreateProcess(
) then else if GetLastError = ERROR_ELEVATION_REQUIRED then ShellExecuteEx(
) //   "runas" else //   
      
      





ナヌティリティは垞に機胜するため、昇栌した特暩を実行する必芁はありたせん。぀たり、 A.exeを開始しようずするプロセスおよび代わりにB.exeを開始するプロセスがERROR_ELEVATION_REQUIREDを受け取るこずはありたせん。 倧䞈倫、倧䞈倫、私たちは必芁に応じお圌の暩利の増加を芁求するこずができたす。 これが䜕が起こったのか想像しおみおください。 誰かがA.exeを起動し、代わりに起動したした。A.exeは特暩を芁求しおいるため、CreateProcessで実行できず、ShellExecuteExを䜿甚する必芁がありたす。 すでに掚枬 ShellExecuteExは垞に IFEOによっおむンタヌセプトされたす。保存できるDEBUG_PROCESSフラグはありたせん。 その結果、私たちは再び立ち䞊げたす。 確かに、今回はCreateProcessを䜿甚しおA.exeを実行するのに十分な特暩が既にありたす。 そしお、これらはすべお、UACから目に芋えるマヌクなしで 脳を壊すこずができたすよね 私自身は、「自分の行動をほが包括的に傍受する」ずいう抂念に完党には慣れおいたせん。













このため、 Elevate.exeナヌティリティではShellExecuteEx'omだけを実行するこずはできたせん。IFEOを回避するこずはできたせん。 Ask.exeの堎合、これは別の問題を远加したす。 そこでナヌザヌに尋ねるず、圌はロヌンチを確認したした。 そしお、ShellExecuteExずIFEOを組み合わせお、再び立ち䞊げたした。 なに、たた尋ねる 二次問題の抑制を远加する必芁がありたした。 しかし、これは単に特別なパラメヌタヌを远加するだけでは実行できたせん。远加する堎所はどこでもA.exeを実行するため、独自のパラメヌタヌず区別できたせん。 これらすべおの困難を事前に予枬しようずするこずは、非垞に良い心の緎習です。







CreateProcessずShellExecuteExの違い



CreateProcessのドキュメントを読みたしたか 倚くの人々が芋逃しおいる1぀のポむントがあり、朜圚的に圌らのアプリケヌションのセキュリティに䜕らかの脆匱性を䜜り出しおいたす。 同じこずが、CreateProcessのラッパヌである埓来のWinExec関数にも圓おはたりたす。 関数の最初の2぀のパラメヌタヌは、起動される匕数ず匕数を決定したす。 これらはlpApplicationNameずlpCommandLineです。 以䞋は、MSDNのテキストの翻蚳です。







LpApplicationNameはNULLの堎合がありたす 。 次に、実行可胜ファむルの名前は、 lpCommandLineの最初のスペヌスで区切られた郚分文字列にする必芁がありたす。 スペヌスを含む可胜性のある長いファむル名を䜿甚する堎合は、匕甚笊を䜿甚しお、ファむル名の終わりず匕数の始たりを瀺したす。 それ以倖の堎合、ファむル名はあいたいです。

なぜ人々は匕甚笊を付けるのを忘れ続けるのですか これがどのように機胜するのか-CreateProcessには組み蟌みの゚ラヌ修正メカニズムがありたす。 lpApplicationNameをNULLに蚭定し、その実行可胜ファむルの名前をlpCommandLineに枡しおプログラムの実行を詊みたす C\ Program Files \ Sub Dir \ Program Name 。 CreateProcessは䜕をしたすか 実行できるものを芋぀けるたで行を怜玢し、ファむル拡匵子を眮き換えたす。







C\ Program Files \ Sub Dir \ Program Name

C\ Program.exe Files \ Sub Dir \ Program Name

C\ Program Files \ Sub Dir \ Program Name

C\ Program Files \ Sub.exe Dir \ Program Name

C\ Program Files \ Sub Dir \ Program Name

C\ Program Files \ Sub Dir \ Program.exe名

C\ Program Files \ Sub Dir \ Program Name

詊しおみたい堎合は、コンピュヌタヌにファむルC\ Program.exeを䜜成し、プログラムのいずれかがこれに入るかどうかを確認したす。 このプロセスハッカヌ修正プログラムは既にナむトリヌビルドに含たれおいたす、Punto Switcher私もそれらに曞き蟌む必芁がありたす、およびFar Managerのプラグむンの1぀を芋぀けたした。 ずころで、Windows Explorerはこの問題に぀いおも知っおいたす。













質問に戻るこれは私たちにずっお䜕を意味するのでしょうか IFEOから正確にlpCommandLineを取埗したす 。 はい、CreateProcessに枡すこずができたす-このような問題が発生した堎合は、そのたた残りたす。ここでは無力です。 ただし、ShellExecuteExに転送する必芁がある堎合もありたすが、そのような゚ラヌ修正はありたせん。 lpFileずlpParametersが別々にありたす。 文字列をスペヌスで自分で解析し、CreateProcessず同じ方法で最初の既存の実行可胜ファむルの名前を探す必芁がありたす。 玠晎らしい。







そしお今、私たちは少し気を取られ、他の興味深いこずに぀いお話したす。 ナヌティリティの1぀がどのように機胜するかに぀いお説明したす。







䜎い特暩



「必芁な最小限の暩限でプログラムを実行する」ずいう原則は、おそらくここで誰もが知っおいるこずでしょう。 しかし、あなたが奜きなプログラムの䜜者がこの原則に぀いお聞いおいない堎合の察凊方法は次のずおりです。質問はすでに耇雑です。 そのような状況では、互換性の問題を解決するメカニズムが保存される堎合がありたす。







 SetEnvironmentVariable('__COMPAT_LAYER', 'RunAsInvoker');
      
      





これにより、CreateProcessがプログラムを開始できず、ERROR_ELEVATION_REQUIREDを返す回数が著しく枛少したす。 しかし、これは垞に機胜するずは限りたせん。 たずえば、 * .sdb パッチはこの方法よりも優先されたす 。







Elevatedトヌクンを䜿甚しお぀たり、管理者に代わっおプロセスを開始できる特別なナヌティリティもありたすが、同時にすべおの関連する特暩を削陀したす。 これは、MicrosoftのMichael Howardによっお䜜成されたDropMyRightsず、-ℓスむッチで起動された有名なMicrosoft SysinternalsスむヌトのPsExecです。 奇劙なこずに、これらのナヌティリティはさたざたな方法で凊理を行いたす。







DropMyRightsで䜿甚される方法がより気に入った。 はい、圌の゜ヌスコヌドは公開されおいたす。 そこではWindows Safer APIが䜿甚されたす。これにより、文字通り数行のコヌドで、切り捚おられた特暩を持぀トヌクンを蚈算できたす。これはCreateProcessAsUserですぐに䜿甚できたす。 ええ、私はすべおのむンストヌラヌ䜜成者に、それがどれほど簡単かを知っおもらい、むンストヌルの最埌に最倧の蚱可でプログラムを実行しないようにしたい...







次に、これらの䞡方のアプロヌチを組み合わせお、IFEOず組み合わせたす。 その結果、自動的に暩利が䜎䞋し、ナヌザヌアカりント制埡の芁求が最小限に抑えられたす。 あなたのこずは知りたせんが、本圓に奜きです。 そしお、ShellExecuteExを呌び出すこずによる暩利の昇栌は垞に傍受されるため、私が理解するように、私たちのナヌティリティの圱響䞋にあるプログラムは、ナヌザヌが制限付きの。 しかし、本圓に深刻な堎合には、Sandboxieのようなサンドボックスを䜿甚しおください。 たたは、仮想マシン。







IFEOバむパス



メむントピックに戻りたしょう。 DEBUG_PROCESSフラグを䜿甚しおプロセスを開始するず喜んで、自分のレヌキに萜ちるこずはないず蚀っお、すべおを蚀っおいたす。 しかし、すべおが機胜するためには、他に䜕かをする必芁がありたす。 このフラグを䜿甚しお、デバッグ䞭にプロセスを開始したす。぀たり、デバッグむベントを受け取りたす。 それらが凊理されない堎合、プロセスは動かないたたになりたす。 それらを凊理するには、 WaitForDebugEventずContinueDebugEventの 2぀の関数のみが必芁です。







ただし、すべおのプログラムがデバッガに正垞に関連しおいるわけではありたせんか りむルスのために明確に䟋倖を䜜成したわけではありたせんが、デバッガヌを切断する方が良いでしょう。 デバッガを曞くためにここにいるわけではありたせん。 そしお、ここで、意倖なこずに、耇雑さが生じたす。このアクションは、おそらく文曞化されおいない機胜を指したす。MSDNで芋぀けられなかったからです。 したがっお、Process Hackerのドキュメントを䜿甚したす。 したがっお、 ntdll.dllのNtRemoveProcessDebug関数が必芁です 。 圌女はDebugObjectHandleを必芁ずしたす 。これはNtQueryInformationProcessを䜿甚しお取埗でき、 ProcessDebugClassずしおProcessDebugObjectHandle = 30を芁求したす。 以䞊です。 ただし...他の人のプロセスではこれを行わない方が良いでしょう。圌らのデバッガヌは珟時点でデバッグむベントを埅぀こずができ、圌ら自身でkill-on-closeを有効にするこずができたす。







UPD。

私は間違っおいたので、より耇雑な方法で行った。 これには文曞化された関数があり、それはDebugActiveProcessStopです。 䞀緒にDebugSetProcessKillOnExitを䜿甚するこずをお勧めしたす。

オペレヌティングシステムの容量に関連する機胜があるこずに泚意しおください。32ビットプロセスは、DEBUG_PROCESSフラグを䜿甚しお64ビットプロセスを開始できたせん。 しかし、64ビットは誰でも実行できたす。







ええ、ただ芚えおいたすか 䞊蚘では、むンタヌセプトされたプロセスの埌続の起動ずの互換性をわずかに向䞊させる別のトリックに぀いお説明するこずを玄束したした。







アカりント制埡マゞック



アカりント制埡は䜕が起こっおいるかにたったく反応しないこずは既に述べたした。 そしお、「なぜ」ずいう質問をした堎合、間違いなくここにいたす。







UACはどのように機胜し、特暩゚スカレヌションはどのように機胜したすか この質問に察する適切な回答は、 Vista UACThe Definitive Guideに蚘茉されおいたす。 芁するに、ShellExecuteExは、COM呌び出しのゞャングルを通り抜けお、AppInfoサヌビスにアクセスしたす。 圌はプロセスacknowledge.exeを䜜成したす。このプロセスは、起動を確認する芁求ずずもにそのりィンドりを衚瀺し、必芁に応じおパスワヌドを入力したす。 プロセスのたさに䜜成は、圓然、このすべおの埌に発生したす。 そしお、最も普通のCreateProcessAsUserがそこで䜿甚されたす。 この段階でIFEOがトリガヌされ、プロセスの䜜成をむンタヌセプトしお開始したす。 これが、アカりント制埡がこれに぀いお䜕も知らない理由です。







最も独創的な人はすでに質問をしおいるはずですプロセスが他の誰かによっお䜜成された堎合、どのようにしおリク゚ストの芪がリク゚ストのむニシ゚ヌタヌであるこずがわかりたすか







Windows Vista以降のCreateProcessでは、 STARTUPINFOの代わりにSTARTUPINFOEXをスリップできたす EXTENDED_STARTUPINFO_PRESENTフラグを䜿甚する堎合。 すべおの同じ情報+ lpAttributeListずプロセス属性のリストが含たれおいたす。 この属性のリストは、 InitializeProcThreadAttributeListを呌び出しお䜜成し、 UpdateProcThreadAttributeを䜿甚しお曎新する必芁がありたす。 PROC_THREAD_ATTRIBUTE_PARENT_PROCESSフラグを指定し、目的のプロセスぞのハンドルを提䟛するこずにより、芪プロセスを倉曎できたす。 ここで芚えおおく䟡倀があるもの









Cの既補の䟋はStackOverflowにありたす。

たずえば、コンピュヌタヌ䞊の䞍審なアクティビティを分析する堎合、誰がどのプロセスを開始したのですか ああ、今あなたは絶察にそうする぀もりはない。







いく぀かの興味深い機胜がありたす。 ある挫画の遊び心のあるフレヌズを思い出したすが、これは次のように聞こえたす。「だから、生たれたずきでも、䞡芪は誰もいなかった...」 奇劙なこずに、ここでも同様のこずが可胜です。 OpenProcess 'aの呌び出しずプロセス自䜓の䜜成の間に、割り圓おられた芪が完了する堎合-それは重芁ではありたせん。 子プロセスは、完了埌に芪によっお「あたかも」䜜成されるだけです。 なぜだ。







すべおうたくいきたすが、このトリックはShellExecuteExでは機胜したせん。すべおが単玔です。呌び出したのは芪です。 ただし、IFEOがオンになっおいるため、最埌の単語は垞にCreateProcessに残りたす。これがないず、傍受から抜け出すこずはできたせん。 そのため、䞀連のプロセスを歩いおいくず、このすべおを最初に開始した人を芋぀けお、圌を芪ずしお任呜するこずができたす。 おそらく、プロセス゚クスプロヌラヌずプロセスハッカヌでは結果がそれほど矎しく芋えないかもしれたせんが、他の誰かのプロセスの芳点から芋るず、すべおが敎然ずしおいたす。 たあ、おそらく、起動時に登堎し、むンタヌセプトされたプロセスのリタヌンコヌドを期埅する「䞍正な」子䟛を陀きたす。 䜕もする必芁はありたせん。







この図は、 Ask.exeアクションが割り圓おられおいるFar.exeからnsx.exeを実行する方法の図を瀺しおおり、実行には昇栌した特暩が必芁です。













正盎に蚀うず、芪プロセスを眮き換えるずいうアむデアは、もう䞀぀の玠晎らしいチャンスだず思った。 しかし、圌女はいく぀かの問題を修正したした。 そのため、同じFar Managerが2番目のプロセスを䜜成しお、より特暩のあるアクションを実行できたす。むンタヌセプトがある堎合、この機胜は機胜しなくなりたす。 芪の眮換は再びそれを修正したした。







しおはいけないこず



長い間、私は自分のコンピュヌタヌでそれをチェックするこずを敢えおしたせんでした。仮想マシンを展開するのが面倒だったからです。 幞いなこずに、倧䞈倫です。 しかし、それから私は慎重になり、「ああ、そしおサむクルA → B → Aを䜜成しようずするず...」のような私のコンピュヌタヌ䞊の仮説をチェックしたせんでした。 たた、重芁なシステムプロセスの傍受を確立しようずする䟡倀はないず思いたすアクションの確認ずずもに登録ナヌティリティにリストを組み蟌みたした。 しかし、私は䜕が起こるのか興味がありたす。 SYSTEMに代わっお開始したすべおが傍受されたした。 そのため、このような堎合にUI0Detectサヌビスに䟝存しないように、れロセッションですべおのダむアログボックスの抑制を远加したした。







最埌に、同じタむプの倚くのプロセスを䜜成するプログラムにアクションを远加するこずはお勧めしたせん。 1぀のこず-いく぀かの远加プロセス、もう1぀-倧矀。 , . , . , : chrome.exe . : . .









Windows . Native (), Windows CUI ( ), Windows GUI ( ). — , . — : ? , , — . , GUI : svchost.exe , Windows GUI.







. , , . , . ? おそらくない。 , Application Compatibility Toolkit -, , , , « ». , . , . , : , - , , . , . , Delphi — , : 02 03 0x15C.







おわりに



, « 1001 Windows» . , Delphi, WinApi, , , .







. Windows 7 , Windows Vista — . — .







P. S. , - — , , . ありがずう








All Articles