wireshark的使用

一. 无论在windows下,还是在ubuntu下使用wireshark,都要先将 tcpdump 和 busybox 这两个程序push到手机

      


1. 到 http://www.strazzere.com/android/tcpdump 下载一个tcpdump并push到手机
   adb remount
   adb push tcpdump /system/bin
   adb shell chmod 777 /system/bin/tcpdump

2. 下载一个busybox并push到手机,这是因为我们要使用busybox中的nc工具
   adb remount
   adb push tcpdump /system/bin
   adb shell chmod 777 /system/bin/busybox


二. 在ubuntu下使用脚本更方便



最好使用python脚本sharkdroid.py,安装2.7版本的python,如果安装了3.3版本的python,稍微改下脚本即可。
当然,也可以直接敲脚本中的命令。

1. 安装wireshark
   sudo apt-get install wireshark

2. 安装nc
    一般来说ubuntu集成了nc程序,所以不用安装

3. 运行脚本
   python sharkdroid.py 表达式

   sharkdroid.py 的参数即为 tcpdump 的表达式,用法如下:
       分析SIP报文:   python sharkdroid.py udp port 5060
       分析HTTP报文:python sharkdroid.py tcp port 80
       分析TCP报文:  python sharkdroid.py tcp


sharkdroid.py 的内容

import sys
import os
import subprocess

if len(sys.argv) < 2:
    print "Can't process with no tcpdump expression"
    exit(1)

try :
    pid = os.fork()
    if pid > 0:                                // 父进程
        command= 'adb shell "tcpdump -n -s 0 -U -n -w - %s | busybox nc -lp12345"' % ' ' .join(sys.argv[1:])
        subprocess.call(command, shell=True)
    else :                                       // 子进程
        subprocess.call( "sleep 3" , shell=True)
        subprocess.call( "adb forward tcp:12345 tcp:12345" , shell=True)
        subprocess.call( "nc 127.0.0.1 12345 | wireshark -k -S -i -" , shell=True)
except OSError, e:
    sys.stderr.write( "fork #2 failed: (%d) %s \n" % (e.errno, e.strerror))


解析:sys.argv[1:] 表示从第2个到最后1个命令行参数组成的数组
                   例如:命令行为sharkdroid.py tcp port 80,则 sys.argv[1:]表示数组['tcp','port','80']

      .join 用于连接字符串数组
            例如:s = ['a','b','c','d']
                  print ''.join(s)
                  print '-'.join(s)
            输出结果:
                  abcd
                  a-b-c-d
            因此, ' ' .join(sys.argv[1:])可能是udp port 5060或 tcp port 80,即第2到最后1个命令行参数,中间用空格隔开
            
      %s和% 前者表示一个格式化字符串,后者表示用来代替前者的字符串,显然,这里用 ' ' .join(sys.argv[1:])去代替%s
            因此,对于命令行 sharkdroid.py tcp port 80,
                  实际上command =  'adb  shell  "tcpdump -n -s 0 -U -n -w - tcp port 80 | busybox nc -lp12345"'
                 对于命令行 sharkdroid.py udp port 5060,
                  实际上command =  'adb  shell  "tcpdump -n -s 0 -U -n -w - udp port 5060 | busybox nc -lp12345"'

     tcpdump的选项  -n    不把网络地址转换成名字;
                          -nn        不把网络地址和端口转换成名字
                                 -s 0         抓取整个数据包,-s是用来指定抓取包的多少个字节的,默认为68字节,0表示抓取整个包
                                 -U           使得当tcpdump在使用-w选项时,其文件写入与包的保存同步,
                                               即当每个数据包被保存时,它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件
                                 -w           把包数据直接写入文件而不进行分析和打印输出

     通过 os.fork() 创建了一个子进程;

     在父进程中进入adb shell,然后在手机上通过tcpdump抓包,重定向到nc -l创建的TCP服务器,
     nc-lp12345 会在手机的12345端口启动一个TCP服务器,默认情况下在该端口接收所有的标准输入和输出,
                但是这里通过重定向接收tcpdump重定向来的包

     在子进程用adb forward将手机12345端口重定向到PC的123456端口,然后用nc连接本PC的12345端口,并重定向到wireshark

注:
     nc即netcat,在网络工具中有“瑞士军刀”的美称, 在不同的网络连接之间建立一个通道,TCP或UDP包可通过该通道传输

     nc  [-options] hostname port[s] [ports] ...    // 想要连接到某处
     nc -l -p port [-options] [hostname] [port]    // 绑定端口等待连接

     usage: nc [-46DdhklnrStUuvzC] [-iinterval] [-Pproxy_username] [-p source_port ]
               [-s source_ip_address ] [-TToS] [-wtimeout] [-Xproxy_protocol]
               [-x proxy_address[: port]] [hostname] [port[s] ]

     参数:-C 类似-L选项,一直不断连接
           -d 后台执行
           -e prog 程序重定向,一旦连接,就执行
           -g gateway source-routing hop point[s], up to 8
           -G num source-routing pointer:4,8,12,...
           -h 帮助信息
           -i secs 延时的间隔
           -l 监听模式,用于入站连接
           -n 指定数字的IP地址,不能用hostname
           -o file 记录十六进制的传输
           -p port 本地端口号
           -r 任意指定本地及远程端口
           -s addr 本地源地址
           -u UDP模式
           -v 详细输出,用两个-v能得到更详细的内容
           -w secs timeout的时间
           -z 将输入输出关掉,用于扫描时


wireshark [ -vh ] [ -DklLnpQS ] [ -a <captureautostop condition> ] ...
          [ -b <capturering buffer option> ] ...
          [ -B <capturebuffer size> ]
          [ -c <capturepacket count> ] [ -f <capture filter> ]
          [ -g <packetnumber>] [ -i <capture interface >] [ -m <font>]
          [ -N <nameresolving flags> ] [ -o <preference/recent setting> ] ...
          [ -r<infile> ] [ -R <read (display) filter> ] [ -s <capture snaplen> ]
          [ -t <time stamp format> ] [ -w <savefile> ] [ -y <capture link type> ]
          [ -X <eXtension option> ] [ -z <statistics> ] [ <infile>]

          -k 指定wireshark立即开始捕捉。这个选项需要和-i参数配合使用来指定捕捉产生在哪个接口的包
          -S wireshark在捕捉数据后立即显示它们,通过在一个进程捕捉数据,另一个进程显示数据
             这和捕捉选项对话框中的"Update list of packets in real time/实时显示数据"功能相同
          -i  设置用户进行捕捉的接口或管道



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值