2019年11月27日水曜日

ごみ記事:libminecraft.soを解析して、パケットとか、いろいろ調べる! パケット読み方を頑張る編#3

こんにちは、皆に愛されるはにおかさいです。
人生に迷いすぎて精神崩壊しそうです。あぁ、もうしてるか。

今回は、パケットの読み方を頑張ります。

こちらも参考にしてください
http://blog.haniokasai.com/2017/04/libminecraftso.html

今回はSetEnableCommandsPacketを解説したいと思います。
そもそも、このパケットは、mcpeのクライアント側で、コマンドの入力を受け付けるか否かを設定できるものです。PMMPではデフォルトでtrue(真)となります。

MiNETでは、デフォルトでは何も設定されないので、

Player player = e.Player;
var setCmdEnabled = McpeSetCommandsEnabled.CreateObject();
setCmdEnabled.enabled = true;
player.SendPackage(setCmdEnabled);

https://github.com/haniokasai/EnableCommand/blob/master/EnableCommand.cs
として、パケットを送りつけます。

本題に入りましょう


まず、libminecraftpe.soの解析ファイルを見てみましょう


  9ecc22: b510       push {r4, lr}
  9ecc24: 4604       mov r4, r0
  9ecc26: 4608       mov r0, r1
  9ecc28: f4de ea58  blx 6cb0dc <ReadOnlyBinaryStream::getBool()@plt>
  9ecc2c: 7320       strb r0, [r4, #12]
  9ecc2e: bd10       pop {r4, pc}

赤い部分には、getBool()と書かれています。boolとは型で

Bool  真偽(true かfalse)
VarInt 数字
Byte 
UnsignedVarInt
SignedBigEndianInt
FixedFloat 固定の小数
Float 浮動小数
UnsignedShort
< > で囲まれたのは独自にmcpeで定義されている型です
<Vec3>
<ItemInstance>

PMMPでは、この関数でパケットのデータを設定するようです
https://github.com/BlueLightJapan/BlueLight/blob/1bbb6a6e11db5e90de6672cf2a08a079228ff216/src/pocketmine/utils/BinaryStream.php

SetEnableCommandsPacketはtrueで有効になるわけですから、やはり解析結果にはBool型が書かれています。

PocketMineでこのパケットの動作を見てみましょう。
PocketMineでは、StartGamePacketにて、コマンドが有効になるようになっていますから、あえて、コマンドを使えなくしてみましょう。

public function  onJoin(PlayerJoinEvent $event){    $player = $event->getPlayer();    $pk = new SetCommandsEnabledPacket();    $pk->putBool(false);    $player->dataPacket($pk);}

これで、本来なら送信できますが、今回は解析結果を使ってみます。


<?php
namespace haniokasai;
use pocketmine\network\protocol\DataPacket; /**
* Created by PhpStorm.
* User: htek
* Date: 2017/04/16
* Time: 22:41
*/ #include <rules/DataPacket.h>
class enablepk extends DataPacket{ const NETWORK_ID = "0x3c"; public $en;/*変数を、パケットの必要とする引数の数だけ書きます。  呼び出しは
 
*/ public function decode(){//mcpe->serverのパケットに関する処理
public function encode(){//server->mcpeのパケットに関する処理
$this->reset();//お掃除
$this->putBool($this->en);//libminecraftpe.soにgetBoolと書かれているので、型を合わせるのでputBoolとします。
}
}

このような風にかくと、datapacket型が作れます。
SetCommandsEnablePacketには、bool型を1つ必要としますから、putBoolで、真偽の値を置いてやります。変数$en(= $this->en)にはtrueかfalseが入ります。
$pk2 = new enablepk();//DataPacketの雛形を呼び出す
$pk2->en = true;//変数の内容を入力
$player->dataPacket($pk);

これでパケットが作成と送信ができます。


こんな感じのプラグインを作ってみました
https://github.com/haniokasai/PacketTest-PocketMine-/tree/master/enablepackettest

サーバーで試してみると、MCPEのアプリでコマンドを実行しても、チートが使えないと怒られるようになりました。




0 件のコメント:

コメントを投稿

ごみ記事:libminecraft.soを解析して、パケットとか、いろいろ調べる! パケット読み方を頑張る編#3

こんにちは、皆に愛されるはにおかさいです。 人生に迷いすぎて精神崩壊しそうです。あぁ、もうしてるか。 今回は、パケットの読み方を頑張ります。 こちらも参考にしてください http://blog.haniokasai.com/2017/04/libminecrafts...