在旧版Ubuntu系统上运行定制版adb时,遭遇了严重故障。详细的错误提示信息如下:

$ adb -host connect 30.207.94.56:61101* daemon not running. starting it now on port 6037 *error: could not install *smartsocket* listener: Address family not supported by protocolADB server didn't ACK* failed to start daemon *error: cannot connect to daemon
将错误信息交给AI后,它几乎立即做出了诊断——问题的根源在于adb在创建服务器时默认使用了AF_INET6(IPv6协议族),而当前Ubuntu环境根本不支持IPv6。
AI首先查阅了adb的help文档,试图寻找能够强制仅使用IPv4的参数,但最终并未找到。
接下来,AI尝试编写一个名为interceptor.so的动态库,通过hook socket和bind函数强制使用IPv4,并采用LD_PRELOAD=./interceptor.so adb的方式加载。这一思路虽然正确,但实施起来较为繁琐,还需要下载Android交叉编译工具链,因此该方案很快被舍弃。
原以为AI会就此罢手,没想到它直接祭出了一个奇招。
AI直接对adb可执行文件进行了反汇编,精准定位到了定义sockaddr结构以及调用socket和bind函数的位置:
| 文件偏移地址 | 汇编指令 | 原始字节 | 修改后字节 | 修改说明 |
|---|---|---|---|---|
0xfdcea | movw $0xa,0x10(%rsp) | 0x0a | 0x02 | sockaddr地址族:AF_INET6改为AF_INET(2) |
0xfdd05 | mov $0xa,%edi | 0x0a | 0x02 | socket()中domain参数:AF_INET6改为AF_INET |
0xfdd46 | mov $0x1c,%edx | 0x1c | 0x10 | bind()中addrlen:从28字节改为16字节 |
接着,AI编写了一段Python脚本,直接对adb的二进制文件进行了修改:
with open('~/adb', 'rb') as f:data = bytearray(f.read())data[0xfdcea] = 0x02 # AF_INET← sockaddr family: AF_INET6(10) → AF_INET(2)data[0xfdd05] = 0x02 # AF_INET← socket() domain: AF_INET6(10) → AF_INET(2)data[0xfdd46] = 0x10 # sizeof(sockaddr_in) ← bind() addrlen: 28 → 16with open('~/adb', 'wb') as f:f.write(data)
看到这一操作,令人惊叹——完全没想到还能采用这种方式解决问题。更重要的是,修改后的adb在这个Ubuntu系统上竟然成功运行了!
