2

我一直在对 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-hooks)中的dns条目。我还尝试使用“setprop”调用为“dhcp.eth0.dns*”和“dhcp.wlan0.dns*”手动设置 dns 值。

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

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

这是我启用wifi的方法:

  1. 使用. wpa_supplicant_set_prop()

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

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

4

1 回答 1

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 请求,您需要破解 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 应遵循的事件顺序。因此,您可能会找到更好的做事方式。这对我有用,其他东西可能对你有用!

于 2013-09-18T04:30:27.283 回答