我有一个python(3.1,如果这很重要)应用程序,它为另一个要消耗的进程提供数据,并通过网络连接进行交换。由于某种原因,一些交换意外地大...我可以理解一些腌制数据并找出传输的内容,但仍有大量明显的二进制数据我无法向自己解释,例如冗余字符串或大块二进制数据。
你知道是否有一个wireshark插件可以帮助我完成这项任务,或者你推荐给那些试图找出在传输对象之前应该更多=None
d的人的另一个过程通过连接?
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.
最让我感到困惑的是,它似乎太常规了,例如仅仅是二进制的浮点数/整数。它对数字和[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
许多其他对象(例如CPE
,RouteDirect
)没有__getstate__
方法。我喜欢它,如果有一些技术不需要我爬过所有类的所有构造函数,当然。
答案 0 :(得分:1)
啊,阅读/usr/lib/python3.1/pickle.py代码至少使一点不那么模糊:酸洗的输出确实是某些解释器的字节码,推/弹对解释了看到的常规模式。
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“跟踪TCP流”和“另存为...”功能捕获原始流量,然后使用
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))
正常工作(x[y]
不是在y == x.my_field
&gt; _&lt;)
'my_field'
的有效方法