Android:错误将主机名解析为IP

时间:2013-09-09 02:14:04

标签: android android-wifi

我一直在Android上做一些低级别的黑客攻击。

我正在尝试启用wifi,即通过终端(adb shell)建立Internet连接。我已经编写了一个C程序来实现这一点,通过入侵android的仿生库和libnetutils库来实现这一目标。

一切正常。我可以通过dhcp请求获取IP地址。问题是每当我尝试打开任何网站时。通过浏览器google.com,它不会打开。但是当我输入网站“74.125.228.66”(google.com)的IP地址时,页面就会被加载。

我尝试了几个选项,比如修改文件“resolv.conf”(存在于/ system / etc中)和文件“20-dns.conf”(在/ system / etc / dhcpcd / dhcpcd-中)中的dns条目挂钩)。 我还尝试使用“setprop”调用为“dhcp.eth0.dns *”和“dhcp.wlan0.dns *”手动设置dns值。

但似乎没有任何效果。我注意到还有一个有趣的行为。如果我从“设置”菜单手动打开wifi然后将其关闭然后运行我的程序,我就不再面对这个问题了。看起来它使用了一些我无法弄清楚的设置。

我的猜测是这是DNS问题,但可能是其他问题。如果有人以前遇到过这个问题,请告诉我。

这是我启用wifi的方法:

  1. 使用wpa_supplicant启用set_prop()守护程序。

  2. 发送dhcp请求以获取IP(来自dhcpclient.clibnetutils的代码)。

  3. 使用dhcpcd启用set_prop()守护程序。 (即使没有这个,一切正常。我运行这个以便IP租约自动更新。(虽然我不确定这一点,如果dhcpcd守护进程将负责续租或续租))。

1 个答案:

答案 0 :(得分:1)

要通过C程序通过命令行在Android上启用WIFI,您需要执行以下操作:

1)启用wpa_supplicant守护程序。 (确保在/ data / misc / wifi中有wpa_supplicant.conf文件,其中包含AP(接入点)信息。)。 wpa_supplicant内部负责加载驱动程序,然后根据可用性和强度建立与其配置文件中指定网络的连接。

2)发出dhcp请求。 (要获取IP,租用,dns1,dns2等)

3)启动dhcpcd守护程序。 (租约续期)

4)设置net.dns *属性。 (如果没有这个,DNS服务将不适用于任何应用程序)

为了启用守护进程(wpa_supplicant和dhcpcd)并设置net.dns *属性,您需要使用Android属性系统(property_set()和property_get()函数)。要了解有关Android Property System的更多信息,请点击以下链接: http://rxwen.blogspot.com/2010/01/android-property-system.html

为了使用上述2个函数,你需要入侵仿生和核心libcutils库。 地点: /bionic/libc/bionic/system_properties.c /system/core/libcutils/properties.c

对于发出dhcp请求,您需要破解一些libnetutils的实现 地点: /系统/核心/ libnetutils / *

禁用Wifi:

1)手动卸载驱动程序。 2)停止wpa_supplicant守护程序。 3)停止dhcpcd守护进程。 4)取消设置net.dns *属性。

在这种情况下,需要手动卸载驱动程序,而不像加载。如果未执行此步骤,则即使在2,3和4之后,任何现有连接也不会被拆开。要手动卸载驱动程序,您需要向wpa_supplicant发出“DRIVER STOP”请求,该请求将负责交互用内核卸载驱动程序。 为了与wpa_supplicant进行通信,您需要深入了解wpa_cli实现以了解它是如何工作的。它基本上使用UNIX域套接字与请求者进行交互。你基本上需要看看wpa_ctrl.c和wpa_cli.c

要了解有关wpa_supplicant,wpa_cli的更多信息,请点击以下链接: http://hostap.epitest.fi/wpa_supplicant/devel/

我向你解释的所有内容都是在Android的HAL层完成的。 地点: /hardware/libhardware_legacy/wifi/wifi.c

因此,基本上每当你从设置菜单切换wifi开关时,控制从wifi_app代码传递到wifi_frameworks层(WifiManager和WifiServices),它通过JNI实现(WifiNative)将控制传递给wifi.c(HAL层)。

一个好的起点是看看wifi.c如果你想知道在低级别完成的事情来启用wifi。

PS - 以上所有内容都是我在尝试自行解决问题的几次尝试后所学到的。没有文档或博客(至少我没有发现任何!),它们将指定需要完成的工作以及启用/禁用WIFI应遵循的事件顺序。所以,你可能会找到一种更好的做事方式。这对我有用,其他可能对你有用!