Android tcpdump抓包应用实现

Android tcpdump抓包应用实现

Android应用很多时候都会涉及到网络,在请求网络出错时,我们可以通过抓包来分析网络请求,返回的数据等,通常我们是用tcpdump这个工具来抓包,再通过wireshark工具来分析生成的文件,关于tcpdump的使,可以从网上查一下,有很多介绍,比如:http://www.cnblogs.com/likwo/archive/2012/09/06/2673944.html。关于如何用wireshark来分析文件,本文不作介绍。

使用adb的命令来操作,还是比较麻烦,所以我写了一个应用,把这些命令封装了起来。实现的最根本的原理是通过Runtime.exec来执行linux命令。

运行截图

实现代码

CommandsHelper.java

/**
 *
 * @author lihong06
 * @since 2014-3-3
 */
public class CommandsHelper {
    private static final String NAME = "tcpdump";
    private static final String TAG = "CommandsHelper";
    public static final String DEST_FILE = Environment.getExternalStorageDirectory() + "/capture.pcap";

    public static boolean startCapture(Context context) {
        InputStream is = null;
        OutputStream os = null;
        boolean retVal = false;
        try {
            AssetManager am = context.getAssets();
            is = am.open(NAME);
            File sdcardFile = Environment.getExternalStorageDirectory();
            File dstFile = new File(sdcardFile, NAME);
            os = new FileOutputStream(dstFile);

            copyStream(is, os);

            String[] commands = new String[7];
            commands[0] = "adb shell";
            commands[1] = "su";
            commands[2] = "cp -rf " + dstFile.toString() + " /data/local/tcpdump";
            commands[3] = "rm -r " + dstFile.toString();
            commands[4] = "chmod 777 /data/local/tcpdump";
            commands[5] = "cd /data/local";
            commands[6] = "tcpdump -p -vv -s 0 -w " + DEST_FILE;

            execCmd(commands);
        } catch (IOException e) {
            e.printStackTrace();
            Log.i(TAG, "    error: " + e.getMessage());
        } finally {
            closeSafely(is);
            closeSafely(os);
        }

        return retVal;
    }

    public static void stopCapture(Context context) {
        // 找出所有的带有tcpdump的进程
        String[] commands = new String[2];
        commands[0] = "adb shell";
        commands[1] = "ps|grep tcpdump|grep root|awk ‘{print $2}‘";
        Process process = execCmd(commands);
        String result = parseInputStream(process.getInputStream());
        if (!TextUtils.isEmpty(result)) {
            String[] pids = result.split("\n");
            if (null != pids) {
                String[] killCmds = new String[pids.length];
                for (int i = 0; i < pids.length; ++i) {
                    killCmds[i] = "kill -9 " + pids[i];
                }
                execCmd(killCmds);
            }
        }
    }

    public static Process execCmd(String command) {
        return execCmd(new String[] { command }, true);
    }

    public static Process execCmd(String[] commands) {
        return execCmd(commands, true);
    }

    public static Process execCmd(String[] commands, boolean waitFor) {
        Process suProcess = null;
        try {
            suProcess = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
            for (String cmd : commands) {
                if (!TextUtils.isEmpty(cmd)) {
                    os.writeBytes(cmd + "\n");
                }
            }
            os.flush();
            os.writeBytes("exit\n");
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (waitFor) {
            boolean retval = false;
            try {
                int suProcessRetval = suProcess.waitFor();
                if (255 != suProcessRetval) {
                    retval = true;
                } else {
                    retval = false;
                }
            } catch (Exception ex) {
                Log.w("Error ejecutando el comando Root", ex);
            }
        }

        return suProcess;
    }

    private static void copyStream(InputStream is, OutputStream os) {
        final int BUFFER_SIZE = 1024;
        try {
            byte[] bytes = new byte[BUFFER_SIZE];
            for (;;) {
                int count = is.read(bytes, 0, BUFFER_SIZE);
                if (count == -1) {
                    break;
                }

                os.write(bytes, 0, count);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void closeSafely(Closeable is) {
        try {
            if (null != is) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String parseInputStream(InputStream is) {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        StringBuilder sb = new StringBuilder();
        try {
            while ( (line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }
}

MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView textView = (TextView) findViewById(R.id.textView1);
        String oldText = textView.getText().toString();
        textView.setText(oldText + "\n\n" + "目标文件: " + CommandsHelper.DEST_FILE);

        findViewById(R.id.start_capture).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setEnabled(false);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        final boolean retVal = CommandsHelper.startCapture(MainActivity.this);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, "startCapture result = " + retVal, Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }).start();
            }
        });

        findViewById(R.id.stop_capture).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CommandsHelper.stopCapture(MainActivity.this);
                findViewById(R.id.start_capture).setEnabled(true);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

说明

1、手机必须要Root,没有root的我没有测试过,另外,我也只测试了我一台手机,没有覆盖到所有的手机。

2、大家如果发现问题,请告知于我,谢谢。

时间: 2024-10-10 12:37:13

Android tcpdump抓包应用实现的相关文章

Android tcpdump 抓包

(1)将android的tcpdump命令复制到/data/local/tools/目录下,添加可执行权限(2)在本地电脑上新建adbtcpdump.sh文件,内容如下: #!/bin/bash filename=`date +%F-%H-%M-%S`".cap"filepath="/data/local/tmp" PullFile(){#    echo $filepath/$filename    adb shell "su -c 'chmod 777

Android下通过tcpdump抓包

参考:http://www.cnblogs.com/likwo/archive/2012/09/06/2673944.html 最近因为测试需要,要抓手机APP的包. a.手机要有root权限 b.下载tcpdump   http://www.strazzere.com/android/tcpdump c.此处原文采用 adb push 将 tcpdump 文件拷贝到 /data/local  不过我执行此操作时发现权限不够(手机已经root)换用管理者运行 CMD还是不行,最后决定直接在手机上

Android通过tcpdump抓包

1. 手机要有root权限 2. 下载tcpdump   http://www.strazzere.com/android/tcpdump 3.tcpdumptcpdump 4. adb shell chmod 6755 /data/local/tcpdump 5, adb shell,   su获得root权限 6, cd /data/local 7, ./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap 命令参数: # "-i any":

Android手机tcpdump抓包

在开发过程中遇到问题时,无法非常方便的获取到数据包,导致分析解决问题比较麻烦.这里介绍如何在Android手机上实现tcpdump抓包. 1.root机器 在用tcpdump抓包过程中,需要使用到root权限.当前可以进行root的方法有很多,个人推荐http://root.baidu.com/,安装使用挺方便的. 2.准备adb工具     ADB是Android手机开发包中自带的Bug调试工具,使用这个工具可以非常方便的通过PC对Android机器进行调试,在本人使用过程中经用将其用于在An

Android网络开发之用tcpdump抓包

Android开发过程中,当涉及到网络通信的时候,有一些字段需要抓包获取.我之前因为SSDP设备发现的包头格式没有写对,经过抓包分析和标准包头对比发现了这个困扰我很久的问题.总之,掌握在Android手机里面抓包是很有必要的. 准备工作:Android系统的手机,网络环境,tcpdump,破解手机root权限,建议最好在手机里面安装RE文件管理器并且给root权限.具体步骤如下: 首先,通过adb工具将tcpdump推送到手机,tcpdump的下载地址为:http://www.strazzere

Android手机抓包的几种方法

一.用burp抓包(http和https) 使手机和pc在同一局域网中,在pc上打开burp设置proxy为pc的IP,端口可自定义,手机上用ProxyDroid设置网络或者手动修改代理为pc的IP和端口就OK了. 有的app客户端通信使用https,先在电脑上用burp和浏览器访问这些https网站,然后在浏览器里面导出所有跟这些https网站相关的证书(.cer),把证书复制到手机上进行安装这样手机就有了证书,就能通过burp来抓包了. 参考: 1.http://drops.wooyun.o

Android端抓包方法

By:wangyz 最近这段时间研究抓包发包,汇编可能要推迟一些时间了 做手机测试的同学,肯定都要做一些手机端的抓包测试,看看数据包是否有错误,是否加密之类的,做外挂的也要抓来数据包做做分析. 一般抓包都是在PC机上搭个AP,用Wireshark抓,感觉那种方法有点略麻烦, 抓包环境 三星 GT-I8552 Android 4.1.2 百度云ROM 正式版V6(已ROOT) PC端(Windows XP) 1.正确安装手机驱动,手机端打开USB调试 2.Android手机需要先获得root权限.

Android 常用抓包工具介绍之Charles

?更多技术干货请戳:听云博客 Charles是一款抓包修改工具,相比起TcpDump,charles具有界面简单直观,易于上手,数据请求控制容易,修改简单,抓取数据的开始暂停方便等等优势!前面介绍了如何使用TcpDump抓包,下面给大家介绍一下Charles的使用. Charles抓包 Charles是一个HTTP代理服务器/HTTP监视器/反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信.这些包括request.response现HTTP headers(包含cookies与c

tcpdump抓包分析具体解释

說實在的,對於 tcpdump 這個軟體來說,你甚至能够說這個軟體其實就是個駭客軟體, 因為他不但能够分析封包的流向,連封包的內容也能够進行『監聽』, 假设你使用的傳輸資料是明碼的話,不得了,在 router 上面就可能被人家監聽走了! 非常可怕吶!所以,我們也要來瞭解一下這個軟體啊!(註:這個 tcpdump 必須使用 root 的身份執行) [[email protected] ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae] [-qX] [