Не открывает устройство в библиотеке PcapPlusPlus
Пытаюсь написать свой снифер, для этого использую библиотеку PcapPlusPlus, но увы функция dev->open() всегда возвращает false. Возможно это из-за эмулятора Genymotion, этот эмулятор вроде рутирован, но возможно все же нельзя и надо использовать реально рутированное устройство:
extern "C"
JNIEXPORT void JNICALL
Java_com_example_android_pcapplusplus_PcapPlusPlusInterface_listenTraffic(JNIEnv *env,
jobject thiz) {
// IPv4 address of the interface we want to sniff
std::string interfaceIPAddr = "10.0.3.16";
// find the interface by IP address
pcpp::PcapLiveDevice *dev = pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp(
interfaceIPAddr);
if (dev == NULL) {
std::string str =
"Cannot find interface with IPv4 address of '" + interfaceIPAddr + "'" + "\n";
l(str);
return;
}
// before capturing packets let's print some info about this interface
std::string interfaceInfo =
" Interface name: " + dev->getName() + "\n" + // get interface name
" Interface description: " + dev->getDesc() + "\n" + // get interface description
" MAC address: " + dev->getMacAddress().toString() + "\n" +
// get interface MAC address
" Default gateway: " + dev->getDefaultGateway().toString() + "\n" +
// get default gateway
" Interface MTU: " + std::to_string(dev->getMtu()); // get interface MTU
l(interfaceInfo);
if (dev->getDnsServers().size() > 0) {
l(" DNS server: " + dev->getDnsServers().at(0).toString());
}
if (!dev->open()) {
l("Cannot open device \n");
return;
}
// create the stats object
PacketStats stats;
l("Starting asynch capture \n");
dev->startCapture(onPacketArrives, &stats);
// sleep for 10 seconds in main thread, in the meantime packets are captured in the async thread
pcpp::multiPlatformSleep(20);
// stop capturing packets
dev->stopCapture();
// print results
l("Results \n");
stats.printToConsole();
}
Я попробовал все адреса что вернула функция из java внизу были результат был один dev->open() возвращал false.:
private String getIpAddress() {
String ip = "";
try {
Enumeration enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (enumNetworkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface)enumNetworkInterfaces
.nextElement();
Enumeration enumInetAddress = networkInterface
.getInetAddresses();
while (enumInetAddress.hasMoreElements()) {
InetAddress inetAddress = (InetAddress) enumInetAddress.nextElement();
String ipAddress = "";
if (inetAddress.isLoopbackAddress()) {
ipAddress = "LoopbackAddress: ";
} else if (inetAddress.isSiteLocalAddress()) {
ipAddress = "SiteLocalAddress: ";
} else if (inetAddress.isLinkLocalAddress()) {
ipAddress = "LinkLocalAddress: ";
} else if (inetAddress.isMulticastAddress()) {
ipAddress = "MulticastAddress: ";
}
ip += ipAddress + inetAddress.getHostAddress() + "\n";
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ip += "Something Wrong! " + e.toString() + "\n";
}
return ip;
}