adb forward 不是随随便便的命令

查看 26|回复 5
作者:wp00000008   
假设开发电脑192.168.0.100(简称HostA,IpA),模拟器或手机192.168.0.200(简称HostB,IpB)。
如果HostA和HostB之间网络互通,即是可以相互网络访问(相互ping一下试试),那么adb forward没有任何用处,可以不需要这个了。网络都是通的,还转发个什么劲。
正常情况下,HostB与HostA网络互通是很容易做到,比如HostA做一下网络桥接,大家都在一个局域网,快快乐乐的互通,不需要forward。
但是有些模拟器,看起来桥接了,但是本质上是NAT,即HostB被藏起来了,典型情况是HostB能联通HostA(或不能),HostA不能联通HostB,除了adb调试。
我关注这个是因为我的HostA是一台虚拟机,HostB上能用的模拟器只有逍遥模拟器(x64),其它的都无法启动。
还有就是我需要arm模拟器,目前只找到了vmos云手机,但是除了adb调试端口之外,啥端口都不开。
adb forward能解决以上问题。
adb能联通的原因是HostB的adbd(注意这里是adbd,不是adb,这个是类似于systemd之类的东西)关注到了localhost的adb端口(比如21503),并映射到localhost,这个动作不是HostA做的,是HostB做的,但是由于HostB通过NAT连接网络,算是AB两者一体,外在表现就是HostA关注了21503。
这里所说的关注,意思是从HostB上面通过netstat -an看不到21503在监听,那个是被动动作的(systemd尿性),需要的时候能有,不需要的时候看不出来。
比如看起来HostB没有监听21503,但是从HostA执行 adb connect localhost:21503 能顺利的连接上。
假设从HostA通过adb connect localhost:21503 连接上了HostB的adbd,可以从HostA通过adb调试HostB上的app,但是从HostA连接HostB上的IDA debug server(假设监听23946端口)做so调试或者连接frida server(假设监听6666端口)做脚本调试。 怎么办?端口不通,无法连接。
这个时候就需要adb forward。
假设需要从HostA的ida连接HostB的ida debug server调试so,看看情况如何。
第一步,HostA执行adb connect localhost:21503,此时从HostA到HostB建立了adb连接。
第二步,HostA执行 adb forward tcp:23946 tcp:23946。重点重点重点:意思是HostA监听23946端口,并将HostA的23946端口进来的数据转发给adb device(localhost:21503),并告诉HostB的adbd,23946端口的数据交给交给本机的23946端口,这样从HostA(ida)->HostA:23946(adb)->HostB:adbd:21503>HostB:23946链路就通了。注意:此时HostB的ida debug server要先运行起来,监听23946端口
第三步,从HostA上启动ida,打开so,连接HostB,attach进程进行调试
frida同理。

端口, 模拟器

xixicoco   

终于有人详细解释了
vaycore   

解释的很详细。我个人的经常使用场景是:手机中的服务监听的 127.0.0.1 地址,就可以使用 forward 转发出来,方便连接(例如文中提到的 frida);如果服务监听的 0.0.0.0 地址,则直接连接即可。
isolands   

感谢分享,很详细
wanliu   

好像还是第一个人说这个的
CodingIndeed   

涨知识了,之前只是了解到有这个用法
您需要登录后才可以回帖 登录 | 立即注册

返回顶部