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

Hi%username%! それでは、ボットの作成を続けましょう。 過去の記事から、DirectX 9および11のインターセプトされた関数のアドレスを見つける方法を学び、ゲームのメインストリームで任意のアセンブラーコードを実行し、さまざまな保護方法からそれを隠し、その周りの世界に関する情報を取得しました。 つまり、ゲーム内で情報に基づいたアクションを実行できます。 そしてまず、動き回る方法を学ぶことをお勧めします!



免責事項:著者は、この記事で得た知識の使用またはそれらの使用に起因する損害について責任を負いません。 ここに記載されているすべての情報は、教育目的でのみ提供されています。 特に、ボットの処理を支援するために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の視界(カスタムファイアボール)


World of Warcraftでマウスをクリックすることで、ゲームオブジェクトとのやり取りが可能になりました。 ただし、クリックをシミュレートするのではなく、WinApiを使用して、クリックをよりクールにします。 画面上のクリックのように、ゲームによってクリックが既に処理されている場所をインターセプトし、画面座標からゲームワールドの座標に既に転送されます。 最初に、いくつかの関数のアドレスを取得します。プロセスで実際にそれらが必要になります。これは、愛されているIDAデバッガーを使用して簡単に実行できます。

public enum FunctionWow { ClntObjMgrGetActivePlayer = 0x39B615, ClntObjMgrGetActivePlayerObj = 0x4FC6, FrameScript_ExecuteBuffer = 0x4fd12, Spell_C_HandleTerrainClick = 0x38f129, FrameScript__GetLocalizedText = 0x414267, IsOutdoors = 0x414b53, UnitCanAttack = 0x41ad3c, CGUnit_C__InitializeTrackingState = 0x41fb57, CGWorldFrame__Intersect = 0x5eef7b, CGUnit_C__Interact = 0x8D01D0, } public enum ClickToMove { CTM = 0x420543, CTM_PUSH = 0xD0EEBC, CTM_X = 0xD0EF2C, CTM_Y = CTM_X+4, CTM_Z = CTM_Y+4, }
      
      





WorldClickクラスを宣言します。

 public enum ClickType { FaceTarget = 0x1, Face = 0x2, StopThrowsException = 0x3, Move = 0x4, NpcInteract = 0x5, Loot = 0x6, ObjInteract = 0x7, FaceOther = 0x8, Skin = 0x9, AttackPosition = 0xa, AttackGuid = 0xb, ConstantFace = 0xc, None = 0xd, Attack = 0x10, Idle = 0x13, } public static class WorldClick { public static void ClickTo(float x, float y, float z, ulong guid, ClickType action, float precision) { if (Mathf.Abs(x) < 0.1 && Mathf.Abs(y) < 0.1 && (Mathf.Abs(z) < 0.1 && (long)guid == 0L)) return; //  3  var positionAddress = Memory.Process.AllocateMemory(3 * sizeof(float)); //guid  ulong  8  var guidAddress = Memory.Process.AllocateMemory(sizeof(ulong)); // ,    ,   0.5f var precisionAddress = Memory.Process.AllocateMemory(sizeof(float)); if (positionAddress <= 0U || guidAddress <= 0U || precisionAddress <= 0U) return; Memory.Process.Write<ulong>(guidAddress, guid); Memory.Process.Write<float>(precisionAddress, precision); Memory.Process.Write<float>(positionAddress, x); Memory.Process.Write<float>(positionAddress + IntPtr.Size, y); Memory.Process.Write<float>(positionAddress + IntPtr.Size * 2, z); var asm = new[] { "call " + Memory.Process.GetAbsolute(FunctionWow.ClntObjMgrGetActivePlayer ), //     "test eax, eax", "je @out", //    -   "call " + Memory.Process.GetAbsolute(FunctionWow.ClntObjMgrGetActivePlayerObjAddress), "test eax, eax", "je @out", "mov edx, [" + precisionAddress + "]", "push edx", "push " + positionAddress, "push " + guidAddress, "push " + (int)action, "mov ecx, eax", // ClickToMove() "call " + Memory.Process.GetAbsolute((int)ClickToMove.CTM), "@out:", "retn" }; Memory.Hook.InjectAndExecute(asm); Memory.Process.FreeMemory(positionAddress); Memory.Process.FreeMemory(guidAddress); Memory.Process.FreeMemory(precisionAddress); } public static ClickType GetClickTypePush() { return (ClickToMoveType)Memory.Process.Read<int>((int)ClickToMove.CTM_PUSH, true); } public static Vector3 GetClickPosition() { return new Vector3( Memory.Process.Read<float>((int)ClickToMove.CTM_X, true), Memory.Process.Read<float>((int)ClickToMove.CTM_Y, true), Memory.Process.Read<float>((int)ClickToMove.CTM_Z, true)); } }
      
      





これで終わりです。Azerothの拡張を次のように実行できます。

 WorldClick.ClickTo(x,y,z, 0, ClickType.Move, 0.5f);
      
      





今日は以上です。 あなたは多くの興味深く実用的なことを学びました。 海賊版で確認できます。コードの難読化に自信がある場合は、危険を冒さないために、開始エントリを使用して公式サーバーで実行することもできます。 結局、突然Blizzardの従業員もHabrを読みました。



All Articles