ソケット経由でadxvにスポット位置表示をさせる方法の解析

adxvに-socketオプションを与えて起動するとソケット経由で操作ができるが,公式には使い方が説明されていないhttp://www.scripps.edu/~arvai/adxv/adxv.txt ソースも公開されていませんが,今回バイナリから使い方が解析されています.
4
とりさん @biochem_fan

adxv の遠隔操作の仕方: adxv -socket 8100 & で起動しておく。telnet localhost 8100 で接続。load_image test0001.osc と送れば、test0001.osc が開かれる。

2012-10-12 23:34:24
K. Yam @yam_cpp

SHIKAからadxvを立ち上げて、一度立ち上げたらソケットを使ってイメージを更新するようにしてみた。load_image以外にどんなコマンドが使えるのかと思ってバイナリをstringsで調べてみたらload_spotsなるコマンドを発見。しかし今のところ使い方が分からず。

2013-11-13 11:56:13
とりさん @biochem_fan

@yam_cpp load_spots は謎ですね。スポットリストを読み込むだけなら、load_image で行けます。https://t.co/GCEyaAGCQI

2013-11-13 16:20:05
K. Yam @yam_cpp

@biochem_fan おお,有り難うございます…って,ふぁぼってますね自分…すみません(図らずも同じようにstringsで調べてました).load_spotsの後に入れた数字がスポットの数を表すことは分かったんですが,座標の与え方が謎のままでした.

2013-11-13 16:28:46
とりさん @biochem_fan

adxv にソケット経由で怪しい数値を流し込んで動的解析をしている。

2013-11-13 16:48:28
とりさん @biochem_fan

load_spots 1 4000 1000 を送り込むと、malloc が mmap(size=3360026624) failed みたいなエラーを吐く。999 だとエラにならない。1000 の部分を変えて size がどう変化するかを見ることで、引数の意味を探る。

2013-11-13 16:52:31
とりさん @biochem_fan

load_spots 1 4000 Y とすると、Y を 100 変えるごとに、4096 バイトずつ要求される size が増えていく。ということは Y は座標を100倍して整数化したものではないか。

2013-11-13 16:55:15
とりさん @biochem_fan

load_spots 1 4000 1000 1 と load_spots 1 4000 1000 でも変わるなぁ。なんだろこれ。

2013-11-13 17:05:18
K. Yam @yam_cpp

@biochem_fan load_spotsとend_of_packは対になってるのかなと思ってたんですが,そこはどうでしょうか?

2013-11-13 17:12:36
とりさん @biochem_fan

@yam_cpp そこまで行ってません(汗) とりあえず。malloc のエラー表示をついて、引数解析中です。(sscanf にブレークポイント仕掛けてデバッガで追えばいいんですが、それは最後の手段として……)

2013-11-13 17:15:17
とりさん @biochem_fan

end_of_pack で Expected 1400010001 but Read 0 spots. ていうのが出るな。この数字も解析できそう。

2013-11-13 17:17:09
とりさん @biochem_fan

なんか、ハタから見ると、すごくアヤシイことをやってるみたいで誤解されそうなので実況は自重しよう…… ある科学ソフトウェアの引数がマニュアルに書いてないので、調査してるだけですよ〜

2013-11-13 17:18:19
K. Yam @yam_cpp

@biochem_fan いえ,例のメッセージが出るので,関連がありそうだなと思っただけで…やられてるような解析はできません汗 試しに, load_spots 1 1500 1500 1 end_of_pack としたら"Read 1 spots"と出ましたが何も表示されません…

2013-11-13 17:21:10
K. Yam @yam_cpp

strings adxvしたらload_spotsの下に %f%f%d end_of_pack と続いていたので, load_spots 1 1500 1500 1 end_of_pack としたが,出ず.adxvのFind Peaksを実行してから叩いたら,表示が出た.謎.

2013-11-13 17:32:46
K. Yam @yam_cpp

これで矩形の表示は出るけど,色が黒い.変えられるのかも知れないけど,まあおとなしく.adxファイルを読ませておけって話ですかね…

2013-11-13 17:37:33
とりさん @biochem_fan

adxv の引数、解析完了。

2013-11-14 02:50:35
とりさん @biochem_fan

. @yam_cpp スポットの与え方は、お気づきの通りです。load_spots N としたあと、X Y type の列を N 個与えます。X, Y は float で、type は 1-255 です。その後、end_of_pack を送るとスポットが表示されます。

2013-11-14 02:54:37
とりさん @biochem_fan

. @yam_cpp 問題はこの前で、これを送る前にスポットタイプを定義する必要があります。メニューから Find peaks をしたり、adx ファイルでスポットリストを読み込ませた場合は、自動的にスポットタイプが定義されますが、そうでない場合は未定義のため、何も表示されません

2013-11-14 02:55:27
とりさん @biochem_fan

. @yam_cpp スポットタイプを定義するには、define_type N dummy blue dummy R のようにします。N は 1-255 の整数で、タイプ番号、R はスポットの半径、blue の部分は色です。blue, green, red を受け付けます。

2013-11-14 02:56:25
とりさん @biochem_fan

. @yam_cpp dummy の部分は、%*s で読み飛ばしされるので、なんでもかまいません。

2013-11-14 02:56:50
とりさん @biochem_fan

. @yam_cpp define_type で指定するのは、タイプごとの色と半径です。これで丸が描けますが、中心に四角を出すには、box 10 10 のようにして、寸法を指定します。これは全てのtypeに共通です。色はdefine_typeで指定したものになります。

2013-11-14 03:00:44
とりさん @biochem_fan

. @yam_cpp 以上をまとめると、http://t.co/hOuVE4i3oA のようになります。なお、telnet で一気に送りすぎると、取りこぼすことがあるようです。

2013-11-14 03:02:13
とりさん @biochem_fan

Mac OS X 版と違ってバイナリが strip されていたので時間がかかってしまったが、x86_64 の呼び出し規約が体に染み込んだ。rdi, rsi, rdx, rcx, r8, r9 の順にレジスタに積んで呼び出し。

2013-11-14 03:05:17