フックをするなら逆アセンブル?

このQ&Aのポイント
  • フックを他アプリケーションに仕掛けるためには、そのアプリケーションの仕様を知る必要があります。
  • 仕様を知るための方法としては、自分で他プロセスにフックを仕掛けてメッセージのやりとりを調べる方法や、逆アセンブルしてプログラムのアルゴリズムを推測する方法があります。
  • ただし、どちらの方法も疲れることがあり、他にも仕様を知る方法があるかもしれません。
回答を見る
  • ベストアンサー

フックをするなら逆アセンブル?

 趣味でフックについて勉強しているのですが、フックを他アプリケーションに仕掛けようと思っても、そのアプリケーションの仕様がわかっていなければ効果的なフックを仕掛けることは無理だと思うのですが、世の中にはいろいろなアプリケーションに対して、フックを使ってその機能を強化したプログラムが多々あります。  それではどうやってそのアプリケーションの仕様を知るのでしょう。 力ない私なりに2つ考えてみました。 (1)考えた方法としては、自分で他プロセスにフックを仕掛けて、そのプロセスでどのようなメッセージのやりとりが行われているか調べる (2)逆アセンブルしてそのプログラムがどのようなアルゴリズムなのかを推測する (1)の方法は、私の力でもできないことはないとは思うのですが、自分作成したプログラムや一定のアプリケーションに対しては動作するのですが、マインスイーパに対して仕掛けても、メッセージを受け取ることができませんでした。(あれは1つ1つが小さなオーナー描画ボタンだと推測してWS_COMMANDを調べたけど、実は違うメッセージだったとか、他スレッドでメッセージ処理されてるのかな・・?) そんなこんなで、なんだかこの方法は、片っ端から細かく仕様を調べようとすると、かなり疲れそうです。 (2)の方法も、アセンブルを解読するのはかなり疲れそうですが、この方法であれば可能な気がしてならないのです。(しかし私はまだアセンブルを学習していない) (ところで、マインスイーパなどのゲームも、逆アセンブル禁止の対象なんですかね・・。) そこで質問なのですが、対象の仕様を知るためには、(1)の方法がよいのか、(2)の方法か、それとも他に方法があるのか教えてください。

  • ggaogg
  • お礼率86% (209/243)

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

(1)フックなどしなくても、例えば VC には spy++ というツールが付属しています。これでメッセージの確認ができます。 また、フックの際にはそのメッセージが Post されるのか Send なのか意識して区別する必要があります。 > (ところで、マインスイーパなどのゲームも、 > アセンブル禁止の対象なんですかね・・。) 提供元に直接確認するのが安全かと思います。

ggaogg
質問者

お礼

spy++がそんなにすごいツールだとは思っていませんでした。ただクラス名がわかるだけかと・・。 私は貧乏なので意地になって有償なものは極力使わないことにしているのですが、VC++は結構な値段でありました・・。 そこで、Spy++に換わる、無償で機能を同じくするツールはありませんか?

ggaogg
質問者

補足

探したところ、winspectorというものがありました。 http://www.windows-spy.com/ なんだかSpy++よりすごいということがいっぱい書いてあるので、これを使ってみようと思います。 ありがとうございました。

関連するQ&A

  • グローバルフックについて

    VC++6.0でグローバルフック用のDLLを作っていて、どうしてもわからないので質問させていただきます。 フックの内容は、ウィンドウが最前面にあるかどうか常に監視したいので、状態が変わるメッセージをフックしています。 フック対象はとあるゲームなんですが、テストのためにメモ帳を対象にテストをしました。 まず、spy++でウィンドウの状態を変化させたときに送られてくるメッセージを調べた結果。 WM_ACTIVATEが送られてくるので、これをフックしてみたのですが、spy++だとバックグラウンドに行った時、フォアグラウンドに行った時、最小化したとき、最小化から復帰したときにWM_ACTIVATEが送られてくるんですが、いざフックしてみると最小化するときと最小化から復帰したときにしかフックが作動しません。 spy++ではWM_SETFOCUSも送られてくるようだったので、そちらも試してみたのですが、まったく反応がありません。 逆に、spy++では検知してくれないWM_SHOWWINDOWではバックグラウンドに行った時、フォアグラウンドに行った時、最小化したとき、最小化から復帰したとき、すべてに反応してくれました。 このWM_SHOWWINDOWをフックしたときのようになれば問題無いのですが、フック対象をメモ帳からとあるゲームにしたときに、バックグラウンドに行った時と最小化したときは反応してくれたものの、フォアグラウンドに行った時と最小化から復帰したときは反応してくれません。 それと、WM_SHOWWINDOWのメッセージをフックした時のwparamの値なんですが、ネットで調べてみると 表示されようとしているとき 1 非表示されようとしているとき 0 となっているはずなのですが、自分のをみてみると常に647で固定されています。 どなたか解決策をご教授お願いします。 LRESULT CALLBACK WndProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) { return CallNextHookEx(hHook, nCode, wParam, lParam); } else if (nCode == HC_ACTION) { MSG *lmsg; lmsg = (MSG *)lParam; switch (lmsg->message){ case WM_SHOWWINDOW: MessageBox(NULL,"showwindow","info",MB_OK | MB_TOPMOST); return CallNextHookEx(hHook, nCode, wParam, lParam); break; } } return CallNextHookEx(hHook, nCode, wParam, lParam); }

  • 他のアプリケーションの起動と終了のログをとりたい。

    SetWindowsHookExを使ってWindowsメッセージをフックし、 他のアプリケーションの起動と終了のログを取ろうと思っているのですが、 使用するフックタイプと起動と終了を意味するメッセージの種類がわからずに困っております。 ついでにアプリの起動を検知した後にそのアプリのプロセスIDを取得したいのですがどのようにすればよいでしょうか? よろしくお願いします。

  • 逆ポーランド記法

    電卓もどきのアルゴリズムを教えて下さい 指定された数式を解読して、演算結果を求める処理を作成したいのですが・・・・ 今考えている手順は (1) 数式を解析して 逆ポーランド記法の中間言語にして於いておく (2) 逆ポーランド記法の中間言語を演算して答えを求める と考えているのですが・・・ << 例 >>  演算式 1+2×3=    答え 7  演算式 (1+2)×3=  答え 9 大昔の知識ですのでもっとシンプルな方法が有りましたらアドバイス頂けませんでしょうか?

  • 壁紙から両面テープ式フックを剥がす方法

    部屋の壁紙(建物の仕様書にはビニールクロスと書いてあります)に前住人が額を掛けるために、両面テープ式のフックを取り付けていましたが、今回それを取りたいと思っています。 どのような方法が確実にきれいに痕が残らず取れるでしょうか。 ネットでざっと調べてみると、剥離材は壁紙が痛むので避けたほうがよいとか、両面テープの粘着材は0~60℃で機能するのでドライアイスで冷やすかドライヤーで暖めながら剥がすとよいとあるのですが、壁紙が「ビニール」クロスとあるので暖めると剥離時の力でクロスも伸びたりしてしまうのではないかと心配があります。逆にドライアイスで冷やすのはフックが邪魔をして冷やせません。 どなたか良いアイデアor実施例を教えてください。 よろしくお願いいたします。

  • ほかのアプリケーションからのメッセージの取得

    他のアプリケーションからのメッセージの取得方法を教えて下さい。 現在マインスイーパを起動し、そのボタンが押下される順番を記憶するプログラミングを制作しています。 マウスの左クリックに関するメッセージを取得すれば良いと思い、 GetMessage(&msg, hWnd, WM_LBUTTONDOWN, WM_LBUTTONUP);←hWndはマインスイーパのウィンドウハンドル のように書いたんですが、うまくいきませんでした。 調べてみるとGetMessageの第二引数は呼び出し側のスレッドに所属していなくてはならないということで、 この辺が原因なのだろうと思うのですが…。 どなたかご教授ねがいます。 <環境>  Windows Vista Home Premium  Visual C++ Express Edition

  • 暗号化・復号化のアルゴリズムにはどんなものがありますか?

    Cでプログラミングを勉強しており、20文字ほどの文字列を暗号化・復号化するプログラムを考えていますが、ネットを検索しても暗号化アルゴリズムでなかなかいいものが見つかりません。 私のリクエストとしては ・暗号化対象は半角英数字、半角記号のみ。 ・単に文字コードを1つずつずらしたような簡単な暗号ではなく、複雑なアルゴリズムを使用したい。 ・アルゴリズムは複雑でもプログラムは簡潔にできるものがいい。(長くても数百行程度)。 ・アルゴリズム自体の仕様が公開されている。 ・アルゴリズムは数学式で表せるものがいい。 ・スーパーコンピュータを使わなければ解けないほど時間がかかる暗号化アルゴリズムでなくてもいい。 ・暗号化のライブラリファイルは使わず、自前で全部コードを書きたい。 ・公開鍵や秘密鍵を使わなくてもいい。 上記の条件を満たす暗号化アルゴリズムでいいものがありましたら、教えてください。 以上、よろしくお願いします。

  • グローバルフック(SetWindowsHookEx)でのEM_REPLACESELの取得について

    はじめまして。 グローバルフック(SetWindowsHookEx)を使って別アプリ(exe)がEDITボックスに出力している 文字列を取得しようとしています。 SPY++で確認すると別アプリではEM_REPLACESELを用いていることがわかりました。 フックするDLLを以下のように作成しメッセージをフックすることはできました。 1. フックのセット   SetWindowsHookEx(WH_CALLWNDPROC, MyHookProc, hInst, dwThreadId);      // hInst はDllMainでアタッチ時に保存したもの      // dwThreadIdは別アプリのスレッドID(以下の方法で取得)      // HWND pWnd = ::FindWindow(NULL, 別アプリのフォームのキャプション) ;      // HWND pEdt = ::FindWindowEx(pWnd,0,"Edit",0);      // DWORD dwThreadId= ::GetWindowThreadProcessId(pEdt, NULL); 2. コールバック   LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)   {    if( EM_REPLACESELの判定 ){      メッセージの保存処理     }     return CallNextHookEx(hMyHook, nCode, wp, lp);   } 上記のコールバックの中で”EM_REPLACESELの判定”をどのようにしたら良いかわからずに困っています。 if分をはずしてファイルにダンプすると何かメッセージが取得できているのは確認できています。 他のサイトを見て、 MSG* pMSG = (MSG*)lp; として、pMSG->lParam を参照してもEM_REPLACESELになっているメッセージがありませんでした。 何か思いつくことがある方、根本的な間違いがあるという方、 アドバイアスをお願いします。

  • プロセス終了の検知について

    Win2000、VB.net、.NET Framework 1.1 でWindowsアプリケーションを作成しています。 画面が表示されていない状態で、ある処理を行っている時に タスクマネージャからプロセスを終了させられたことを検知する イベントを教えてください。 Mainで Application.ApplicationExit, Application.ThreadExit のイベントをAddHandlerで関連付けているのですが タスクマネージャからプロセスを終了しても 関連付けたプロシージャの処理が行われません。 タスクマネージャからプロセスを終了した場合は そのプロセスにメッセージは送られないのでしょうか? また、ある条件になると画面を表示する仕様なのですが 画面を表示中にタスクマネージャからプロセスを終了しても Form_Closingイベントが発生しません。 そういうものなのですか? よろしくお願いいたします。

  • コンソールアプリケーションの終了方法

    コンソールアプリケーションをC言語(Visual-C++6.0)にて開発予定です。このアプリケーションは画面を使わないのでコンソールアプリケーションにする予定です。このプログラムは常駐プロセスにし、コマンドで起動停止を行うようにする予定です。プログラムの起動はバッチファイルを作成し、そこから実行しようと考えていますが、プログラムを停止させるバッチファイルのイメージがわきません。unixの場合は、当該プロセスにSIGTERMを送信する等の方法が考えられるのですが、windowsで常駐のコンソールアプリケーションを停止させるには、どのような方法があるのでしょうか。ご存じの方ありましたら、教えてください。停止させる方法は、外部から常駐プロセスに停止である旨の何らかの事象を送り、それを常駐プロセスがキャッチし、自ら停止することを想定しています。(有無をいわさず殺すことは考えていません) 実行環境:windows2003を想定 開発言語:VC++6.0でC言語

  • コピー防止のためレジストリを編集

    自分で作成したプログラムを無断でコピーされない方法を探していたら(No.287729 質問:無断コピーを避けるには )という質問がありこの中に「レジストリの中にパスワードを格納してコピーを防止する」という回答がありました。 それでレジストリ関係の書籍3冊ほど読んでみましたが、ほとんどがウィンドウズの細かい設定をかえるものでした。 コピー防止のためのテクニックが載っている書籍やサイトその他なんでもご存知でしたら回答おねがいします。 あとプログラムを逆コンパイル(または逆アセンブル)されるとコピー防止は意味をなさないのでしょうか。 回答よろしく御願いします

専門家に質問してみよう