首先放几个地址:
经历
-
先是尝试直接拷贝过来跑,linux 下能出来 web 界面,但是不可用
-
搜索一些关键字,找到这位老哥的项目 xunlei,经过测试完美跑起来,遂想到封装 docker,扣了下关键的
cgi部分,写了Dockerfile跑 -
发现问题,检测到是
docker环境后,就按照白金VIP逻辑走,但是我并不是白金VIP,遂功能有 bug,开始调试,发现检测的是/.dockerenv文件,修改启动时删掉,还是不行,会检测/proc/self/mounts,如果/挂载的是overlayfs就认为是docker -
index.cgi是个静态编译的文件,不方便hook逻辑,遂想到chroot,跑起来完美,但是创建容器需要增加SYS_ADMIN权限,强迫症开始了探索 -
想到可以用
proot不带root权限跑,最后成功跑起来,不过有两个注意点:不能挂载/proc因为是完整映射了外面的挂载;创建容器需要带SYS_PTRACE因为proot基于这个实现 -
想到其他的方式,比如
qemu跑,可以结合proot一起用,但是感觉性能会受损(我在rpi4b上部署) -
无奈想干脆就
SYS_PTRACE算了,但是不能挂/proc感觉很心塞,所以开始写一个简单的ptrace程序来修改/proc/self/mounts的行为,然而最后发现某些场景没跑通,就暂时搁置了 -
修改二进制,改
mounts为status这样就检测不出overlayfs了,发现有二进制校验,放弃 -
IDA64开始逆向,发现其有一部分debug逻辑,即运行在/tmp/go-build文件夹下会不走二进制校验逻辑,开熏,现在的线上版就是这个
后续
-
有一些逻辑上可行但没有验证过的思路:同时修改他的内置
rsa key来绕过签名校验 -
经过某位群友测试,
unraid可以在步骤3就完美跑起来,发现unraid默认走的是btrfs,经查docker可以修改storage-driver为btrfs就可以完美绕过,不过强迫症不想改默认设置 -
经查,开发时的测试版本
2.2.3在测试的时候proot是完美的,但是最近会强制校验签名,校验过程会读取/proc/self/exe所以proot方式失效,猜测是服务端控制强制开启之类,后续可以看下hook64完善之后去解决这个问题,不过我没啥动力,毕竟现在最新的2.3.3版本用tmp方式仍可完美运行,不过截止本文,arm64版本的2.3.3还没出来