请使用wpdpack这个开发包,可以获取一些信息的,就是内部信息需要自己解析了,wireshark里面是wireshark工具帮你解析的,而pcap属于tcpmp这种存储格式,你要么自己写解析,要么到网上找一下别人写好的解析工具。
谁使用过安卓手机端的wireshark工具
安卓的抓包工具,你可以看看教程:我们使用数据线将Android手机连接到电脑端,打开windows命令提示符窗口。使用命令打开Android所在的文件夹,我的是在D盘根目录下,因为我们要使用到Adb.exe,所以我们要一直打开到adb所在目录。将tcpmp程序copy至android手机(该命令前面那个目录文件为本地地址,后面那个目录为目的手机端地址)修改tcpmp的权限
(1)先输入adbshell进入权限修改,若是在4.0之后的系统,再输入完adbshell之后,我们还需要输入su命令,在运行su指令后,手机终端桌面会出现相应提示信息以确认您对root操作的认可。
(2)当出现#后,输入chmod/data/local/tcpmp运行tcpmp进行抓包
#/data/local/tcpmp-p-vv-s0-w/sdcard/capture.pcap
在手机端执行相应需要进行抓包分析的操作,执行完成后在命令提示符窗口执行Ctrl+C中断抓包进程。将抓包结果复制至本地(前面那个目录为手机端地址,后面那个目录为本地地址)使用Wireshark等工具查看抓包文件capture.pcap,以下是完整截图。
如何利用libpcap和Python嗅探数据包
一提到Python获取数据包的方式,相信很多Python爱好者会利用Linux的libpcap软件包或利用Windows下的WinPcap可移植版的方式进行抓取数据包,然后再利用dpkt软件包进行协议分析,我们这里想换一个角度去思考:
1.Python版本的pcap存储内存数据过小,也就是说缓存不够,在高并发下容易发生丢包现象,其实C版本的也同样存在这样的问题,只不过Python版本的缓存实在是过低,让人很郁闷。
2.dpkt协议分析并非必须,如果你对RFC和RFC等协议熟悉的话,完全可以使用struct.unpack的方式进行分析。
如果你平常习惯使用tcpmp抓取数据包的话,完全可以使用它来代替pcap软件包,只不过我们需要利用tcpmp将抓取的数据以pcap格式进行保存,说道这里大家一定会想到Wireshark工具,具体命令如下:
-s0-ieth1-whttps://blog.51cto.com/pcap/tcpmp.pcap--W5
我们首先需要对pcap文件格式有所了解,具体信息大家可以参考其他资料文档,我这里只说其重要的结构体组成,如下:
sturctpcap_file_headerDWORDmagic;
WORDversion_major;
WORDversion_minor;
DWORDthiszone;
DWORDsigfigs;
DWORDsnaplen;
DWORDlinktype;structpcap_pkthdrstructtimevalts;
DWORDcaplen;
DWORDlen;structtimevalDWORDGMTtime;
DWORDmicroTime;这里需要说明的一点是,因为在Python的世界里一切都是对象,所以往往Python在处理数据包的时候感觉让人比较麻烦。Python提供了几个libpcapbind,http://monkey.org/~gsong/pypcap/这里有一个最简单的。在windows平台上,你需要先安装winpcap,如果你已经安装了Ethereal非常好用。一个规范的抓包过程:
importpcap
importdpkt
pc=pcap.pcap()#注,参数可为网卡名,如eth0
pc.setfilter('')#设置监听过滤器
forptime,pdatainpc:#ptime为收到时间,pdata为收到数据
printptime,pdata#...
对抓到的以太网V2数据包(rawpacket)进行解包:
ifp.data.__class__.__name__=='IP':
ip='%d.%d.%d.%d'%tuple(map(ord,list(
__class__.__name__=='TCP':
ifdata.dport==80:
一些显示参数nrecv,ndrop,nifdrop=pc.stats()返回的元组中,第一个参数为接收到的数据包,第二个参数为被核心丢弃的数据包。
至于对于如何监控tcpmp生成的pcap文件数据,大家可以通过pyinotify软件包来实现,如下:
classPacker(pyinotify.ProcessEvent):
def__init__(self,proct):
self.proct=proct
self.process=None
defprocess_IN_CREATE(self,event):
logger.debug("createfile:%sinqueue"%self.process_IF_START_THREAD(event))
defprocess_IN_MODIFY(self,event):
self.process_IF_START_THREAD(event)
logger.debug("modifyfile:%sinqueue"%self.process_IF_START_THREAD(event))
defprocess_IN_DELETE(self,event):
filename=
logger.debug("deletefile:%s"%filename)
defprocess_IF_START_THREAD(self,event):
filename=
iffilename!=self.process:
self.process=filename
>1:
try:
logger.debug("createconsumerproct.qsize:%s"%
consumer=Consumer(self.proct)
consumer.start()
exceptException,errmsg:
logger.error("createconsumerfailed:%s"%errmsg)
returnfilename
classFactory(object):
def__init__(self,proct):
self.proct=proct
self.manager=pyinotify.WatchManager()
self.mask=_DELETE|pyinotify.IN_MODIFY
defwork(self):
try:
try:
notifier=pyinotify.ThreadedNotifier(self.manager,Packer(self.proct))
notifier.start()
_watch("https://blog.51cto.com/pcap",self.mask,rec=True)
notifier.join()
exceptException,errmsg:
logger.error("createnotifierfailed:%s"%errmsg)
exceptKeyboardInterrupt,errmsg:
logger.error("factoryhasbeenterminated:%s"%errmsg)
在获得要分析的pcap文件数据之后,就要对其分析了,只要你足够了解pcap文件格式就可以了,对于我们来讲只需要获得TCP数据段的数据即可,如下:
classWriter(threading.Thread):
def__init__(self,proct,stack):
threading.Thread.__init__(self)
self.proct=proct
self.stack=stack
self.pcap_pkthdr={}
defrun(self):
whileTrue:
filename=
try:
f=open(filename,"rb")
readlines=f.read()
f.close()
offset=24
whilelen(readlines)>offset:
self.pcap_pkthdr["len"]=readlines[offset+12:offset+16]
try:
length=struct.unpack("I",self.pcap_pkthdr["len"])[0]
[offset+16:offset+16+length])
offset+=length+16
exceptException,errmsg:
logger.error("unpackpcap_pkthdrfailed:%s"%errmsg)
exceptIOError,errmsg:
logger.error("openfilefailed:%s"%errmsg)
在获得TCP数据段的数据包之后,问题就简单多了,根据大家的具体需求就可以进行相应的分析了,我这里是想分析其HTTP协议数据,同样也借助了dpkt软件包进行分析,如下:
defworker(memcache,packet,local_address,remote_address):
try:
ifp.data.__class__.__name__=="IP":
srcip="%d.%d.%d.%d"%tuple(map(ord,list(
dstip="%d.%d.%d.%d"%tuple(map(ord,list(
__class__.__name__=="TCP":
tcpacket=
iftcpacket.dport====local_address:
srcport=tcpacket.sport
key=srcip+":"+str(srcport)
iftcpacket.data:
ifnotmemcache.has_key(key):
memcache[key]={}
ifnotmemcache[key].has_key("response"):
memcache[key]["response"]=None
ifmemcache[key].has_key("data"):
memcache[key]["data"]+=tcpacket.data
else:
memcache[key]["data"]=tcpacket.data
else:
ifmemcache.has_key(key):
memcache[key]["response"]=[key]["data"])
try:
stackless.tasklet(connection)(memcache[key]["response"],local_address,remote_address)
stackless.run()
exceptException,errmsg:
logger.error("connectremoteremote_addressfailed:%s",errmsg)
logger.debug("oldheaders(nonecontent-length):%s",memcache[key]["response"])
memcache.pop(key)
exceptException,errmsg:
logger.error(":%s",errmsg)
如果大家只是想单纯的获取IP地址、端口、流量信息,那么问题就更简单了,这里只是抛砖引玉。另外再提供一段代码供参考:
importpcap,dpkt,struct
importbinascii
defmain():
a=pcap.pcap()
a.setfilter('udpportrange-')
try:
fori,pdataina:
src='%d.%d.%d.%d'%tuple(map(ord,list(
dst='%d.%d.%d.%d'%tuple(map(ord,list(
sport=
dport=
qq=int(binascii.hexlify([7:11]),16)
print'QQ:%d,From:%s:%d,To:%s:%d'%(qq,src,sport,dst,dport)
exceptException,e:
print'%s'%e
n=raw_input()
if__name__=='__main__':