2

最後に開いたウィンドウにマウスを移動する必要があります。この最後のウィンドウは、任意の Web サイトによって作成されたポップアップになります。必要なのは、最後に開いたウィンドウの位置を取得して SetMousePos を使用することだけだと思いますよね? 私は Windows API にあまり詳しくありません。どんな助けでも大歓迎です - ありがとう!

編集: 質問に答えるために、マルウェア データを取得するプログラムを作成しています。残念ながら、一部のマルウェアは、開いたポップアップにマウスが移動した後にのみ動作を開始します。その研究ベースのアプリケーション

4

2 に答える 2

0

最近開いたウィンドウを追跡する 1 つの方法は、SetWinEventHook を使用て EVENT_OBJECT_CREATE および EVENT_OBJECT_SHOW イベントをリッスンすることです。コールバックで、次をフィルタリングします。

  • idObject==OBJID_WINDOW が null 以外の HWND を持つイベントのみで、ウィンドウ作成イベントのみを取得します (リストボックス内のアイテムなどの他の作成イベントに対して)。
  • トップレベルのみのウィンドウの場合、GetAncestor(hwnd, GA_PARENT)が GetDesktopWindow() であることを確認してフィルタリングします。
  • そして、ウィンドウが実際に現在表示されていることを確認します (WS_VISIBLE スタイルが GetWindowLong(GWL_STYLE) で設定されています)。

また、特定のアプリからの HWND のみを気にする場合は、GetWindowThreadProcessId() および SetWinEventHook に渡すスレッド/プロセスを介してフィルター処理します。

これらのイベントの両方をチェックする理由は、非表示に作成されてから表示されるウィンドウもあれば、完全に表示されるように作成されるウィンドウもあれば、一度作成された後、存続期間中に何度も表示/非表示にされるウィンドウもあるためです。

次に、この「最後に作成された既知の hwnd」をグローバルにキャッシュし、必要に応じて確認し、GetWindowRect() を使用してその場所を取得し、SetCursorPos() を使用してマウスをその場所に移動します。

--

最新のポップアップが、フォーカスを取得するアクティブなウィンドウである場合 (ダイアログの場合はそうですが、通常は「ポップアンダー」ウィンドウの場合はそうではありません)、GetGUIThreadInfo(NULL, ...)を使用して、現在アクティブな HWND を特定できます。これは、探しているものである可能性があり、渡した構造体の GUITHREADINFO.hwndActive メンバーに返されます。

于 2012-06-01T07:14:47.977 に答える
0

私はこれをテストしていませんが、次のことを試すことができると思います。

  1. 実行中のプロセスを列挙し、PID で並べ替えます。
  2. PID の番号が最も大きいものが「最新」のプロセスである必要があります。
  3. 最新のプロセスについては、そのウィンドウを列挙します (GetWindowThreadProcessId を使用)
  4. この時点で、「メイン」ウィンドウと思われるウィンドウを選択する必要があると思います。たとえば、マルウェアが 2 つのウィンドウを開いた場合、どのウィンドウにフォーカスを当てるかをどのように選択するのかわかりません。
  5. 選択した HWND のデスクトップ上の位置を取得します。
  6. SetMousePos を使用して、マウスをウィンドウの位置に移動します。

これらのタスクに必要なすべての API は含まれていません。一般に、ここで見つけるのは非常に簡単です :)

于 2012-05-29T18:40:16.723 に答える