2

別のプロセスが消費するデータを取得し、ネットワーク接続を介してそれらを交換するpython(重要な場合は3.1)アプリケーションがあります。何らかの理由で、一部の交換は予想外に大きくなります...ピクルス化されたデータの一部を理解し、何が送信されたかを理解できますが、冗長な文字列など、私が自分自身に説明できない明らかにバイナリデータの大きな塊が残っていますまたはバイナリデータの大きなチャンク。

そのタスクを支援するwiresharkプラグインがあるかどうか、または=Noneオブジェクトが接続を介して送信される前に、さらに何をすべきかを理解しようとする誰かに推奨する別のプロセスがあるかどうかを知っていますか?

RouteDirect
q.).q.}q.(X...._RouteDirect__dst_nodeq.cnode
Node
q.).q.}q.(X...._Node__status_upq.NX...._Node__neighbourhoodq.NX...._Node__sendq.NX
..._Node__cpeq
cequation
CPE
q.).q.}q^M(X...._CPE__dim_countq.}q.X...._CPE__internal_nodesq.]q.ubX...._Node__major_stateq.NX...._Node__partition_idq.G?.$:..4.    X...._Node__name_idq.cnodeid
NameID
q.).q.}q.X^M..._NameID__nameq.X....checkq.sbX...._Node__dispatcherq.NX...._Node__pendingq.]q.cmessages

^私はそれを理解することができます:RouteDirect、CPE、およびNameIDは私のプログラムのクラスです。

vこれについてはもっと驚いています。Iproto、Tflags、Isrc、Idstはこれらのデータに含まれる文字列ですが、交換にはそれほど多くの「プレーンバイナリ」データはないはずです。

 q0).q1}q2(X...._Range__maxq3X....1f40q4X...._Range__min_includedq5.X...._Range__max_includedq6.X...._
 Range__minq7h4ubX...._Component__dimensionq8h'ubh&).q9}q:h)X....Tflagsq;sbh+).q<}q=(h..h/h0).q>}q?            
 (h3X....02q@h5.h6.h7h@ubh8h9ubh&).qA}qBh)X....IprotoqCsbh+).qD}qE(h..h/h0).qF}qG(h3X...

 .06qHh5.h6.h7hHubh8hAubh&).qI}qJh)X....IsrcqKsbh+).qL}qM(h..h/h0).qN}qO(h3X....7d59d8faqPh5.h6.
 h7hPubh8hIubh&).qQ}qRh)X....IdstqS    
 sbh+).qT}qU(h..h/h0).qV}qW(h3X....00001011qXh5.h6.h7hXubh8hQubh&).qY}qZh)X....Tsrcq[sbh+).q\}q]         
 (h..h/h0).q^}q_(h3X....0bcfq`h5.h6.h7h`ubh8hYubusbX....

vそしてこれは本当に困惑しています。

qt).qu}qv(X...._LookupRequest__keyqwh!).qx}qyh$}qz(h&).q{}q|h)h*sbh+).q}}q~(h..h/h0).q.}q.
(h3h4h5.h6.h7h4ubh8h{ubh&).q.}q.h)h;sbh+).q.}q.(h..h/h0).q.}q.(h3h@h5.h6.h7h@ubh8h.ubh&).q.}q.h)hCsbh+).q.}q.(h..h/h0).q.}q.
(h3hHh5.h6.h7hHubh8h.ubh&).q.}q.h)hKsbh+).q.}q.(h..h/h0).q.}q.(h3hPh5.h6.h7hPubh8h.ubh&).q.}q.h)hSsbh+).q.}q.(h..h/h0).q.}q.
(h3hXh5.h6.h7hXubh8h.ubh&).q.}q.h)h[sbh+).q.}q.(h..h/h0).q.}q.
(h3h`h5.h6.h7h`ubh8h.ubusbX...._LookupRequest__nonceq.G?...u...X...._LookupRequest__fromq.h.).q.}q.(h.Nh.Nh.Nh
h.).q.}q.(h.}q.

私が最も困惑しているのは、たとえばバイナリの単なるfloat/intであるにはあまりにも規則的であるように思われることです。それは数字と[shub]にある程度の親和性があり、多くの「分離された」q...それは私にマシンコードをもっと思い出させます。それとも私の目だけですか?

クラスでのピクルスサポートの例Node、##特別なピクルスの動作を定義します。

def __getstate__(self):
    """Indicate witch fields should be pickled."""
    state = copy.copy(self.__dict__)

    # 'state' is a shallow copy: don't modify objects' content
    # Make transients fields point to nothing
    state['_Node__dispatcher'] = None
    state['_Node__send'] = None
    state['_Node__neighbourhood'] = None
    state['_Node__status_up'] = None
    state['_Node__data_store'] = None
    state['_Node__running_op'] = None
    state['_Node__major_state'] = None

    return state

他の多くのオブジェクト(たとえばCPERouteDirect)には__getstate__メソッドがありません。もちろん、すべてのクラスのすべてのコンストラクターをクロールする必要のないテクニックがあれば、それが大好きです。

4

1 に答える 1

1

ああ、/usr/lib/python3.1/pickle.pyコードを読むと、少なくとも1ポイントわかりにくくなります。ピクルスの出力は、実際に一部のインタープリターのバイトコードであり、プッシュ/ポップのペアが見られる規則的なパターンを説明しています。

BINPUT         = b'q'   # store stack top in memo; index is 1-byte arg
BINGET         = b'h'   # push item from memo on stack; index is 1-byte arg
EMPTY_TUPLE    = b')'   # push empty tuple
MARK           = b'('   # push special markobject on stack

@Alfeのコメントに続いて、wiresharkの「followTCPstream」および「saveas ...」機能を使用して生のトラフィックをキャプチャし、次に使用しました

x=pickle.load(open("wirecapture.bin","rb"))

Pythonエバリュエーターを使用して、そこに何があったのかをよりよく理解しました。Esp。を使用して

len(pickle.dump(x.my_field))

によって報告されたすべてのフィールドについて、特大のフィールドを正確に特定するdir(x)ことができました。残念ながら、私は得ることができませんでした

for y in dir(x):
   print("%s: %iKb"%(y,len(pickle.dumps(x[y])/1024))

適切に機能している(y == > _ <の場合x[y]に抽出する有効な方法ではありませんでした)x.my_field'my_field'

于 2012-09-11T12:02:59.470 に答える