tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

2018-08-01から1ヶ月間の記事一覧

prepared_statementの投げ方とMySQLからの確認の仕方

以前書いたような気がするのだが、検索してもなかったので書く。 Prepared statementを使ってcom_stmt_prepareが流れるか見てみる。 結論:流れた。 実際のサービスでは使われないらしいがどうなのだろうか?prepareしてidとパラメータ指定の2往復になってし…

そろそろtcpdumpでやっていく

wiresharkでの絞り込みは良いとして、tcpdumpでファイル出力は以下。 tcpdump -nn -i any dst host <IP> and dst port 3306 -w <filename> ackパケットが大量に混ざり込むので、そのフィルタをどうにかしたい。</filename></ip>

character set実装

一日の時間のうちお仕事に結構時間使っていて、調査と実装が厳しい。 ようやくcharacter-setのwireshark実装からわかる値で実装をした。

golang のMySQL driverも読んで見る

読めん。。。golang雰囲気で読んでる、、、 go/ctxutil.go at 50bd1c4d4eb4fac8ddeb5f063c099daccfb71b26 · golang/go · GitHub

character setについて

ドキュメントにある説明は↓だけだとおもう。 https://dev.mysql.com/doc/internals/en/character-set.html wiresharkのmysqlモジュールのコードから主要な部分は判定できそうなので、これで良いかも。 https://github.com/wireshark/wireshark/blob/3a514caa…

サンプル作成

sakila database突っ込んだMySQLで各コマンドを打ったサンプルを作成する show databases; use sakila show tables; select * from city order by city_id desc limit 3; insert into city (city, country_id) values ('Tokyo', 50); select * from city whe…

どこまで対応するか

対応予定 statusFlag未実装部分 SSL移行後の解決(別リポジトリでやるかも?) character_set部分的にでも(utf8とか有名どころだけでも) パケット内の複数パケットのパース X protocol (一般的なprotocol bufferのパース) 対応しない protocolバージョン320のも…

character setの一覧はないわけ?

character setのフラグなり値の一覧がないとcharacter setのフィールド埋められないんだが。 一旦structをmarshalしてjson出力したらそれなりにwiresharkなりと比較しやすい形になったので、いくつかサンプル作ったりして構造がただし以下確認していく。 そ…

全てstringが入ってくるパケットをどうするか

responseパケットでアプリケーションレイヤが全てstringで埋め尽くされたものをどうするか問題。 ステートレスにかつ途中からのMySQLパケットを解析しようとして無理してるんだけど、それ諦めれば良いじゃんって気持ちになっている 方法としては3つ? initia…

65565byteを越えたサイズのパケットなのか、MySQLレイヤのヘッダ(packet length(3), seaquence id(1))すらなくstringをぶち込んでくるパケットがある command_typeが0x02, 0x04あたりでpacket lengthが1で2つめ以降のMySQL packetでレスポンスデータを突っ込…

if more data ってなに?

Protocol::HandshakeV10の if more dataってなに? ココらへんはMySQL本体がどうやってパースしているか確認しないと行けない 0xfeのときのOK_PacketとAUTH_SWITCH_REQUESTの判別が難しくて、これは1こずつパースしてどっちかとしてうまくパースできないかど…

とにかくflagが厄介

Connection phaseで5byte目で判断できない厄介なケースのまとめ Protocol::HandshakeResponse41 4 capability flags, CLIENT_PROTOCOL_41 always set 4 max-packet size 1 character set string[23] reserved (all [0]) 頭の部分がこれで来る。 string[23]で…

Command Phase Packetようやく実装

体調崩しててどうもだめだった。 ようやく回復してきたので、実装の続きを進めた。 Command Phaseのパケットのデシリアライズがひとまず終わった。 COM_CHANGE_USERとCOM_STMT_EXECUTEはinitial handshake時のオプションを見ていないとパースが難しいので、…

どうもパースがうまく行かない原因がわかった

これまでのルールでほとんど全てのパケットをパースできると思っていたが、どうもうまく行かない。 Network上の1packetごとにMySQLプロトコルのパケットが複数含まれるので、そのMySQLパケットの中身がうまくパースできないことはわかっていた。 よく見るとC…

Hexで覚え始めた文字列たち

MySQLパケットを追っているときにhexのまま追えると便利というか、いちいちstringに直されたの見るの面倒なので、hex見てたら覚えた文字列たち。 よくある文字列 MySQL: 4d 79 53 51 4c select: 73 65 6c 65 63 74 SELECT: 53 45 4c 45 43 54 update: 75 70 …

MySQL packet分類

Connection Phase, Command Phase, General Responseのパケットの分類方法を確認した。 5byte目とpacket全体の長さで大体判断できる。 [fe]のものはhandshakeだとstring, stringがきてOK responseの[fe] int, intがくるので治安が悪い。 これはマッチングし…

MySQL Packet読んでる

MySQLのパケットはStateを保持して読んでいくのが基本なので、State/Modeがコネクションごとに存在する。 それがよくわかるのが↓で、 MySQL: Connection Lifecycle ここの図がわかりやすい。 更に、Handshakeあたりは こんな感じ。 Authentication exchange …

MySQLパケット続き

wiresharkでパケットを見てみたらhandshake時のcapacity flag部分が結構ドキュメントと違うことがわかった。 2バイトで分割されて、その2バイトそれぞれの中でリトルエンディアンになっている。 devドキュメントではなくて、source code documentみてもここ…

x protocolはどんな感じか

MySQL 4.1くらいの時からMySQLの通信プロトコルにはObsoletedなフィールドが多かったのでX protocolではどうなのか探してみた https://dev.mysql.com/doc/internals/en/x-protocol-messages-messages.html#x-protocol-messages-message-structure protocol b…

MySQLパケット続き

結局パケットはMySQL_Packet_interfaceみたいなインターフェースの構造体にデシリアライズして、typeフィールドみたいなもので、どのcommand_typeか判断してフィールドを判断してもらうようにする。 handshake時の情報とか、ステートマシンがpacketを解釈す…

続き

進捗だめでsう package main import ( "fmt" "github.com/google/gopacket" "github.com/google/gopacket/pcap" "log" // "strings" "time" ) var ( device string = "lo" snapshot_len int32 = 1024 promiscuous bool = false err error // timeout time.Du…

MySQLのpacket見ていく

gopacket使って適当にアプリケーション部分のパケット見てみた。 良い感じに見れたので、5byte目を見て単純な分類をしてみよう package main import ( "fmt" "github.com/google/gopacket" "github.com/google/gopacket/pcap" "log" "strings" "time" ) var …

MySQLのパケットみとる

command_typeは結構使われていないものが多いんじゃないかと思っていて、殆どは connection phase, general response packetのもの command phaseの一部 prepared statementでCOM_STMT_*** COM_QUERY だけな気がする。 replicationみたらもう少し出てくるの…

MySQLのpacketつづき

general response packet https://dev.mysql.com/doc/internals/en/generic-response-packets.html OK, [00] or [fe] ERR, [ff] EOF, [fe] OKとEOFかぶってるの厄介。 これOKは[00]使われてたりしないのか? [00]はCOM_SLEEPともかぶってる、、、、 Command …