[Hack] Botbaseで自動操作をしよう!

Nintendo Switch

Botbaseとは

ニンテンドースイッチの入力をUSBまたはWi-Fi経由でおこなうモジュールのこと。

SYS

olliz0r/sys-botbase
Contribute to olliz0r/sys-botbase development by creating an account on GitHub.

Wi-FiとUSBのどちらにも対応しているはずだが、Wi-Fi経由でのチェックしかできていません。

Wi-FiはローカルIPを指定する必要があるのだが、改造機だとLanPlayでしか遊べないのでそのままでは接続できない。なので、こっちのモードは実用的なのかそうなのかよくわからない。

USB

fishguy6564/USB-Botbase
Sys-botbase by olliz0r with usb support. . Contribute to fishguy6564/USB-Botbase development by creating an account on GitHub.

LanPlayでの脱法バイト(サーモンラン)をするために必要だったのがこのUSBで接続できるUSB-Botbaseでした。

Botbaseの仕組み

よくわかっていないのですが、こんな感じなんじゃないかと思います。

Botbaseの仕組み

基本的にはPythonからキー入力を送信するのですが、それとは別にメモリ内容も読み出せるようです。

具体的にはSwitchから送られてきたデータがLastReceive.ek8というバイナリファイルに書き込まれ、そこに入っているデータを読み込んでPython側で条件分岐ができるようなのです。

つまり、アドレスさえわかっていれば例えばポケモンでマジカル交換のポケモンの種類をPythonが判別し「欲しいポケモンだったら交換を続行する」といったような処理が可能になるのです。

が、これにはRAMの状態を把握しておく必要があるのでハードルとしては高めと言えるでしょう。というより、自分がRAMについての理解が全く足りていないのでこれを利用して今すぐなにかのコードを書くということができませんでした。

なので今回は、単純なキー入力にだけ焦点を合わせて解説しようと思います。

Pythonコード

USB-BotbaseはPython3とPyusbが必要になります。

sudo apt install python3 python3-pip
pip install pyusb

注意点としてはWSL2がUSB接続をサポートしていない?のか、Windowsでコードを実行しないとニンテンドースイッチと接続できません。

あと、libusbKドライバのインストールが必要なのでZadigでインストールしておきましょう。

更に補足するとSysDVRなどの別のUSBドライバを使うモジュールが入っていると上手く動作しません(ここで結構詰まった)

以下、とりあえず動くPythonコードです。

import binascii
import struct
import time
import usb.core
import usb.util

global_dev = None
global_out = None
global_in = None

#Sends string commands to the switch
#Uncomment return if using echoCommands
def sendCommand(content):
    global_out.write(struct.pack("<I", (len(content)+2)))
    global_out.write(content)


#Using method from Goldleaf
def connect_switch():
    global global_dev
    global global_out
    global global_in
    global_dev = usb.core.find(idVendor=0x057E, idProduct=0x3000)
    if global_dev is not None:
        try:
            global_dev.set_configuration()
            intf = global_dev.get_active_configuration()[(0,0)]
            global_out = usb.util.find_descriptor(intf,custom_match=lambda e:usb.util.endpoint_direction(e.bEndpointAddress)==usb.util.ENDPOINT_OUT)
            global_in = usb.util.find_descriptor(intf,custom_match=lambda e:usb.util.endpoint_direction(e.bEndpointAddress)==usb.util.ENDPOINT_IN)
            return True
        except:
            return False
            pass
    else:
        return False

#To communicate with the user
def attemptConnection():
    isConnected = False
    while not isConnected:
        if connect_switch():
            print("Connected to Switch Successfully!")
            isConnected = True
        else:
            print("Failed to Connect to Switch!")
            print("Attempting to Reconnect in 5 Seconds...")
            time.sleep(5)


def main():
    attemptConnection()   
    print("Welcome to Botbase!")
    sendCommand(content)

main()

def main()がどんどん実行されるので、print()以下に

コマンド一覧

コマンド意味
clickクリック
pressホールド
releaseリリース
setStickStateスティック入力

クリックは押してすぐ離すような入力で、一般的にはこれを使うことが多いです。ホールドは押し続けるコマンドで、同時に二つのキーを入力する必要があるときはこれを使います。例えば、スプラトゥーンで広場にいくにはZRとZLを同時押しする必要がありますが、

sendCommand("click ZR")
sendCommand("click ZL")

と書いても、これでは「ZRを押して離す、ZLを押して離す」という動作になるので、想定した動作をしてくれません。

sendCommand("press ZR")
sendCommand("press ZL")
time.sleep(1)
sendCommand("release ZR")
sendCommand("release ZL")

こう書くことでZRとZLの同時押しを一秒間続けるという意味になり、広場に入ることができます。

ホールドしたあとはリリースするのを忘れないように!

コマンド意味
A, B, X, Y各ボタン
ZR, ZL, R, L各ボタン
DUP, DDOWN, DRIGHT, DLEFT十字キー
RSTICK, LSTICK左右スティック
PLUS, MINUS+, -ボタン
HOMEホームボタン
CAPTUREキャプチャーボタン

RSTICKやLSTICKでキャラクターを操作するのはどうするんだ?ってことになるんですが、setStickStateというコマンドで対応できると思います。

Botbaseの注意点

Sys-Botbaseでは気にならなかったのですが、USB-Botbaseは大量にメモリを消費するため、別モジュールが起動しているとメモリ不足でatmosphereがパニックモードになって再起動を繰り返してしまいます。

特にSysDVRやSys-Ftpd-lightとの相性が致命的に悪く、これらが起動している状態だとそもそもゲームが起動しなかったりします。なのでモジュールについては可能な限り無効化しておいたほうが良いでしょう。

無効化自体はKosmosを使っているのであればKosmos Toolboxから簡単に切り替えられます。

おまけ

wwwwwwzx/NXController
Use keyboard to play Switch games. Contribute to wwwwwwzx/NXController development by creating an account on GitHub.

このWindows向けツールを使えばPythonではなく直接キーボード入力でニンテンドースイッチを操作できます。ただ、USB-BotbaseではなくSys-Botbaseが必要かもしれません。

キーボード操作しているところ

記事は以上。

コメント

タイトルとURLをコピーしました