使用 Waydroid 过朴素反调试
在一些 Linux 发行版中,可以让 Android 系统运行在容器中。比如 docker/podman 容器可以使用 Redroid,LXC 容器可以使用 Waydroid 或 Anbox
容器技术隔离和限制了容器内对宿主系统资源的访问,但是宿主系统却可以访问容器内的资源。
那么在宿主系统中,对容器的进程进行跟踪调试,是否会被感知?做个测试验证就知道了。
测试环境
处理器:飞腾D2000 ARM64
操作系统:Fedora Workstation 39
显卡:RX580
Fedora 安装 Waydroid 方便,只需要一行命令
1 | sudo dnf install waydroid
|
然后就可以下载镜像资源、初始化系统之类的
再安装一个 golang 编译器
验证
使用 golang 写一个朴素的反调试功能,通过 TracerPid 识别调试器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package main
import (
"log"
"os"
"strconv"
"strings"
"time"
)
func main() {
for {
data, err : = os.ReadFile( "/proc/self/status" )
if err ! = nil {
panic(err)
}
lines : = strings.Split(string(data), "\n" )
for _, str : = range lines {
if strings.HasPrefix( str , "Pid:" ) {
log.Println( str )
}
if strings.HasPrefix( str , "TracerPid:" ) {
log.Println( str )
items : = strings.Split( str , "\t" )
tracePid, _ : = strconv.Atoi(items[ 1 ])
if tracePid ! = 0 {
log.Fatalf( "found debugger pid: %d" , tracePid)
}
break
}
}
time.Sleep(time.Second * 2 )
}
}
|
保存为 simple_antidebug.go
在 Fedora 中运行这个代码,然后再开一个终端运行 strace
对进行附加跟踪。
可以发现反调试功能正常工作,检测出调试器,然后退出了进程。
然后将反调试代码构建为 Android ARM64 程序,文件名 antidebug_android
1 | GOOS=android GOARCH=arm64 go build -o antidebug_android . /simple_antidebug .go
|
通过 adb 推送到 waydroid 的 /data/local/tmp
目录。
在 adb shell 中运行 antidebug_android
;同时也开一个终端进入 adb shell,对 antidebug_android
的进程进行附加跟踪。
可以观察到反调试功能正常。
最后测试在宿主系统中使用 strace
附加跟踪 waydroid 中的 antidebug_android
进程
antidebug_android
进程没有检测到调试器
结论
容器中的朴素反调试无法检测到来自宿主系统的附加跟踪,这同样适用于 redroid。
使用容器化 Android 系统可以提高分析效率,按需选择使用 Waydroid 和 Redroid,不够再定制化。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!