Android tcpdump抓包应用实现
Android应用很多时候都会涉及到网络,在请求网络出错时,我们可以通过抓包来分析网络请求,返回的数据等,通常我们是用tcpdump这个工具来抓包,再通过wireshark工具来分析生成的文件,关于tcpdump的使,可以从网上查一下,有很多介绍,比如:http://www.cnblogs.com/likwo/archive/2012/09/06/2673944.html。关于如何用wireshark来分析文件,本文不作介绍。
使用adb的命令来操作,还是比较麻烦,所以我写了一个应用,把这些命令封装了起来。实现的最根本的原理是通过Runtime.exec来执行linux命令。
运行截图
、
实现代码
/**
*
* @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;
}
}
说明
Android tcpdump抓包应用实现的更多相关文章
- Android常用抓包工具之TcpDump
➠更多技术干货请戳:听云博客 做为一个测试人员,工作中经常会用到数据抓包工具来进行数据分析和验证,下面就简单介绍一下工作中常用的抓包工具. TcpDump抓包 Tcpdump是一个用于截取网络分组,并 ...
- [转] Android利用tcpdump抓包
原文链接:http://mysuperbaby.iteye.com/blog/902201 Android利用tcpdump抓包 博客分类: Android AndroidAccessGoHTML ...
- Android手机tcpdump抓包
在开发过程中遇到问题时,无法非常方便的获取到数据包,导致分析解决问题比较麻烦.这里介绍如何在Android手机上实现tcpdump抓包. 1.root机器 在用tcpdump抓包过程中,需要使用 ...
- Android利用tcpdump抓包,用wireshark分析包。
1.前言 主要介绍在android手机上如何利用tcpdump抓包,用wireshark分析包. android tcpdump官网: http://www.androidtcpdump.com/ t ...
- Android 常用抓包工具介绍之Charles
➠更多技术干货请戳:听云博客 Charles是一款抓包修改工具,相比起TcpDump,charles具有界面简单直观,易于上手,数据请求控制容易,修改简单,抓取数据的开始暂停方便等等优势!前面介绍了如 ...
- [转] Android实时抓包分析 : 善用adb调试桥
Android实时抓包分析 : 善用adb调试桥 谈到android网络抓包,很多人都能想到牛逼轰轰的神器tcpdump.方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包 ...
- tcpdump抓包命令
本文转自 : http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html http://www.itshouce.com.cn/l ...
- TCPdump抓包命令详解--摘
http://blog.csdn.net/s_k_yliu/article/details/6665673/ http://starsliao.blog.163.com/blog/static/890 ...
- Wireshark和TcpDump抓包分析心得
Wireshark和 TcpDump抓包分析心得 1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Window ...
随机推荐
- 用Visual Studio 2015 编写第一个UMDF驱动遇到的问题!!
前提:Visual Studio 2015已经成功安装了驱动环境,WDK都已经完全正常安装了,在Visual Studio 2015的菜单可以看到"Driver"菜单项了.这说明已 ...
- win8删除无线网络其中的一项配置
netsh wlan delete profile name="无线名称"
- 菜鸟认识揭开DLL木马
相信经常玩木马的朋友们都会知道一些木马的特性,也会有自己最喜爱的木马,不过,很多朋友依然不知道近年兴起的“DLL木马”为何物.什么是“DLL木马”呢?它与一般的木马有什么不同? 一.从DLL技术说起 ...
- MFC中MessageBeep与sndPlaySound播放声音函数使用
MessageBeep(0x00000000L); //用来播放系统默认音频文件,如0x00000000L为系统提示音,具体音频对应规则,请参照MSDN. sndPlaySound函数用来播放指 ...
- Chapter 2 Open Book——17
The rain stayed soft over the weekend, quiet, so I was able to sleep well. 这周末雨一直下的很柔很安静,所以我能睡的很好. P ...
- 编码规范系列(二):Eclipse Checkstyle配置
http://chenzhou123520.iteye.com/blog/1627618 上一篇介绍了<编码规范系列(一):Eclipse Code Templates设置>,这篇主要介绍 ...
- 弹出框,先弹出遮罩有透明度灰色100%高宽,置顶z-index:999---再弹出框最顶部z-index:9999
<div class="mask"></div> <div class="maskbox"> <form id=&qu ...
- ACC起来后,usb检测不到
/proc/scsi/usb-storage 插入u盘,生成文件 /dev/sd* 节点路径 挂载方法 mkdir /media/sda1 mount /dev/sda1 /media/sda1 u盘 ...
- RGB888转RGB666
内存中的数据排列高位在左,低位在右 RGB888->RGB666 高 -------低 B[3] B[2] B[1] B[0] ...
- bios自检时间长,显示0075错误
一amibios主板,只有一IDE接口,接一硬盘一光驱,每次启动时,在bios自检界面,在检测完usb设备后,都要等个那么一两分钟,这个时候,可以在屏幕的右下角看到有数字:0075 ,这就是错误代码. ...