アセンブラとdraeneiを使用してMMORPGのボットを作成しています。 パート4.5

Hi%username%! 何が何で、どのように機能するのかを理解するために、すべての「and」にドットを付けるために少し停止しましょう。 最近、World of Warcraftのさまざまなバージョンのオフセットに関連する多くの質問、ゲームプレイへのサードパーティの指示の挿入を実装する方法に関する多くの提案がありました。 質問や提案がある場合は、カットしてください。

免責事項:著者は、この記事で得た知識の使用またはそれらの使用に起因する損害について責任を負いません。 ここに記載されているすべての情報は、教育目的でのみ提供されています。 特に、ボットの処理を支援するためにMMORPGを開発している企業にとって。 そして、もちろん、この記事の著者はボットドライバーではなく、詐欺師でもありません。








内容


  1. パート0-コードインジェクションポイントを見つける
  2. パート1-サードパーティコードの実装と実行
  3. パート2-pr索好きな目からコードを隠す
  4. パート3-World of Warcraft 5.4.xの視界(構造)
  5. パート4-World of Warcraft 5.4.xの視界(移動)
  6. パート5-World of Warcraft 5.4.xの視界(カスタムファイアボール)


1.質問と回答

最もよく寄せられる質問は、「アセンブラーを使用する理由」です。 アセンブラという言葉を持っている人はパニック発作を始め、耳を傾け、脳をオフにするという感覚が得られます。 そんなに恐れる必要はありません、彼はそれほど怖くありません。 結局のところ、プログラム自体に独自の機能を実行し、結果を知っているポインターに置くように依頼するよりも簡単なことはありますか? 車輪を再発明する必要はありません、私は持っているものを使います。 アセンブラーでDoAnythingFunctionPointerポインターを使用してDoAnythingFunction内部関数を呼び出すことがいかに簡単かをご覧ください

"call " + GetAnyGameObjectFunctionPointer, "push " + argument3Pointer, "push " + argument2Pointer, "push " + argument1Pointer, "push " + argument0Pointer, "mov ecx, eax", "call " + DoAnythingFunctionPointer, "retn"
      
      





GetAnyGameObjectFunctionPointer-任意のオブジェクトを返します。オブジェクトへのポインターはeaxに配置されます

argument [N] Pointer- DoAnythingFunctionの N番目の引数へのポインター



次に、DLLインジェクションに関する質問があります。 battle.netサーバーでは、これは潜在的に危険な方法です。 あなたのDLLは研究のためにセキュリティ部門に行くかもしれません。 結局のところ、これは、独自のDLLを実装するための不正行為とボトリングの両方で最も一般的なアプローチです。 また、このアプローチの人気は、捕まる確率に正比例することを忘れないでください。



次の質問は「なぜ++ではないのですか?」です。 これは好みの問題です。 C ++でより速く、より速くできる場合は、それを行いますが、現時点では、アプローチに対する非建設的な批判は別として、何も見ていません。 単一のc ++実装例ではありません。 誰もができて誰もできないときは奇妙です。



もう1つの興味深い質問は、「なぜx64ではないのですか?」です。 win7 x86で4台の仮想マシンを起動し、それぞれでボットを実行し、ホストマシンからリソースを消費すると、それらはwin7 x64より少なくなります。 まあ、一般的に、それはボットがどのプラットフォームで実行されているのか、彼にとっても無関心です。 この質問は、自分でプレイするときにチートを書くときに関連します。



他のすべての質問に対する答えは次のとおりです。「battle.netサーバーでの過去4年間、禁止または警告を受けたことはありません」



コードと投稿のエラーについて。 はい、私はあなたと同じようにタイプミスとエラーがあります。あなたがそれらに気づいた場合、パレードの赤い正方形の旗のように振ってはいけません、私に個人的なメッセージを書いてください。私はそれを修正します。 これは、あなたの注意力と知識だけでなく、礼儀正しく繁殖することを示します。 食事中、あごひげや食べ物自体にソースが付いているようです。 概念的にどれだけ掛かっているかを議論するために、これはテーブルで正しいと思いますか?



2.オフセット検索

オフセット検索の場合は、マスク検索を使用します。 当然、関数へのポインターを見つける最良の方法はデバッグであり、それだけが、必要なものを正確に見つけたことを100%保証します。 しかし、このプロセスは非常に面倒で長くなる可能性があります。また、5つの記事の初心者がデバッグ、ブレークポイント、逆アセンブラーについて説明する方法はほとんどないことがわかります。 したがって、記事ではマスク検索を使用します。 例を見てみましょう。 開始するには、2つの異なるWow.exeファイルと1つのメジャーバージョンをダウンロードします(5.4.7 17898とWowCircle-32.exeクライアント5.4.7 18019を使用しました)。 私たちのタスクは、 Morferのオフセットを見つけることですが、17898のオフセットは既知です。

 CGUnit_C__UpdateDisplayInfo = 0x42E3A8, CGUnit_C__OnMountDisplayChanged = 0x42E193, CGUnit_C__UpdateScale = 0x424AE3,
      
      





IDAでWow.17898.exeを開き、ロードされるまで待ち、一番上までスクロールし、 Imagebase = 400000を見て、この値を覚えておいてください。



次に、Gを押してアドレスCGUnit_C__UpdateDisplayInfo + Imagebase = 0x82E3A8に移動します



Alt + 3を押してHex-Viewで開きます。最初の15バイトをコピーします。これらは関数の最初の8つの命令で、コンパイル中に変更されません。 jxx xxxx、プッシュオフセットxxxx、呼び出しxxxx、xxx dword_xxxxなどのコマンドは避けてください。



結局、調査中のファイルに対して既に新しいIDAインスタンスを開始し、Alt + Bを押して、コピーしたバイトシーケンスを入力し、Ctrl + Bを探します。何か見つかった場合は、元のファイルと比較する必要があります。



ご覧のとおり、これらの関数は、それらへのポインターを除いて同一です。 正確にするために、Ctrl + Bをもう一度押します。何も出力されない場合は、オフセットが見つかります。 コンパイル中に関数の最初の15〜20バイトが変更されると、すべてがはるかに複雑になる可能性があります。 この場合、マークとトランジションを含まない静的なピースを探すか、検索テンプレートのいくつかのバイトを質問に置き換える必要があります。 IDA検索ヘルプからの抜粋を次に示します。

CD 21-バイト0xCD、0x21

21CD-バイト0xCD、0x21(順序はエンディアンによって異なります)

「Hello」、0-nullで終了する文字列「Hello」

L「こんにちは」-「H」、0、「e」、0、「l」、0、「l」、0、「o」、0

B8 ???? 90-バイト0xB8、任意の値を含む4バイト、バイト0x90



たとえば、CGUnit_C__UpdateScaleを検索するには、最初の15バイトではなく、21から35バイトを使用します。 不要な指示はありません。 これらの目的でMakeSig IDAプラグインを使用することもできます。



PSデバッグによって関数アドレスを探す方法に関する記事を書きたいと思う人がいれば、感謝します

プライベートメッセージのPPSエラーとタイプミス



All Articles