Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需手机命令

笔记本/便携移动设备,手机平板等软硬件
头像
qileilu
帖子: 375
注册时间: 2007-08-26 9:06
来自: 长沙
联系:

Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需手机命令

#1

帖子 qileilu » 2013-08-20 15:26

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 <mss 1460,nop,wscale 8,nop,nop,sackOK>
        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 <mss 1460,nop,nop,sackOK,nop,wscale 1>
        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.程序代码
详见:https://github.com/qileilu/htcnetup/blo ... htcnetup.c

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下完美激活!
看图左上角:
1376977645839.png
1376977645839.png (170 KiB) 查看 17040 次
三、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 <[email protected]>
#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
(部分参考:Cannot connect HTC Android phone via Internet Pass through

最后,手机插入电脑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

原文地址:Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)
上次由 qileilu 在 2013-08-23 13:40,总共编辑 2 次。
Dell M1210

双引导—>
grub2: 电源键启动
Chameleon V2: MediaDirect启动。

五系统—>
ArchLinux sda3,6,7,8,9 ext3,4
Win7 sda1,5,sdb5 ntfs
Mac OS X 10.5.7 Leopard sda2 hfs+
Ubuntu sda10 ext4
win2003 PE sdb1 fat32
swap sda11
头像
schspa
帖子: 49
注册时间: 2012-02-06 14:54
联系:

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#2

帖子 schspa » 2013-08-20 23:00

好帖,研究研究,让咱的联想手机也能用上。。

来自 Lenovo A830 上的 Tapatalk 4
得意不忘形,失意不变形。。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#3

帖子 eexpress » 2013-08-23 11:21

这注意不错。

我写了一个简单的。至少自动等待,不要输入ip。都懒得检测返回,反正正常。可以加入udev规则中调用。

代码: 全选

#!/usr/bin/perl  
  
use IO::Socket::INET;  
#6000/tcp open  X11
do{
open IN,"/proc/net/arp"; @arp=<IN>; close IN;
@d=grep ! /00:00:00:00:00:00/,grep /0x2.*usb0/,@arp;
} until($d[0]);
$_=$d[0]; s/\ .*//; chomp; print "sock:\t$_\n";

my $sock = IO::Socket::INET->new(PeerAddr => $_ , PeerPort => 6000, Type=>SOCK_STREAM, Proto=>"tcp") or die "Can not create socket connect.$@\n";  
print $sock "\x00\x02\x00\x00";
print $sock "\x00\x03\x00\x00";
print $sock "\x00\x05\x00\x00";
close $sock;  
● 鸣学
头像
qileilu
帖子: 375
注册时间: 2007-08-26 9:06
来自: 长沙
联系:

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#5

帖子 qileilu » 2013-08-23 13:23

eexpress 写了:这注意不错。

我写了一个简单的。至少自动等待,不要输入ip。都懒得检测返回,反正正常。可以加入udev规则中调用。

代码: 全选

#!/usr/bin/perl  
  
use IO::Socket::INET;  
#6000/tcp open  X11
do{
open IN,"/proc/net/arp"; @arp=<IN>; close IN;
@d=grep ! /00:00:00:00:00:00/,grep /0x2.*usb0/,@arp;
} until($d[0]);
$_=$d[0]; s/\ .*//; chomp; print "sock:\t$_\n";

my $sock = IO::Socket::INET->new(PeerAddr => $_ , PeerPort => 6000, Type=>SOCK_STREAM, Proto=>"tcp") or die "Can not create socket connect.$@\n";  
print $sock "\x00\x02\x00\x00";
print $sock "\x00\x03\x00\x00";
print $sock "\x00\x05\x00\x00";
close $sock;  
:em20 :em02
神啊!perl语言看不懂了,好强大啊!
就学过c语言入门的我上面那段c程序编了一周了,早知道直接告诉你好了,可以好好轻松下了。
Dell M1210

双引导—>
grub2: 电源键启动
Chameleon V2: MediaDirect启动。

五系统—>
ArchLinux sda3,6,7,8,9 ext3,4
Win7 sda1,5,sdb5 ntfs
Mac OS X 10.5.7 Leopard sda2 hfs+
Ubuntu sda10 ext4
win2003 PE sdb1 fat32
swap sda11
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#6

帖子 eexpress » 2013-08-23 14:08

你这么好的方法。用c实现一个,显得正式多了嘛。 :em02

:em50 :em50
● 鸣学
头像
qileilu
帖子: 375
注册时间: 2007-08-26 9:06
来自: 长沙
联系:

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#7

帖子 qileilu » 2013-08-23 14:20

:em06 c就正式么?你10行就能搞定的程序,c写了100多行啊~!
:em04 04年毕业后没写过任何程序了啊,最多改改shell脚本。真的是写一行,google一遍函数,唉。。。
Dell M1210

双引导—>
grub2: 电源键启动
Chameleon V2: MediaDirect启动。

五系统—>
ArchLinux sda3,6,7,8,9 ext3,4
Win7 sda1,5,sdb5 ntfs
Mac OS X 10.5.7 Leopard sda2 hfs+
Ubuntu sda10 ext4
win2003 PE sdb1 fat32
swap sda11
shao1xiaodi
帖子: 2
注册时间: 2013-08-26 4:53

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#8

帖子 shao1xiaodi » 2013-08-26 5:00

:em11 :em11 :em11 :em11 :em11 :em11 :em11 都很厉害了!不懂路过。
头像
momova
帖子: 3381
注册时间: 2007-07-11 21:43
系统: archlinux
来自: 东江边

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#9

帖子 momova » 2013-08-26 16:37

虽然看不懂是什么,但是还是觉得好厉害的样子
我来了,我看见了,我征服了!
求勾搭,不管饭。
头像
youzhiyili
帖子: 2422
注册时间: 2012-03-22 20:42
系统: ubuntu22.04

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#10

帖子 youzhiyili » 2013-08-26 17:40

码盲看不懂,所以 :em11 :em06
@自由建客 @qy117121 @枫叶饭团 @cikekid @YeLee @jtshs256 @eexpress @ljj_jjl2008 @zhw2101024 @TeliuTe @月下叹逍遥 @leeaman @懒蜗牛Gentoo @灰色小狼 @photor @adagio @JiangHui @phoenixlzx @oneleaf
头像
qileilu
帖子: 375
注册时间: 2007-08-26 9:06
来自: 长沙
联系:

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#11

帖子 qileilu » 2013-08-28 15:12

youzhiyili 写了:码盲看不懂,所以 :em11 :em06
linux要大众化必须要进入码盲时代,我算是码盲一个啊! :em11
Dell M1210

双引导—>
grub2: 电源键启动
Chameleon V2: MediaDirect启动。

五系统—>
ArchLinux sda3,6,7,8,9 ext3,4
Win7 sda1,5,sdb5 ntfs
Mac OS X 10.5.7 Leopard sda2 hfs+
Ubuntu sda10 ext4
win2003 PE sdb1 fat32
swap sda11
头像
fuhaoyun
帖子: 526
注册时间: 2009-05-08 14:12
来自: http://weibo.com/u/2201287863

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#12

帖子 fuhaoyun » 2013-09-09 17:58

楼主牛 :em11

只用Ubuntu/Unity:安全、高效、自由、简洁!
http://weibo.com/u/2201287863
----------------------------------------------------
用了4年Ubuntu,发现离开windows也可以活得很好
看球赛、炒股、聊天、office等等都不算问题了
一切都是习惯,困难解决了就好

elv1
帖子: 1
注册时间: 2013-12-11 8:18
系统: linux

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#13

帖子 elv1 » 2013-12-11 8:21

很想看看大神写的那段c代码,不过可惜的是已经无法访问了
头像
qileilu
帖子: 375
注册时间: 2007-08-26 9:06
来自: 长沙
联系:

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#14

帖子 qileilu » 2013-12-11 12:32

elv1 写了:很想看看大神写的那段c代码,不过可惜的是已经无法访问了
可以啊,你八成是被墙了吧,你也可以git克隆下来看啊,要不你去我百度空间看也行http://hi.baidu.com/qileilu/item/d2317d ... 0fb98a1af2
Dell M1210

双引导—>
grub2: 电源键启动
Chameleon V2: MediaDirect启动。

五系统—>
ArchLinux sda3,6,7,8,9 ext3,4
Win7 sda1,5,sdb5 ntfs
Mac OS X 10.5.7 Leopard sda2 hfs+
Ubuntu sda10 ext4
win2003 PE sdb1 fat32
swap sda11
loszer
帖子: 6
注册时间: 2014-07-24 0:09
系统: window&ubuntu

Re: Linux下完美驱动HTC Android手机的Internet传输(通过USB共享电脑网络)无需root,无需

#15

帖子 loszer » 2014-07-25 23:07

好强。。。。不能直视了。。。这个方法对于手机是通用的么 我的是小米
回复