惊呆了:AI改了三个字节:修好了一个跑不起来的adb
我在一个老版本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,AI很快诊断出是因为adb在创建server时使用了AF_INET6(IPv6),而我的ubuntu不支持IPv6。
为了解决这个问题,它首先查看了adb的help信息,看能不能设置只监听IPv4,没成功。
接下来它尝试写个动态库interceptor.so,动态库中hook系统函数socket和bind,强制使用IPv4,以LD_PRELOAD=./interceptor.so adb方式运行,这个思路是对的,但是用起来有点麻烦,而且要在我的ubuntu上下载Android交叉编译工具链,被我阻止了。
我以为它会就此放弃,哪想到它放大招了。
它直接反汇编了adb可执行程序,找到定义sockaddr的地方、调用函数socket和bind的地方:
| 文件偏移 | 指令 | 原始值 | 修改值 | 效果 |
|---|---|---|---|---|
0xfdcea | movw $0xa,0x10(%rsp) | 0x0a | 0x02 | sockaddr family: AF_INET6→AF_INET |
0xfdd05 | mov $0xa,%edi | 0x0a | 0x02 | socket() domain: AF_INET6→AF_INET |
0xfdd46 | mov $0x1c,%edx | 0x1c | 0x10 | bind() addrlen: 28→16 |
然后通过下面的脚本,改了我的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上还真能用了!
-
07.22
怪物猎人旅人新手入门及全流程探索攻略
-
07.22
天天拼词王第423关猪脚饭怎么过-第423关猪脚饭找出32个常用字图文攻略
-
07.22
烟雨江湖风神腿法烟雨江湖高阶腿法技能详解和实战应用
-
07.22
烟雨江湖魔刀烟雨江湖魔刀技能效果:获取方式与实战搭配详解
-
07.22
《天天拼词王》第429关孜然肉串怎么过 - 第429关孜然肉串找出26个常用字图文攻略
-
07.22
洛克王国世界S3赛季新增精灵全面解析洛克王国世界S3赛季新区域精灵图鉴
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏