マイクラでフライハックを作ろう

#はじめに
####チートを作ると友達が消えます。気をつけましょう
[ここ](https://qiita.com/360tetsu360/items/ac5caab7d407ba8d8485)のコードをもとに書いていきます。
マインクラフトは統合版(Windows版)1.17.11です。
#アドレスを見つけよう
クリエイティブのワールドを作りましょう。
そしたらcheat engineを起動します。
基本的なcheat engineの使い方は[ここ](https://qiita.com/360tetsu360/items/0f93e097f0cf58836e57)で見てください。
このように配置するのがおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626228/0976da9e-b7a1-3682-2ce3-35132b7a52c0.png)
cheat engineの左上でうるさく光っているボタンを押して、Minecraft.Windows.exeを探し出して選択し、Openを押しましょう。
そしたら設定をこのようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626228/a92a16d6-2adc-c5e1-2a52-25a65ebeedf1.png)
2byteにしている理由は飛んでいるか飛んでいないかはboolとして扱われているので、1byteなのですが、1byteでスキャンをすると結構時間かかるので、とりあえず2byteにしましょう。どうしても気に食わないという人は1byteでどうぞ。

Unknown initial valueというのは今はまだ値がわからないので、適当にスキャンしてねということです。
Exact Valueで直接値を入れてもいいのですが、これもスキャンに時間がかかるという謎バグ(?)があるのであえて値は設定しないことにします。

Pause the game while scanningにチェックを入れている理由はスキャンを早くするためです。
###スキャンをしよう
マイクラ内で飛んでいないことを確認して、First Scanを押してください。左上のFound:のところの数が変わっていると思います。このFound:の数をスキャンすることによってどんどん減らしていきます。

それではマイクラ内で飛んでください。飛べたら設定をこのようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626228/c5462ebc-f1a4-e408-3647-f78d00a1d4f3.png)
そして、Next Scanを押しましょう。Foundの数はだいぶ減っていると思います。

そしたら、マイクラ内で飛行状態を解除してください。それで設定をValueを0に変えてもう一度スキャンしてください。
これを何回も繰り返します。

何回か繰り返して、Foundが10以下になったらオッケーです。
左上のリストにを全部選択して、赤い矢印を押しましょう。下に移されたと思います。
下にあるアドレスたちの左のチェックボックスおして、値を固定してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626228/ea31f454-c322-b1fb-18b6-e6a5831504f6.png)
すべての値が0に固定されている状態で、マイクラで飛べるか試してみましょう。
もし飛べたら、最初からやり直しましょう。何かミスっています。
もし飛べなくなっていたら、うまくいっています。続けましょう。

飛べなくなったのを確認できたら、すべてのチェックボックスの×を外してください。
そして、上から順に一個ずつ×を押す→マイクラ内で飛べるか確認する→×を外すという作業をして、どれが本物のアドレスかを探り出しましょう。
#ポインタースキャンをしよう
見つけたアドレスを、右クリックしてPointer scan for this addressを押して、てきとうに保存場所を決めてファイル名を決めたらスキャンしましょう。
ポインタースキャンで出てきたウィンドウは消さないようにしましょう。
一回のポインタースキャンだけでは意味がないので、cheat engineを起動したままでマイクラを再起動してもう一度アドレスを探してください。
見つけたアドレスのAddressというところをダブルクリックしてコピーしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626228/7383f161-6d2d-aa66-57bf-162a9663a6ed.png)
ポインタースキャンをしたウィンドウに戻って、Pointer scanner→Rescan memoryを押して出てきたウィンドウにコピーしたアドレスを張り付けて、OKを押して上書きしましょう。
この一連の作業を三回くらい行います。
そうするとポインターがより確実になっていきます。
#コードを書こう
ポインタースキャンの結果を一個選びましょう。どれでもいいです。
そして、[ここ](https://qiita.com/360tetsu360/items/ac5caab7d407ba8d8485)にあるコードを少し変えていきます。
main()の中を

```c++
int main()
{
    DWORD procId = GetProcId(L"Minecraft.Windows.exe");//実行中のMinecraft.Windows.exeのプロセスID
    uintptr_t BaseAddress = GetModuleBaseAddress(procId, L"Minecraft.Windows.exe");//ベースアドレスの取得
    if (BaseAddress != NULL) {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procId);//プロセスハンドル取得

        uintptr_t flydirectadd = 0x040A4978;                            //ポインタースキャンの結果
        vector<unsigned int> flyoffset = { 0x10,0x1F0,0x0,0x130,0x9c0 };
        while (true)
        {
            if (GetAsyncKeyState(70))
            {
                uintptr_t flyAddress = FindDMAAddy(hProcess, BaseAddress + flydirectadd, flyoffset); //アドレスを割り出す
                unsigned short isFlying = 1;
                WriteProcessMemory(hProcess, (BYTE*)flyAddress, &isFlying, 2, nullptr);              //メモリに書き込む
                Sleep(100);
            }
        }
    }
    return 0;
}
```

こういう風にしましょう。
これでFを押すとどこでも飛べるというチートができました。