web-dev-qa-db-ja.com

fpsゲームのエイムボットはどのように機能しますか?

Counter-StrikeなどのオンラインFPSゲームでエイムボットに関する経験/知識を持っている人がいたら興味がありました。私は好奇心が強いので、カーソルがどのようにして相手のプレイヤーにロックオンするかを知りたいと思っています。明らかに、チートをしたい場合は、チートをダウンロードすることができます。何が関係していますか?カーソルを正しい場所に移動するために、ユーザーのマウス/キーボードをフックしますか?チートアプリケーションは、カーソルを正確に指す場所をどのように知るのですか?チートアプリは、ゲームアプリケーション内のデータにアクセスできる必要がありますが、どのように達成されますか?

編集:sidsの答えに、人々はどのようにして既知のメモリ位置を取得してデータを取得しますか? EDIT2:デバッグプログラムまたは他の手段を使用して、0xbbbbbbbbの場所に必要な値を見つけたとします。このメモリを所有していないので、アプリケーション内のその場所に格納されているデータにアクセスして使用するにはどうすればよいのでしょうか。または、プロセスに注入し、memcpyなどを使用してそのアドレスのメモリをコピーするだけで、アクセスできるようになりましたか?

他に追加するものはありますか?これについてできる限り多くのことを学ぼう!

66
user105033

ゲームメモリのどこかに、各プレイヤーのX、Y、およびZの位置があります。ゲームはこの情報を知る必要があるので、プレーヤーのモデルなどをレンダリングする場所を知る必要があります(ただし、表示中のプレーヤーのプレーヤー情報を送信するだけで、ゲームクライアントが知ることができる量を制限できます)。

Aimbotは、この情報について既知のメモリ位置をスキャンし、それを読み出すことで、プレイヤーと敵の2つの位置にアクセスできます。 2つの位置を(ベクトルとして)減算すると、2つの間のベクトルが得られ、そこからプレーヤーの現在のルックベクトルから目的の角度ベクトルまでの角度を計算するのは簡単です。

入力をゲームに直接送信し(これは簡単です)、いくつかの定数を使用して微調整することにより、かなり迅速に自動的に照準を合わせることができます。プロセスの最も難しい部分は、位置がメモリに格納されている場所を特定し、プレイヤーを移動させる動的なデータ構造(錐台カリングなど)を調整することです。

アドレスのランダム化が使用されている場合、これらは不可能ではありませんが、書きにくいことに注意してください。

編集:プログラムが他のプログラムのメモリにどのようにアクセスできるか疑問に思っている場合、それを行う典型的な方法は DLLインジェクション です。

編集:これはまだいくつかのヒットを取得しているので、現在より人気のあるaimbotsが動作するより多くの方法があります。すなわち、Direct3DまたはOpenGL DLL)を上書き(またはパッチ適用)し、ジオメトリを描画し、独自のジオメトリを挿入する関数呼び出しを調べ(ウォールハックなど)、またはaimbotのモデル。

70
Ron Warholic

興味深い質問-正確にはあなたの答えではありませんが、Counter-Strikeの初期の頃、人々はopengl32.dllを、壁が透けて見えるようにポリゴンを透明にレンダリングするボッチのあるものに置き換えていました。

ハッキングは改善され、より煩わしくなり、人々はより創造的になりました。現在、Valve/Steamはそれらを削除するのに良い仕事をしているようです。あなたがこのようなもので遊ぶことを計画している場合、ほんの少しの警告、Steamは「ハッキング」をスキャンし、見つかった場合、永久にあなたを禁止します

13
user110714

多くの「エイムボット」はエイムボットではなく、トリガーボットです。これらは、レチクルが実際にターゲット上に来るまで待機し、自動的に起動するバックグラウンドプロセスです。これはさまざまな方法で実現できますが、多くのゲームでは、ターゲットがターゲットを超えるたびに誰かの名前を表示したり、トリガーボットがピンポイントできるメモリ内の他のデータを表示したりすることで簡単になります。

この方法では、ターゲットでマウスを振ってプレイし、マウスをその上に置くと、実際に自分で発砲することなくショットをトリガーします。

彼らはまだメモリ内のそのような種類のものを正確に特定できなければならず、真の「エイムボット」が行うのと同じ種類の問題を抱えている必要があります。

10
Drew

過去に使用された別の方法は、ネットワークパケットのフォーマットをリバースエンジニアリングすることです。パケットストリームに対する中間者攻撃(ゲームが実行されているのと同じシステムで実行可能)は、プレーヤーの位置やその他の有用な関連情報を提供できます。偽造パケットをサーバーに送信して、ゲームに応じてプレーヤーを動かしたり、撃ったり、あらゆる種類のことをしたりできます。

9
Alan

Fleep here によるチュートリアルシリーズをご覧ください。彼の完全にコメントされたC#ソースコードは、ダウンロードできます こちら

一言で言えば:
プレーヤーのx y z座標、カーソルx y座標、およびすべての敵のx y z座標を見つけます。あなたと最近接敵との距離を計算します。自動照準を取得するために必要なx yカーソル座標を計算できるようになりました。

代わりに、死んでいる(健康が0の)敵を除外することができます。この場合、敵のヘルスアドレスを見つける必要もあります。通常、プレーヤー関連のデータはメモリ内で互いに近接しています。

繰り返しますが、ソースコードをチェックして、これらすべてがどのように機能するかを詳細に確認してください。

5
BullyWiiPlaza

編集:私はこのオフトピックを知っていますが、申し訳ありませんが、これは質問者を助けると思った。

ハッキング業界は試していませんが、私が試してきたのはソケットハイジャックです。実際よりも多く聞こえるかもしれませんが、基本的にはWinPCapドライバーを使用して、プロセスのオフセットに近づくことなく、TCP(ソケット))を介してプロセスのインターネット接続にフックします。

次に、TCPシグナルが転送される方法を学習し、それらをハッシュテーブルまたはマルチプレイヤー(パケット)クラスに保存する必要があります。その後、情報を取得して情報をオーバーレイしますウィンドウ(フックされていない)、ウィンドウ化されたゲームの画面上の透明なラベルと2Dボックスのみ。

Call of Duty 4でテストしており、TCP経由で4人のプレイヤーの場所を取得しましたが、Ron Warholicが言ったように:ゲーム開発者がゲームサーバーを作成するだけでハッキング方法のすべてが機能しない現在のユーザーがプレーヤーを見るべきときにプレーヤーを出力します。

そして、そのプレイヤーの位置の送信をX Y Zに関してカットすると、プレイヤーは格納されなくなり、ウォールハックを停止するためにそこにレンダリングされなくなります。そして、エイムボットはある意味では機能しませんが、効率的ではありません。とにかく、ウォールハックの作成を検討している場合は、プロセスにフックせずに、WinPCapを学び、インターネット信号にフックしてください。ゲームに関しては、インターネット送信のプロセスリストを検索しないでください。これを利用した例が必要な場合は、search Rustプレイヤーの位置を地図上に出力し、インターネット送信で送信されているあなたの周りの他のプレイヤーも出力するレーダーTCPそしてゲームにフックされていません。

3