Htc android手机的Internet传输(Internet pass-through)是手机使用USB连接线通过PC上网,共享电脑网络。
但是,这么好的功能需要在windows系统下安装最新版的HTC Sync才能启动。
linux下怎么才能使用Internet传输功能呢?
------------------------------------------------------------
前期做的研究:Android手机通过USB数据线共享Linux电脑网络(internet传输)
能勉强使用,但是很麻烦,不完善,缺陷有:
1.需要手机有root权限。
2.需要在手机终端上输入大量命令。
3.实际联上网,手机却一直显示脱机状态。
------------------------------------------------------------
Internet传输这么好的功能,难道在Linux下就只能这么将就的用着?对Linuxer来说,没有什么是不可能的!不需root,不需敲命令,手机完美进入internet传输状态,这都可以实现。
项目地址:https://github.com/qileilu/htcnetup
一、win下htc sync激活internet传输过程——抓包
要想像htc sync那样完美的激活internet传输,我们先小小的hacker一下这个htc sync。
这里我使用tcpdump来抓包。
1.首先把tcpdump文件放到手机的/data/local/tmp/目录下。(tcpdump下载)
- adb push tcpdump /data/local/tmp/
- adb shell chmod 777 /data/locla/tmp/tcpdump
2.win下打开终端,转到adb.exe目录,插入手机后,运行命令:
- adb shell su -c "./data/local/tmp/tcpdump -nnX -i usb0"
说明:做这一步是需要手机root权限,毕竟是抓包啊;命令运行要快,时机很重要,太早adb连接还没建立,太晚很多包又抓不上;网络设备是usb0。
3.抓包结果如下:
- tcpdump: verbose output suppressed, use - v or -vv for full protocol decode
- listening on usb0, link- type EN10MB (Ethernet), capture size 96 bytes
- 15:28:09.408922 IP 192.168.99.89.53370 > 192.168.99.214.6000: S 4103028695:41030 28695(0) win 8192
- 0x0000: 4500 0034 000f 4000 8006 b234 c0a8 6359 E..4..@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fd7 0000 0000 括c中z.p???...
- 0x0020: 8002 2000 ea3d 0000 0204 05b4 0103 0308 ....?.....?...
- 0x0030: 0101 0402 ....
- 15:28:09.409135 IP 192.168.99.214.6000 > 192.168.99.89.53370: S 793036861:793036 861(0) ack 4103028696 win 65535
- 0x0000: 4500 0034 0000 4000 4006 f243 c0a8 63d6 E..4..@.@.駽括c?
- 0x0010: c0a8 6359 1770 d07a 2f44 c83d f48f 3fd8 括cY.p衵 /D ????
- 0x0020: 8012 ffff 48a7 0000 0204 05b4 0101 0402 ..H?....?...
- 0x0030: 0103 0301 ....
- 15:28:09.409929 IP 192.168.99.89.53370 > 192.168.99.214.6000: . ack 1 win 256
- 0x0000: 4500 0028 0010 4000 8006 b23f c0a8 6359 E..(..@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fd8 2f44 c83e 括c中z.p???D?
- 0x0020: 5010 0100 527e 0000 P...R~..
- 15:28:09.410600 IP 192.168.99.89.53370 > 192.168.99.214.6000: P 1:5(4) ack 1 win 256
- 0x0000: 4500 002c 0011 4000 8006 b23a c0a8 6359 E..,..@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fd8 2f44 c83e 括c中z.p???D?
- 0x0020: 5018 0100 5270 0000 0002 0000 P...Rp......
- 15:28:09.410753 IP 192.168.99.214.6000 > 192.168.99.89.53370: . ack 5 win 32766
- 0x0000: 4500 0028 ef33 4000 4006 031c c0a8 63d6 E..(?@.@...括c?
- 0x0010: c0a8 6359 1770 d07a 2f44 c83e f48f 3fdc 括cY.p衵 /D ????
- 0x0020: 5010 7ffe 489b 0000 P..﨟...
- 15:28:09.419328 IP 192.168.99.214.6000 > 192.168.99.89.53370: P 1:5(4) ack 5 win 32766
- 0x0000: 4500 002c ef34 4000 4006 0317 c0a8 63d6 E..,?@.@...括c?
- 0x0010: c0a8 6359 1770 d07a 2f44 c83e f48f 3fdc 括cY.p衵 /D ????
- 0x0020: 5018 7ffe 536d 0000 8002 0000 P..m......
- 15:28:09.636522 IP 192.168.99.89.53370 > 192.168.99.214.6000: . ack 5 win 256
- 0x0000: 4500 0028 0013 4000 8006 b23c c0a8 6359 E..(..@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fdc 2f44 c842 括c中z.p???D菳
- 0x0020: 5010 0100 5276 0000 P...Rv..
- 15:28:12.636705 IP 192.168.99.89.53370 > 192.168.99.214.6000: P 5:9(4) ack 5 win 256
- 0x0000: 4500 002c 0025 4000 8006 b226 c0a8 6359 E..,.%@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fdc 2f44 c842 括c中z.p???D菳
- 0x0020: 5018 0100 5267 0000 0003 0000 P...Rg......
- 15:28:12.638841 IP 192.168.99.214.6000 > 192.168.99.89.53370: P 5:9(4) ack 9 win 32764
- 0x0000: 4500 002c ef35 4000 4006 0316 c0a8 63d6 E..,?@.@...括c?
- 0x0010: c0a8 6359 1770 d07a 2f44 c842 f48f 3fe0 括cY.p衵 /D 菳???
- 0x0020: 5018 7ffc 5366 0000 8003 0000 P..黃f......
- 15:28:12.639848 IP 192.168.99.89.53370 > 192.168.99.214.6000: P 9:13(4) ack 9 wi n 256
- 0x0000: 4500 002c 0026 4000 8006 b225 c0a8 6359 E..,.&@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fe0 2f44 c846 括c中z.p???D菷
- 0x0020: 5018 0100 525d 0000 0005 0000 P...R]......
- 15:28:12.640062 IP 192.168.99.89.53370 > 192.168.99.214.6000: F 13:13(0) ack 9 w in 256
- 0x0000: 4500 0028 0027 4000 8006 b228 c0a8 6359 E..(.'@...?括cY
- 0x0010: c0a8 63d6 d07a 1770 f48f 3fe4 2f44 c846 括c中z.p???D菷
- 0x0020: 5011 0100 5269 0000 P...Ri..
- 15:28:12.675279 IP 192.168.99.214.6000 > 192.168.99.89.53370: . ack 14 win 32762
- 0x0000: 4500 0028 ef36 4000 4006 0319 c0a8 63d6 E..(?@.@...括c?
- 0x0010: c0a8 6359 1770 d07a 2f44 c846 f48f 3fe5 括cY.p衵 /D 菷???
- 0x0020: 5010 7ffa 489b 0000 P..鶫...
看不懂?没关系,我看懂了:
a.手机在电脑生成的网口地址:192.168.99.89 端口53370;手机网口地址:192.168.99.214 端口 6000;
b.电脑向手机发送的第一次数据:4字节,内容:0002 0000; 手机向电脑应答:4字节 80002 0000;
c.电脑向手机发送的第二次数据:4字节,内容:0003 0000; 手机向电脑应答:4字节 80003 0000;
d.电脑向手机发送的第三次数据:4字节,内容:0005 0000; 手机无应答,internet传输模式建立。
好了,有这些就够了,接下来我们在linux下实现这个过程。
二、Linux下激活internet传输——编程
有了上述htc sync激活internet传输过程的抓包,我们要做的就是在linux下模仿这个激活过程。
这里我用c来写。
1.程序流程
1)主程序:
a.接收输入的手机IP地址
b.建立socket
c.建立connect
d.调用激活子程序
e.关闭socket退出
2)激活子程序:
a.向手机IP的6000端口,发送0x00020000,
b.收到手机发来的0x8002000后,向手机IP的6000端口发送0x00030000
c.收到手机发来的0x8003000后,向手机IP的6000端口发送0x00050000
2.程序代码
- /* htcnetup.c
- * LuoXiaoqiu <qilvilu@gmail.com>
- * An activater for HTC android phone Internet pass-through.
- */
-
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<errno.h>
-
- #include<sys/types.h>
- #include<sys/socket.h>
- #include<unistd.h>//close()
- #include<netinet/in.h>//struct sockaddr_in
- #include<arpa/inet.h>//inet_ntoa
-
- #define DEST_PORT 6000
-
-
- /* activater process*/
- void process_info( int s)
- {
- int send_num;
- int recv_num;
- char recv_buf[4];
-
- /*the first handshaking*/
- send_num = send(s, "\x00\x02\x00\x00" ,4,0);
- if (send_num < 0){
- perror ( "send" );
- exit (1);
- } else {
- printf ( "send 0x00020000 sucess!\n" );
- }
-
- recv_num = recv(s,recv_buf, sizeof (recv_buf),0);
- if (recv_num < 0){
- perror ( "recv" );
- exit (1);
- } else {
- recv_buf[recv_num]= '\0' ;
- if ( strcmp (recv_buf, "\x80\x02\x00\x00" ) != 0){
- perror ( "0x80020000 handshaking failure" );
- exit (1);
- } else {
- printf ( "recv 0x80020000 sucess!\n" );
-
- /*the second handshaking*/
- send_num = send(s, "\x00\x03\x00\x00" ,4,0);
- if (send_num < 0){
- perror ( "send" );
- exit (1);
- } else {
- printf ( "send 0x00030000 sucess!\n" );
- }
- }
- }
-
-
- recv_num = recv(s,recv_buf, sizeof (recv_buf),0);
- if (recv_num < 0){
- perror ( "recv" );
- exit (1);
- } else {
- recv_buf[recv_num]= '\0' ;
- if ( strcmp (recv_buf, "\x80\x03\x00\x00" ) != 0){
- perror ( "0x80030000 handshaking failure" );
- exit (1);
- } else {
- printf ( "recv 0x80030000 sucess!\n" );
-
- /*the third handshaking*/
- send_num = send(s, "\x00\x05\x00\x00" ,4,0);
- if (send_num < 0){
- perror ( "send" );
- exit (1);
- } else {
- printf ( "send 0x00050000 sucess!\n" );
- }
-
- }
- }
- printf ( "the activater process success!\n" );
- }
-
-
-
- int main( int argc, char *argv[])
- {
- int sock_fd;
- struct sockaddr_in addr_serv;
-
- /* check args */
- if (argc != 2)
- {
- printf ( "usage: htcnetup <IPaddress>\n" );
- exit (1);
- }
-
-
- sock_fd = socket(AF_INET,SOCK_STREAM,0);
- if (sock_fd < 0){
- perror ( "sock" );
- exit (1);
- } else {
- printf ( "sock sucessful\n" );
- }
- memset (&addr_serv,0, sizeof (addr_serv));
- addr_serv.sin_family = AF_INET;
- addr_serv.sin_port = htons(DEST_PORT);
- addr_serv.sin_addr.s_addr = inet_addr(argv[1]);
- if ( connect(sock_fd,( struct sockaddr *)&addr_serv, sizeof ( struct sockaddr)) < 0){
- perror ( "connect" );
- printf ( "connect (%d)\n" , errno );
- exit (1);
- } else {
- printf ( "connect sucessful\n" );
- }
- process_info(sock_fd);
- close(sock_fd);
- }
3.程序编译执行
gcc编译:
- gcc -o htcnetup htcnetup.c
执行:
- . /htcnetup 192.168.99.214
这里的命令参数192.168.99.214是手机的IP地址。手机ip地址可以用下列命令获取:
- grep -e "usb0" /proc/net/arp | grep -oP "\d+\.\d+\.\d+\.\d+"
执行完程序后,你会发现手机状态栏久违的internet传输图标出现了!手机的internet传输功能在linux下完美激活!
看图左上角:
三、Linux下的包转发和网关服务
手机的internet传输激活之后(或者说最好是之前),还需要设置一下Linux系统的包转发。
网关服务在 Linux 系统中非常容易实现的,两条命令即可完成:
- sudo sysctl net.ipv4.ip_forward=1
- sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # eth0 是 PC 端 Internet 出口网络接口名称
DNS 服务在 Linux 系统中也有很多实现,不过如果是访问 Internet 的话,还是使用 Iptables 转到 8.8.8.8 解决更简便:
- sudo iptables -t nat -A PREROUTING -i usb0 -p udp -m udp --dport 53 -j DNAT --to-destination 8.8.8.8:53
(此处参考:Linux 系统使用 HTC Internet pass-through)
四、shell脚本编制
总结前面步骤,首先需设置linux系统网关服务,然后在运行internet传输激活程序前,还需知道手机端的ip地址,把这些内容在一个shell脚本中实现如下:
- #!/bin/bash
-
- #htcnet.sh
- #LuoXiaoqiu <qilvilu@gmail.com>
- #An activater for HTC android phone Internet pass-through.
-
- #PC's internet interface
- pc_internet_device= "eth0"
- #phone's connection interface in pc
- phone_usb_device= "usb0"
-
- sudo sysctl -w net.ipv4.ip_forward=1
- sudo iptables -t nat -A POSTROUTING -o $pc_internet_device -j MASQUERADE
- sudo iptables -t nat -A PREROUTING -i $phone_usb_device -p udp -m udp --dport 53 -j DNAT --to-destination 8.8.8.8:53
-
- get_ip ()
- {
- arp -n | grep $phone_usb_device | awk '{print $1}'
- }
-
- #TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
- echo "waiting for IP on computer usb"
- while [[ `get_ip` < 192 ]]; do sleep 2; done
- phoneip=`get_ip`
- echo "IP adress is $phoneip "
-
- #run activater process
- . /htcnetup $phoneip
最后,手机插入电脑usb,运行htcnet.sh脚本,完美实现htc android手机internet传输,共享电脑网络吧!!
- $ . /htcnet .sh
- waiting for IP on computer usb
- IP adress is 192.168.99.241
- sock sucessful
- connect sucessful
- send 0x00020000 sucess!
- recv 0x80020000 sucess!
- send 0x00030000 sucess!
- recv 0x80030000 sucess!
- send 0x00050000 sucess!
- the activater process success!
五、加入udev规则
插入手机后还得手动运行一个命令激活,能否更方便呢?可以的,我们加入udev规则即可。
1.把htcnetup和htcnet.sh文件复制到命令搜索目录:
- sudo cp htcnetup /usr/local/bin
- sudo cp htcnet.sh /usr/local/bin
- sudo chmod a+x /usr/local/bin/htcnetup
- sudo chmod a+x /usr/local/bin/htcnet .sh
2.建立规则文件49-htcpnet.rules,内容如下:
- SUBSYSTEM== "usb" , ATTR{idVendor}== "0bb4" , ATTR{idProduct}== "0fb4" ,ACTION== "add" , RUN+= "/usr/bin/sudo -b /usr/local/bin/htcnet.sh"
把它放到/etc/udev/rules.d/中去:
- sudo cp 49-htcpnet.rules /etc/udev/rules .d/
这样插入手机,就会自动激活internet 传输了!
六、从git安装
这里简单的说一下怎么从git安装。
- git clone https: //github .com /qileilu/htcnetup .git
- cd htcnetup/
- make
- sudo make install
- 卸载的话:
- sudo make uninstall