Android下面的使用libpcap和jnetpcap



先序引用:http://aswang.iteye.com/blog/1036305本文为此文章补充

推荐:http://blog.sina.com.cn/s/blog_82f2fc2801012woo.html

之前只知道使用libpcap在Android上面抓包,还是在楼主这里了解jnetpcap。也按照楼主的方式操作。总结一下我的收获吧,毕竟搞了好几天了。

1.楼主给的libpcap链接貌似废了,直接把git改成www过去能看到这个项目,也是说是Android平台上面的,但是编译不成功。原因是ndk缺少几个Linux的头文件,本人测试9d 到 10d所有版本,只有x86版本的最后一个Android-platform的库文件是全的。补好库文件直接,第二个问题是库文件string.h一个方法定义方式和调用方式不一致,在宏定义的地方格式有误。

2.官网libpcap0.9.8是30年前发布的项目,那个时候哪来的Android,我也没有在里面找到Android.mk文件。但是最后还是找到了楼主使用的库文件。应该是被人包装过了,

博客地址:http://blog.sina.com.cn/s/blog_82f2fc2801012woo.html
下载地址:http://dl.dbank.com/c0ra9nnzna

3.编译好的代码不需要System.loadLibrary("jnetpcap");  因为jnetpcap的代码里面有这一句。

4.很多人按照jetpcap的官方步骤操作,会发现在findalldevs这一步找不到网卡列表(manifest.xml没有配置网络访问权限的话,还会包permission deny的错误,errorbuf)。因为libpcap使用了rawsocket,是一个root用户才能使用的东西。需要给应用分配root权限。

5.网上常规的获取root权限的代码有问题,如下代码片段
 process = Runtime.getRuntime().exec("su"); //切换到root帐号 
         os = new DataOutputStream(process.getOutputStream()); 
         os.writeBytes(cmd + "\n");
         os.writeBytes("exit\n");
         os.flush(); 
         return process.waitFor()==0; 
当waitfor返回值为0的时候才是真正获取root权限成功。但是注意里面有一个exit,在shell里面执行类似代码会发现exit本身就是退出当前账户。这里的意思就是root用户切换到普通用户了。但是没有这句话的话,输出管道被重定向了,后面的log一个都不会出现。重要的是:这种代码只是让process这个子进程拥有root权限,application是Java虚拟

机的一个实例,虚拟机是运行在普通用户模式上面的。所以不管怎么说,su命令获取到的root是假的,除非你自己在c里面调用su。至于chmode,只是/data/data下面对应的应用目录的读写执行权限,本身应用本身就拥有这些权限的(读写执行自己的东西,更改了之后表示其他应用可以修改自己的东西而已)。

6.Google上面找到的两个方案,要么把自己的应用安装到/system/app/下面,并修改trick位(即让自己成为系统应用),要么用c语言实现一个启动程序,切换为root用户后通过命令行启动libpcap程序。如下

1).What you may have to do to get this going is to write a C program (targeted for the ARM processor) and run it separately as root (i.e. your su/sudo exec trick), have it open up the interface and either write back to the java VM application using a socket or mmap a file (java.nio.FileChannel) and write packets to it and have jnetpcap application read the file.

2).yes I tried to do this! I typed for first time: $su #am start -a android.intent.action.MAIN -n com.sniffer.jni/com.sniffer.jni.SnifferApp but the application run as before with app priveleges (ps shows:app_79 9844 55 128016 17812 ffffffff afe0dab4 S com.sniffer.jni). Then I tried this: # su -c am start -a android.intent.action.MAIN -n com.sniffer.jni/com.sniffer.jni.SnifferApp and I got this: Permission denied :( – 

本人没测试过,因为他说自己失败了。

7.在jnetpcap的官网说明中,明确提示还不支持Android平台,目前还在试验过程。
http://jnetpcap.com/userguide/android#credit1
(Notice: experimental, unsupported)
但是这个地址提供了一个链接,
http://sourceforge.net/projects/prueba-android/
里面有一个项目,提供了完整的jnetpcap和libpcap的包装和一个Android应用实例。本人测试过暂时可行,但是貌似bug比较多,经常程序崩溃。就不知道是应用层面的错误还是API层面的错误了。目前,本人知道的就这么多了。

by:童年的馒头 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值