[实践OK]Android手机通过电脑adb配合tcpdump进行应用的http接口访问抓包,通过tcpdump抓包,反编译工具,用adb解决这个拷贝问题,tcpdump: Read-only file system问题。Eclipse下配置LogCat步骤,最好是有root权限能抓单个apk进程的包,及eclipse代理于android sdk代理设置,及用ddm进行抓取物理手机usb连接后的程序日志。

jackxiang 2013-5-15 11:57 | |
背景:手机抓apk产生的日志包,及用adb对包进行更新、安装操作及adb里进行tcpdump是非常有用的操作,分两个大步骤去讲。

==========第一大步骤:试图在eclipse里用logcat抓手机里的包=============
Eclipse下配置LogCat步骤及可能出现的问题解决:
一)挂载android的sdk,logcat和那个ddms都在里面:
     eclipse下的菜单:windows下有一个;preferences里有一个Android,里有一个:
sdk location:选:D:\Program Files\adt-bundle-windows-x86-20130219\sdk。
(在eclipse里windows ->preference 找不到android这个选项,是啥原图?没装eclipse的android插件,后面会讲。)
(D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat)

二)打开DDMS 会自动调出logcat:
Eclipse 用DDMS 调试Android 程序,抓android手机连接电脑里的包,
单击window->open Pespective 里面应该有,没有就到other里找到ddms,这个前提是要安装eclipse的安卓插件。
logcat在:windows->show view->ohter->logcat(没有就在输入框里输入就能找到,前提是要安装了eclipse的android插件。)

来自:http://zhidao.baidu.com/link?url=IjJjp4Y3An_C25G3BDfQvj66WRsUlAAHvubwmM-DYOhRv8WEIpqWToykpNElwfO_rf8sxvBsrQPXyBYtA2myqa
关于,加入写代码如何调试?
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
这 5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不 同,我们可以控制要显示的某一类错误,一般我们如果使用'断点'方式来调试程序,则使用Log.e比较合适。但是根据规范建议Log.v,Log.d信息 应当只存在于开发过程中,最终版本只可以包含Log.i, Log.w,Log.e这三种日志信息。
http://blog.sina.com.cn/s/blog_53a99cf30100tha3.html

eclipse的DDMS中找不到安卓模拟设备?怎么办:
其一:
1. 打开cmd命令行,切换到adb命令目录,如果你已经加入了环境变量,切换目录就省了。
2. 输入命令:adb kill-server,adb被杀死了。
3. 接着输入命令:adb start-server,重新启动adb。
4. 再用adb devices命令,是不是看到设备了。

主要原因是可能某个程序占用了adb端口,操作一下下面方法:
5037为adb默认端口 查看该端口情况如下:
     netstat -aon|findstr "5037"
     TCP    127.0.0.1:5037         0.0.0.0:0              LISTENING       6540
找到那个程序,kill掉。在cmd命令行下输入taskkill /pid 7024 /f
实践如下:
C:\Users\admin>netstat -ano|findstr 5037
  TCP    127.0.0.1:5037         0.0.0.0:0              LISTENING       4296
  TCP    127.0.0.1:5037         127.0.0.1:36183        TIME_WAIT       0
  TCP    127.0.0.1:5037         127.0.0.1:36184        TIME_WAIT       0
  TCP    127.0.0.1:5037         127.0.0.1:36186        TIME_WAIT       0
  TCP    127.0.0.1:5037         127.0.0.1:36188        TIME_WAIT       0

C:\Users\admin>taskkill /pid 4296 /f
成功: 已终止 PID 为 4296 的进程。

C:\Users\admin>netstat -ano|findstr 5037 //还有,是tcp协议上的事情一会就没了。
  TCP    127.0.0.1:5037         127.0.0.1:36859        TIME_WAIT       0
  TCP    127.0.0.1:5037         127.0.0.1:36860        TIME_WAIT       0
  TCP    127.0.0.1:5037         127.0.0.1:36861        TIME_WAIT       0
  TCP    127.0.0.1:5037         127.0.0.1:36862        TIME_WAIT       0

TIME_WAIT里这儿有说明,里面的图:
http://blog.csdn.net/mhfh611/article/details/8769617

三)在ddms里的logcat对包过滤:
     在左下可以选:save filters,加一个PID,就是进程Id进行过滤,这样就好弄多了,
可以对某个进程进行过滤了。(在Logcat选项卡中就能看到Saved Filters处点击那个绿色的加号+,然后看改成如下截图:(把下图中的包名换成你app的包名即可)


==========直接ddms.bat不使用eclipse===============
D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat
adb start-server
——————————————————————————————————————————————————————
在eclipse里windows ->preference 找不到android这个选项,是啥原图:
因为 (http://jingyan.baidu.com/article/7908e85c6b4a52af481ad2ee.html)
里的google插件被屏蔽了,在eclipse里的update里的插件地址给国内国家防火墙屏蔽了(https://dl-ssl.google.com/android/eclipse/(如果出错,请将https改成http))打不开了,于是否,
直接用ddms,eclipse其实就是集成这个ddms到里面了,位置如下:D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat  双击即可。

如果,非要从国外下载下来得设置代理:
Eclipse Update时代理设置,androidSDK 和 eclipse 的下载安装和代理设置:更新或安装插件前最好看一下代理,打开 windows/preference 看到这个配置:general network connection.....
这里可以设置你的代理,设置好代理的IP和端口就可以了。eclipse很智能,能检测你正在打开的代理,然后自动帮你配置好,但以防万一还是打开看看是否配置正确了。

然后安装插件即可 就是 help/install new software ,地址:http://dl-ssl.google.com/android/eclipse
来自:http://my.oschina.net/tdONEmadao/blog/281873?p={{currentPage-1}}

http://dl-ssl.google.com/android/eclipse/ 无法访问的解决办法:
很明显,国内网络和谐掉了google这个服务器,可以强制指向下Host ,以下是添加内容:
74.125.237.1 dl-ssl.google.com

具体操作方式:http://blog.163.com/angel_boa/blog/static/1906800912014015105249315/
点击桌面左下角开始菜单中的搜索,把以下路径,复制到搜索窗口中,c:\windows\system32\drivers\etc,点击立即搜索 ,就找到该文件,其实是一个纯文本的文件,
1、用记事本打开
2、将:203.208.46.146 dl-ssl.google.com  添加至最后一行
3、保存关闭Host

android sdk代理设置:
D:\Program Files\adt-bundle-windows-x86-20130219\SDK Manager.exe 打开后:tools->option ->http proxy(others force to https...)
——————————————————————————————————————————————————————————————
摘自:
http://bbs.51cto.com/thread-947038-1.html

=============第二大步骤:Adb控制手机里的应用应用程序及抓包=============
1.如何用adb获得手机里面某个apk的应用信息、版本信息
adb shell dumpsys package com.examle.xx
adb shell dumpsys 列出所有
2 如何用adb启动apk
adb shell am start -n breakan.test/breakan.test.TestActivity
卸载一个apk包方法:
adb uninstall SpareParts.apk  

3.获取进程列表好删掉这些安装包:
删除程序方法一:
C:\Users\admin>adb shell pm list packages
package:com.baidu.searchbox
...
...
adb uninstall com.baidu.searchbox

http://mytiankong.com/?p=11755
删除程序之方法二:
需要安卓设备已ROOT,电脑已安装adb工具,直接删除程序包,
adb shell ls /system/app/      //查看系统apk列表
adb remount           //挂载读写权限
adb shell rm /system/app/browser.apk //删除程序
adb shell rm /system/app/browser.apk回车,这个程序就被删除了,删除其它的程序把browser.apk改成需要删除的程序名即可,有些设备系统程序还有odex文件,也需要同时删除。
http://sspai.com/23641

会提示失败
原因在于安装后的包名已将改变,变为AndroidMainifest.xml文件中<manifest>节点下,package元素所指定的名字
正确方法是(后面这个;com.andorid什么的运行后通过logcat能够看到apk的日志):
adb uninstall com.android.spare_parts  
完成!
摘自:http://blog.csdn.net/ydt_lwj/article/details/7766742


1. 手机要有root权限

2. 下载tcpdump   http://www.strazzere.com/android/tcpdump

3. adb push c:\wherever_you_put\tcpdump /data/local/tcpdump

4. adb shell chmod 6755 /data/local/tcpdump
adb shell introduce:
http://wenku.baidu.com/view/288243976bec0975f465e2c6.html

5, adb shell,   su获得root权限

6, cd /data/local

7, ./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap

命令参数:

        # "-i any": listen on any network interface

  # "-p": disable promiscuous mode (doesn't work anyway)

  # "-s 0": capture the entire packet

  # "-w": write packets to a file (rather than printing to stdout)

  ... do whatever you want to capture, then ^C to stop it ...

8,  adb pull /sdcard/capture.pcap d:/

9,  在电脑上用wireshark打开capture.pcap即可分析log



Execute the following if you would like to watch packets go by rather than capturing them to a file (-n skips DNS lookups. -s 0 captures the entire packet rather than just the header):  


adb shell tcpdump -n -s 0  



Typical tcpdump options apply. For example, if you want to see HTTP traffic:  
只监听http  

adb shell tcpdump -X -n -s 0 port 80


三)移动tcpdump到指定目录并赋予权限:


方法二,经过没有文件管理器的命令行操作成功,如下实践Ok:
经过手机抓包工具的app的提示并实践OK,直接进入adb后su root后执行,还是出现如下:
shell@android:/sdcard # cp -Rf tcpdump /system/xbin/tcpdump
cp -Rf tcpdump /system/xbin/tcpdump
cp: /system/xbin/tcpdump: Read-only file system

—————***—————最后,如下步骤操作就Ok了————***—————
E:\download\三星一键进入挖煤ADB\三星ADB命令挖煤器\adb\adb.exe root
restarting adbd as root
E:\download\三星一键进入挖煤ADB\三星ADB命令挖煤器\adb\adb.exe remount
remount succeeded
E:\download\三星一键进入挖煤ADB\三星ADB命令挖煤器\adb\adb.exe pull /sdcard/tcpdump c:\
594 KB/s (1801155 bytes in 2.960s)
E:\download\三星一键进入挖煤ADB\三星ADB命令挖煤器\adb\adb.exe push c:\tcpdump /system/xbin/
3369 KB/s (1801155 bytes in 0.522s)

E:\download\三星一键进入挖煤ADB\三星ADB命令挖煤器\adb\adb.exe  shell chmod 755 /system/xbin/tcpdump


当天,刷了小米QingS_For_I9000_MIUIv5_Version1.zip,
里面没有像cygen系统自己带的文件管理器可获取root(没法root出来),只得找了下命令行,成功拷贝,如下:

上述方法摘自:http://wojiushiwolxw.spaces.eepw.com.cn/articles/article/item/97054
四)我的操作:


开始tcpdump
adb push tcpdump /data/local/tcpdump
adb shell chmod 6755 /data/local/tcpdump
adb shell rm -r /sdcard/capture.pcap
adb shell  /data/local/tcpdump -i any -p -s 0 -w /sdcard/capture.pcap
pause

五、下载tcpdump文件到电脑
adb pull /sdcard/capture.pcap capture.pcap


六、出现设备找不到的问题:

一看就知道是wlan0是wifi的ip就它了:

果然:
shell@android:/ # /system/xbin/tcpdump -i wlan0   -t -s 0   -w /sdcard/capture.pcap                                         <
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes以上tcpdump的参数主要是想从手机上pull下来后用电脑

通过cmd下载这个包到windows上,用wireshark进行查看http请求,wireshark进行分析http接口请求情况:https://jackxiang.com/post/4070/
D:\>"D:\Program Files\adt-bundle-windows-x86-20130219\sdk\platform-tools\adb.exe"   -s  3431466FD41F00EC pull /sdcard/capture.pcap
1196 KB/s (57344 bytes in 0.046s)


问题:有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切换到root,这样在执行批处理会有问题,解决方法如下
adb shell "su -c 'sleep 1'"
adb start-server

adb push tcpdump /data/local/tcpdump

来自:http://www.cnblogs.com/likwo/archive/2012/09/06/2673944.html
反编译方法:http://blog.csdn.net/sunboy_2050/article/details/6727581
下载反编译工具:http://ishare.iask.sina.com.cn/download/explain.php?fileid=35377828


adb实现拨打电话和发送短信:
一)实践拨打电话(要没有锁手机的屏幕时才行):
adb shell service call phone 2 s16 "10086"
service call phone 2 s16 "10086"
Result: Parcel(00000000    '....')


第二种方法实践打电话Ok:
root@raspberrypi:~/dev_Codes_All/i9000# adb shell
# service call phone 2 s16 "1861081**08"
Result: Parcel(00000000    '....')

二)实践发送短信:
adb shell am start -a android.intent.action.SENDTO -d sms:1881076*108 --es sms_body "hello" --ez exit_on_sent true
Starting: Intent { act=android.intent.action.SENDTO dat=sms:1881076*108 (has extras) }

//这鼐是换行,不是发送,实践发现
adb shell input keyevent 66  
input keyevent 66
最后实践ok为:
//发短信
adb shell am start -a android.intent.action.SENDTO -d sms:10086 --es sms_body cxye
adb shell input keyevent 22//焦点去到发送键
adb shell input keyevent 66//回车按下

实践Ok:
adb shell am start -a android.intent.action.SENDTO -d sms:1861*8157*8 --es sms_body cxye
adb shell input keyevent 22
adb shell input keyevent 66



作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6357/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-2-4 15:31
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]