ページ 1 / 1
.net windowsフォームアプリ のウィンドウ作成をフック
Posted: 2014年6月08日(日) 23:54
by けんいち
初めて投稿させていただきます。
現在、.netで作成されたとあるアプリに関して、
このアプリがウィンドウを生成する瞬間をつかまえたいと思っています。
対象アプリは業務用アプリのためソースコードはありません。
そこでウィンドウを作成するという観点から
CreateWindowをフックしてウィンドウ生成をつかまえようと思いましたが上手くいきません。
フックの方法は
http://ruffnex.oc.to/kenji/text/api_hook/
を参考にuser32.dllのCreateWindowをフックしています。
対象アプリがコンボボックス等を作っていると思われる数箇所には引っかかるのですが、
肝心のウィンドウ本体の作成がかかりません。
もしかしてuser32.dllのCreateWindowを通らないのかとも考えたのですが、、
その場合は、どこをフックすればいいのか教えて頂きたく思います。
情報、ご教授の程、よろしくお願いいたします。
Re: .net windowsフォームアプリ のウィンドウ作成をフック
Posted: 2014年6月09日(月) 01:26
by YuO
けんいち さんが書きました:もしかしてuser32.dllのCreateWindowを通らないのかとも考えたのですが、、
その場合は、どこをフックすればいいのか教えて頂きたく思います。
.NET Framework 4.5 (≠4.5.1)のWinFormsのソースを読んでみました。
System.Windows.Forms.Form.CreateHandleは
IsMdiChildでない限りにおいて,
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.AddMessageFilterで
WM_CREATEを捕捉するフィルターを追加しておいて元のプログラムを同一AppDomain内に読み込んで最初から動かすとか,
そういう方法で対処できないでしょうか。
Re: .net windowsフォームアプリ のウィンドウ作成をフック
Posted: 2014年6月09日(月) 11:43
by けんいち
Yuoさん、貴重な情報をありがとうございます。
最終的にCreateWindowExWを通るとわかったのはとても大きいです。
いくつか情報が不足してたので追記させていただきます。
当該対象アプリケーションは実行時にウィンドウを1つ作成します。(仮称:メインウィンドウ)
その後、各業務ボタンを押すと、同一プロセス内で新たにウィンドウを表示し作業を進める感じです。(仮称:作業ウィンドウ)
業務ボタンと作業ウィンドウは1対1の関係で複数種類が存在しています。
また、作業ウィンドウは表示する毎にウィンドウハンドルが変化していることから、
ボタンを押す毎に生成→破棄を繰り返している物と推測しています。
作業ウィンドウを閉じるとWM_DESTROYが発生しているのは確認済みです。
現在フックをかけたいのは 作業ウィンドウ生成 のタイミングを狙っています。
メインウィンドウ生成はつかまえる必要がないので、メインウィンドウ生成後にHookDLLを注入しています。
これであれば、メインウィンドウが作業ウィンドウを作成する時のCreateWindowをつかまえれると考えました。
頂いた情報をもとに、CreateWindowとその周辺やタイミングを試行錯誤してみたいと思います。
何かご指摘点などございましたら教えて頂けると幸いです。
またいくつか試した後で投稿いたします。
Re: .net windowsフォームアプリ のウィンドウ作成をフック
Posted: 2014年6月27日(金) 11:47
by けんいち
ご報告が遅くなりましてすみません。
結局のところ、現在対象としているアプリケーションではcreatewindowを途中で捕まえるのは無理と判断しました。
WM_CREATEを等といろいろ試したんですが、どうにもなりませんでした。
グローバルフックでもダメだったので、どうもアプリ独自の何かしらをやっているのかもしれません。
今回はできないということで解決させて頂きます。