こんにちは、Platform SDK (Windows SDK) サポート チームです。
今回は、Windows 10 バージョン 1903 でリモート アシスタンス (msra.exe) を実行した場合に、「msra.exe - 正しくないイメージ」というメッセージが表示され、操作できなくなる問題についてご紹介します。
回避策も記載しましたので、同様の現象が起きている方は参考にしていただければと思います。
[現象]
Windows 10 バージョン 1903でリモート アシスタンス (msra.exe) を実行した場合に、以下のエラー メッセージが表示される場合があります。 (エラー メッセージ内の D:\sample\SampleHookDLL64.dll は環境により異なります)

このエラー メッセージは、[OK] ボタンをクリックしてクローズしても再度表示されるため、リモート アシスタンスの操作ができなくなります。
また同時にイベント ログのシステムに、このエラー メッセージと同様のイベントが記録されます。
[原因]
この現象は、SetWindowHookEx 関数によりフック処理を実行しているアプリケーションが動作している環境で発生する可能性があります。
このようなアプリケーションの例として、ユーザー操作を記録するようなアプリケーションやユーザー操作を補助するアプリケーションがあります。
Windows 10 バージョン 1903 では、セキュリティ強化のために msra.exeに対するこういったフック処理を禁止し、フック処理が行われるタイミングでエラー メッセージを表示してユーザーに通知しています。
しかし、SetWindowHookEx 関数によるフック処理は連続実行され、ユーザーがエラー メッセージを閉じたあともフック処理が継続的に実行されるため、エラー メッセージが表示し続けることになります。この連続表示する動作は、フック処理の構造上抑止することができません。
なお、msra.exeはリモート アシスタンスを実行するためのプロセスであるため、他のユーザーの PC を操作したり、情報を読み取ったりすることができます。
このような msra.exeの機能の特性上、マルウェア対策としてマイクロソフト製以外の DLL のロードを禁止するような実装に変更されていることをご理解ください。
[対処策]
・フック処理を実行するアプリケーションでの対処策
この現象は、SetWindowsHookEx 関数の第 4 引数に 0 を指定し、すべてのプロセスをフック対象とするようなフック アプリケーションを実行した場合に発生する可能性があります。
そのため、フック対象のプロセス名を判別し、msra.exe 以外のプロセスに対してのみ SetWindowHookEx 関数を呼び出すような実装により対処することができます。
その際、第 4 パラメータは 0 でなく、対象プロセス内の各スレッド ID を指定します。
・実行環境での対処策
暫定的な対処策とはなりますが、以下のレジストリ設定により、エラー メッセージの表示と、イベント ログの記録を抑止することができます。
ただし、フック処理が継続的に実行されることは抑止できないため、その影響によって msra.exe の操作パフォーマンスが低下する場合があります。
また、本当にマルウェアが動作していた場合にユーザーが問題を把握することができなくなるため、セキュリティの観点では推奨できない方法であることにご注意ください。
1. エラー メッセージの表示を抑止するレジストリ
下記レジストリ値を設定することで、エラー メッセージの表示を抑止することが可能です。
キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
名前 : ErrorMode
値 : 2
2. イベント ログの記録を抑止するレジストリ
下記レジストリ値を設定することで、イベント ログの記録を抑止することが可能です。
キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger\EventLog-System\{47bfa2b7-bd54-4fac-b70b-29021084ca8f}
名前: Enabled
値: 0
<2019
年9
月17
日(火)更新>
パスの誤りを修正しました。 (d:\samples\SmpleHookDll64.dll -> D:\sample\SampleHookDLL64.dll)