【问题标题】:Android: Error Resolving hostname to IPAndroid:将主机名解析为 IP 时出错
【发布时间】:2013-09-09 02:14:03
【问题描述】:

我一直在对 Android 进行一些低级黑客攻击。

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

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

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

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

我的猜测是这是 DNS 问题,但也可能是其他问题。让我知道是否有人以前遇到过这个问题。

这是我启用 wifi 的方法:

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

  2. 发送dhcp 请求获取IP(代码来自dhcpclient.c in libnetutils)。

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

【问题讨论】:

    标签: android android-wifi


    【解决方案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 属性系统的更多信息,请点击以下链接: http://rxwen.blogspot.com/2010/01/android-property-system.html

    要使用上述 2 个功能,您需要破解仿生和核心 libcutils 库。 地点: /bionic/libc/bionic/system_properties.c /system/core/libcutils/properties.c

    为了发出 dhcp 请求,你需要 hack 一些 libnetutils 的实现 地点: /system/core/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 而在低级别执行的操作,则可以查看 wifi.c。

    PS - 以上都是我在多次尝试自己解决问题后学到的。没有文档或博客(至少我没有找到任何!)可以指定需要做什么以及启用/禁用 WIFI 应遵循的事件顺序。因此,您可能会找到更好的做事方式。这对我有用,其他方法可能对你有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2016-08-08
      • 2011-05-07
      • 2019-09-29
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多