加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

利用ADB 协议建立PC与手机端本地unix套接字的连接

发布时间:2020-12-15 16:14:48 所属栏目:安全 来源:网络整理
导读:设置环境变量 export ADB_TRACE=adb 可以取的值包括 all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp,services,auth,fdevent,shell 取多个值用空格分割 但是adb 内部限制了输出的字数,导致最重要的writex输出(即最总发送给adb server的数据

设置环境变量
export ADB_TRACE=adb
可以取的值包括 all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp,services,auth,fdevent,shell
取多个值用空格分割

但是adb 内部限制了输出的字数,导致最重要的writex输出(即最总发送给adb server的数据)长度只有16字节。为此,必须修改代码:
system/core/adb_utils.cpp文件,找到

std::string dump_hex(const void* data,size_t byte_count) {
-    byte_count = std::min(byte_count,size_t(16));
+    //byte_count = std::min(byte_count,size_t(16));

重新编译adb
make adb

adb发送的协议是 4字节16进制数+命令。
比如 adb devices
发送的命令就是 000chost:devices
返回: ‘OKAY0010d9dbe061tdevicen’

adb shell 命令:
需要先发送: 0012host:transport-any
收到 ‘OKAY’
继续发送’0029shell:lsncat /proc/net/unix’
收到 ‘OKAYacct init.miui.post_boot.sh oem nbin init.miui.rc persist nbt_firmware init.miui8.rc proc nbugreports init.msm.usb.configfs.rc property_contexts ncache init.offline.log.rc res ncharger init.qcom.class_core.sh root nconfig init.qcom.early_boot.sh sbin ncust init.qcom.factory.rc sdcard …’
可以看到,shell: 后跟命令,而且可以用’n’发送多个命令。返回值是OKAY后加结果。
在实际中,adb shell ls 这样的命令,会发送”shell,v2,TERM=xterm:ls” 这样的字符串,这样返回值中就会带有xterm的很多标志字符串。
如果你只是取数据的话,用”shell:< command >”的方法是最简单的。

adb forward tcp:7843 localabstract:unix_name
将手机上的一个unix套接字foward到端口7843上。
发送 ‘host:forward:tcp:7843;localabstract:unix_name’
将得到 OKAY
随后,你就可以访问localhost:7843了。
localabstract是用在抽象套接字上的,在手机上,用adb shell cat /proc/net/unix 凡是名字前面有’@’的都是抽象套接字
抽象套接字不需要创建一个文件节点,所以免去了linux权限。创建抽象套接字,只需要在套接字名字的第一个字符指定为 ‘’即可。

如何在不指定本地端口号的情况下,直接连接远程的unix socket呢?
这个方法是和shell的方法类似,
需要先发送: 0012host:transport-any
收到 ‘OKAY’
继续发送’003blocalabstract:…..’
收到’OKAY’后, 不要关闭socket,继续发送消息即可

用python实现的模拟发送

import socket
import time

unix_name='you_name'

def query(s,msgs):
    for msg in msgs:
        pro_msg = "%04x%s"%(len(msg),msg)
        print("send:",pro_msg)
        s.send(pro_msg)
        time.sleep(0.2)
        reply = s.recv(1024*1024)
        print('recv:',reply)

def adb_query(*msgs):
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    s.connect((socket.gethostbyname('localhost'),5037))
    query(s,msgs)
    s.close()

def forward(unixname,func):
    s = socket.socket(socket.AF_INET,5037))
    msg = "localabstract:%s" % unixname
    query(s,('host:transport-any',msg))
    func(s)
    s.close()


def http_request(s):
    s.send('GET / HTTP/1.1rnrn')
    res = s.recv(1024)
    print(res)


adb_query('host:devices')

adb_query('host:transport-any','shell:lsncat /proc/net/unix')

forward(unix_name,http_request)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读