.net windowsフォームアプリ のウィンドウ作成をフック

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
けんいち

.net windowsフォームアプリ のウィンドウ作成をフック

#1

投稿記事 by けんいち » 10年前

初めて投稿させていただきます。

現在、.netで作成されたとあるアプリに関して、
このアプリがウィンドウを生成する瞬間をつかまえたいと思っています。
対象アプリは業務用アプリのためソースコードはありません。

そこでウィンドウを作成するという観点から
CreateWindowをフックしてウィンドウ生成をつかまえようと思いましたが上手くいきません。
フックの方法は
http://ruffnex.oc.to/kenji/text/api_hook/
を参考にuser32.dllのCreateWindowをフックしています。

対象アプリがコンボボックス等を作っていると思われる数箇所には引っかかるのですが、
肝心のウィンドウ本体の作成がかかりません。

もしかしてuser32.dllのCreateWindowを通らないのかとも考えたのですが、、
その場合は、どこをフックすればいいのか教えて頂きたく思います。

情報、ご教授の程、よろしくお願いいたします。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: .net windowsフォームアプリ のウィンドウ作成をフック

#2

投稿記事 by YuO » 10年前

けんいち さんが書きました:もしかしてuser32.dllのCreateWindowを通らないのかとも考えたのですが、、
その場合は、どこをフックすればいいのか教えて頂きたく思います。
.NET Framework 4.5 (≠4.5.1)のWinFormsのソースを読んでみました。 System.Windows.Forms.Form.CreateHandleIsMdiChildでない限りにおいて,System.Windows.Forms.Control.CreateHandleを呼び出してウィンドウを作成しています。
そして,Control.CreateHandleは,CreateParamsプロパティの値を引数に,System.Windows.Forms.Control.ControlNativeWindowクラスのCreateHandleメソッド,正確にはSystem.Windows.Forms.NativeWindowクラスCreateHandleメソッドを呼び出します。
そして,NativeWindow.CreateHandle内を追っていくと,最終的にUnsafeNativeMethods.CreateWindowExを呼び出すことでウィンドウを作成しています。

さて,UnsafeNativeMethods.CreateWindowExは,

コード:

        [DllImport(ExternDll.User32, EntryPoint="CreateWindowEx", CharSet=CharSet.Auto, SetLastError=true)] 
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr IntCreateWindowEx(int  dwExStyle, string lpszClassName, 
                                                   string lpszWindowName, int style, int x, int y, int width, int height,
                                                   HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, [MarshalAs(UnmanagedType.AsAny)] object pvParam);
なので,普通にCreateWindowExWを使っているはずです。


API Hookはやったことがないですが,Hookのタイミングの問題,ということはないでしょうか。
起動用のアセンブリを作って,フックかけた後にAppDomainを作ってそちらで目的のプログラムを実行するとか,
そもそもフックせずに,同じく起動用アセンブリ内でApplication.AddMessageFilterWM_CREATEを捕捉するフィルターを追加しておいて元のプログラムを同一AppDomain内に読み込んで最初から動かすとか,
そういう方法で対処できないでしょうか。

けんいち

Re: .net windowsフォームアプリ のウィンドウ作成をフック

#3

投稿記事 by けんいち » 10年前

Yuoさん、貴重な情報をありがとうございます。
最終的にCreateWindowExWを通るとわかったのはとても大きいです。

いくつか情報が不足してたので追記させていただきます。

当該対象アプリケーションは実行時にウィンドウを1つ作成します。(仮称:メインウィンドウ)
その後、各業務ボタンを押すと、同一プロセス内で新たにウィンドウを表示し作業を進める感じです。(仮称:作業ウィンドウ)
業務ボタンと作業ウィンドウは1対1の関係で複数種類が存在しています。
また、作業ウィンドウは表示する毎にウィンドウハンドルが変化していることから、
ボタンを押す毎に生成→破棄を繰り返している物と推測しています。
作業ウィンドウを閉じるとWM_DESTROYが発生しているのは確認済みです。

現在フックをかけたいのは 作業ウィンドウ生成 のタイミングを狙っています。
メインウィンドウ生成はつかまえる必要がないので、メインウィンドウ生成後にHookDLLを注入しています。
これであれば、メインウィンドウが作業ウィンドウを作成する時のCreateWindowをつかまえれると考えました。

頂いた情報をもとに、CreateWindowとその周辺やタイミングを試行錯誤してみたいと思います。
何かご指摘点などございましたら教えて頂けると幸いです。

またいくつか試した後で投稿いたします。

けんいち

Re: .net windowsフォームアプリ のウィンドウ作成をフック

#4

投稿記事 by けんいち » 9年前

ご報告が遅くなりましてすみません。

結局のところ、現在対象としているアプリケーションではcreatewindowを途中で捕まえるのは無理と判断しました。
WM_CREATEを等といろいろ試したんですが、どうにもなりませんでした。
グローバルフックでもダメだったので、どうもアプリ独自の何かしらをやっているのかもしれません。

今回はできないということで解決させて頂きます。

閉鎖

“C言語何でも質問掲示板” へ戻る