java - TCPDump working from adb shell but not from device -
i developing android application monitor network usage in android devices.
one of application requirements provide “.pcap” file created tcpdump command. when try execute tcpdum command adb shell, works fine , able create file. when try execute command device itself, using java code, permission denied error.
it should mentioned java code works fine other commands not demand special privilege.
it should mentioned used 2 of following rooted devices (first samsung – running android 4.4, second samsung - running android 5.1.1)
moreover, tried install tcpdump binary , gave execution privilege , tried different variations of tcpdump command in order obtain privilege “su”. understand, behavior of kernel , it’s security reasons, despite this, know if there way around / give application permissions need in order run mentioned commands. below, commands tried run , responses given.
command: tcpdump -l -i eth1 -w /sdcard/output.pcap response: tcpdump: eth1: don't have permission capture on device (socket: operation not permitted)
command: tcpdump -w /sdcard/output.pcap response: tcpdump: can't open netlink socket 13:permission denied
response: tcpdump: rmnet0: don't have permission capture on device.
my manifest permissions:
<uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.write_external_storage" /> <uses-permission android:name="android.permission.read_external_storage" /> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.wake_lock" /> <uses-permission android:name="android.permission.read_phone_state" /> <uses-permission android:name="android.permission.receive_boot_completed"/> <uses-permission android:name="android.permission.call_phone"/> <uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.internet"/> <uses-permission android:name="android.permission.read_phone_state"/> <uses-permission android:name="android.permission.change_network_state"/> <uses-permission android:name="android.permission.write_external_storage"/> <uses-permission android:name="android.permission.wake_lock"/> <uses-permission android:name="android.permission.mount_unmount_filesystems"/> <uses-permission android:name="android.permission.write_settings" /> <uses-permission android:name="android.permission.disable_keyguard" /> <uses-permission android:name="android.permission.read_logs" /> <uses-permission android:name="android.permission.reorder_tasks" /> <uses-permission android:name="android.permission.get_tasks" /> <uses-permission android:name="android.permission.kill_background_processes" /> <uses-permission android:name="android.permission.interact_across_users" /> <uses-permission android:name="android.permission.access_coarse_location"/> <uses-permission android:name="android.permission.access_fine_location"/> <uses-permission android:name="android.permission.access_wifi_state"/> <uses-permission android:name="android.permission.change_wifi_state"/> <uses-permission android:name="android.permission.access_superuser"/> the relevant code:
public static boolean executecommandviashell(string scmd) { datainputstream iserr = null, isres = null; bufferedreader brerr = null, brres = null; try { process process = runtime.getruntime().exec(scmd); iserr = new datainputstream(process .geterrorstream()); brerr = new bufferedreader(new inputstreamreader(iserr)); isres = new datainputstream(process .getinputstream()); brres = new bufferedreader(new inputstreamreader(isres)); // errors: while ((m_smessage = brerr.readline()) != null) { if (m_smessage.equalsignorecase("invalid")) { return false; } } while ((m_smessage = brres.readline()) != null) { if (m_smessage.equals("success")) { log.d(tag, "success m_smessage: " + m_smessage); } else { return false; } } return true; } catch (exception e) { e.printstacktrace(); return false; } { try { iserr.close(); isres.close(); brerr.close(); brres.close(); } catch (ioexception e) { e.printstacktrace(); } } }
Comments
Post a Comment