GUI からの入力を行わずに処理を実行するには?

解決


Wr25  2006-10-24 11:04:08  No: 63410  IP: 192.*.*.*

何かを設定する為のダイアログボックスのボタンをクリックしたら、プロパティシートとかが起動しますよね?それを、ボタンをクリックせずに他のプロセス等から起動させることはできるでしょうか?そのプロパティシートを起動するコードをどうにかして外部から実行させたいのです。
ゲームなどで、例えば「逃げる」コマンドを選択すれば逃げてくれるのですが、その処理を外部プロセスから実行させたいと思っています。WriteProcessMemory() などで該当するメモリを書き換えれば良いのでしょうか? その辺りが分かる方、何かアドバイスを下さい。

環境: VC++ 6.0 OS: WindowsXP

編集 削除
YuO  2006-10-24 12:32:41  No: 63411  IP: 192.*.*.*

ボタンのクリックであれば,相手のウィンドウに対してメッセージを送るとできる「かも」しれません。
というのは,そのボタンがWindowsのボタンコントロールかどうか判別できないからです。
# WPFのボタンコントロールはWindowsのボタンコントロールではないです。

結論としては,汎用の方法は存在せず,それぞれのソフトの動作を解析して,それぞれのソフト用に作るしかないです。

編集 削除
Wr25  2006-10-24 15:18:01  No: 63412  IP: 192.*.*.*

>>YUO さん
なるほど…。デバッガで当たりを付けて追いかけて、該当する処理のコードを探して対処するしかないという事ですね?では、その対処の仕方は分かりますか?例えば、そのコードの部分のメモリアドレスの範囲のデータを引数に渡して実行させる API とかがあるとか。突っ込んだ質問で済みません。

編集 削除
PATIO  2006-10-24 15:35:53  No: 63413  IP: 192.*.*.*

名指しで質問されている所、申し訳ないですが、
基本的にWriteProcessMemory等で外部からメモリ状態を書き換えて
コントロールするような乱暴な事はすべきではありません。
制御対象のコード内容を完全に把握していたとしてもちょっとしたミスで
制御対象をクラッシュさせてしまいかねませんから普通こういった方法を
とる事はしません。

Youさんが言われているそのソフト毎で変わると言われているのは、
ボタンコントロールであれば、ボタンコントロールに対して制御できるけれど、
そうでなければ、別の制御方法をとる必要があると言う話をしているだけです。

基本的に外部から対象ソフトを思いのままに操るようなAPIは存在しません。
ボタンが押されたかのようにウインドウメッセージを送りつけて制御するとか
キーイベントを送りつけてコントロールするのが一般的です。
外部からのコントロールを前提に作成されているソフトであれば、
そのためのインターフェイスを公開している場合があります。
この場合は、そのインターフェイスを使用して比較的安全に制御する事が
できます。

編集 削除
Wr25  2006-10-24 17:07:48  No: 63414  IP: 192.*.*.*

>>PATIO さん
やはり、外部からキーイベント等のメッセージを送ってコントロールするしか方法は無いのですかね…。

FPS の 3D ゲーム等では、前に進む為には、その処理を行うインターフェースのキーが用意されていますよね?仮に W キーだったとして、W キーを押せば前に進む為の処理がそのプログラムで実行されます(他のキーでも同様にそれぞれの処理が実行される)。その処理を、外部プログラムから行いたいのです。その外部プログラムから、このプログラムに W キーを押下するキーイベント(SendInput や keybd_event)を送れば、同じように前に進む処理が実行されます。今作ろうとしているのは、自動で敵を倒してくれるように操作してくれるようなソフトなんですが、キーイベントを送って前に進ませるのではなく、前に進む部分に該当するコードをどうにかして外部から実行させるという事は可能でしょうか?それとも、ReadProcessMemory 等の API とキーイベントの送りつけによる組み合わせで自動操作を実現する以外方法はないのでしょうか?どなたか手がかりでも良いので、意見を下さい。

編集 削除
YuO  2006-10-24 17:26:39  No: 63415  IP: 192.*.*.*

> FPS の 3D ゲーム等では、前に進む為には、その処理を行うインターフェースのキーが用意されていますよね

PATIOさんの書かれている「インターフェース」の意味を取り違えていますよ。
PATIOさんの書かれている「インターフェース」とは,そのプログラムを他のプログラムが操作するために用意された機構のことです。
COMだったり,ソケットだったりします。

そのためのインターフェースが存在しないプログラムを操作しようとする場合は,うまく動けばラッキー程度に考えるべきです。


> 前に進む部分に該当するコードをどうにかして外部から実行させるという事は可能でしょうか

できるならばそれは非常に大きな脆弱性として取り扱われることでしょう。

編集 削除
Wr25  2006-10-24 18:11:24  No: 63416  IP: 192.*.*.*

>YuO さん
貴重なご意見を有難う御座います。 なるほど、そういうことでしたか。 どうやら、根幹的な仕組みが理解できていなかったようですね。 その用意されたインターフェースを利用する必要があるのですね。

PATIO さんと YuO さん、本当に有難う御座いました。

編集 削除
PATIO  2006-10-26 14:52:06  No: 63417  IP: 192.*.*.*

もう見ていないかもしれませんが、一応補足しておきます。

きちんとコントロールできる事を保障するような場合、
コントロールされる側に外部に公開されたインターフェイスが用意されている
事が必要です。なので、コントロールされる側に公開されたインターフェイスが存在しない場合、事実上、そのソフトを外部からコントロールできる事を保障す
る事は出来ません。ここで言うインターフェイスと言うのは、YuOさんが言われて
いるようにCOMのようなものであったり、特定のポートでソケットに対してコマン
ドを書き込むというような手段であったりしますが、
一般的なアプリケーションの殆どはこういったインターフェイスを公開していないと思います。連携して動く事を前提にしたソフトであれば、インターフェイスを公開するという事もあるでしょうが、ゲームなら多分そんな事はしていないでしょう。
そもそも外部からコントロールして自動で敵を倒すようなソフトはオンライン
ゲームの世界ではボット等々と呼ばれて、使用を禁止されている事が殆どです。

自分が作ったわけでもないアプリを外部から自在にコントロールする方法は、
基本的にはありません。コントロールできるとしたらコントロールされる側が
コントロールされる事を前提にして作成したコントロール用のインターフェイスを使った場合だけです。
キー入力をエミュレートすれば、ある程度までなら可能ですけれどそれ以上は無理と考えるべきでしょう。

編集 削除