注意:根是必需的。
默认的DHCP IP地址范围是硬编码的(1),如果不使用修改后的源代码重建ROM,就无法更改它。或使用一点技巧。
开启网络共享时,至少会发生以下情况:
hostapd -管理访问点的守护程序-已启动。
网络接口设置,IP地址被添加到Wi-Fi接口(Android的饼图之前硬编码(2,3),然后随机化(4)),并加入路由表(5)用于本地网络(6)。
dnsmasq-DHCP / DNS服务器(最多Pie)-从硬编码的命令行参数(7)启动(否则可以通过/etc/dnsmasq.conf (8)设置)。
因此,我们可以/system/bin/dnsmasq用一个自定义的shell脚本替换它,从而控制两者之间的过程。将原始二进制文件重命名为其他名称:
# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin
创建脚本/system/bin/dnsmasq:
#!/system/bin/sh
OLD_SUBNET='192.168.43'
NEW_SUBNET='192.168.1'
WIFI_INTERFACE='wlan0'
LOCAL_TABLE='97'
export PATH=/system/bin
# delete old route, add new
ip route del ${OLD_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE
ip route add ${NEW_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE
# set new IP address on Wi-Fi interface
ip address add ${NEW_SUBNET}.1/24 dev $WIFI_INTERFACE
# inject new subnet in hard-coded arguments received from netd
set -- $(printf '%s' "$*" | sed 's/'${OLD_SUBNET}'/'${NEW_SUBNET}'/g')
unset OLD_SUBNET NEW_SUBNET WIFI_INTERFACE LOCAL_TABLE
# execute original binary with new arguments
exec dnsmasq.bin $*
确认您的Wi-Fi接口的名称(wlan0通常)。用ip link或检查ls /sys/class/net/。
另外,请确认您的本地网络的路由表是97:grep local_network /data/misc/net/rt_tables。Android的路由非常混乱,每个新版本都变得更加复杂。因此,我不确定这是否一直存在。同样,在进行任何更改之前,请检查您的路由策略和表以弄清楚应在脚本中添加的内容:
~# RULES="$(ip rule | grep -vE 'unreachable|local')"
~# echo "$RULES"
~# for t in $(echo "$RULES" | awk '{print $NF}' | uniq); do ip r s table $t; done
如果(全部或部分)尚未定义并且status为,则还需要定义SELinux规则enforcing。使用Magisk suploicy或其他类似工具sepolicy-inject:
# execute binaries from /system/bin
allow netd system_file dir { read open getattr search }
allow netd system_file file { read gettattr open execute execute_no_trans }
# execute /system/bin/sh
allow netd shell_exec file { read getattr open execute execute_no_trans }
# execute /system/bin/toolbox and its applets
allow netd toolbox_exec file { read gettattr open execute execute_no_trans }
# configure RPDB rules / routing tables
allow netd netd capability { sys_admin }
*重新启动后无法永久使用,使用某些init.d脚本或替换/sepolicy为ramdisk
设置文件权限:
~# chown 0.0 /system/bin/dnsmasq*
~# chmod 0755 /system/bin/dnsmasq*
~# chcon u:object_r:dnsmasq_exec:s0 /system/bin/dnsmasq*
请享用!
或者,您可以从命令行设置完整的网络共享,运行自己的进程。该答案包括说明,尽管问题有所不同。
有关: