最近有大佬在 android 上實踐 ebpf 成功
前有 evilpan 大佬:https://bbs.pediy.com/thread-271043.htm
后有 weishu 大佬:https://mp.weixin.qq.com/s/mul4n5D3nXThjxuHV7GpMA
當然還有其他隱藏的大佬啦,就不一一列舉啦
遂 android-ebpf 大火
兩位大佬的方案也很有代表性,一個是 androdeb + 自編內核 + 內核移植 + 內核4.19(文章中看的),一個是 androdeb + 內核5.10(pixel 6)
目前來看,androdeb + 高版本內核 方案可以更快上手,花錢投資個新設備就好了,而且 weishu 大佬也已經手把手把工具都準備好了
故本次就是對 weishu 大佬視頻號直播的 "搭建 Android eBPF 環境" 的文字實踐 + 反調試樣本測試
eBPF 是啥
來自官方的說法:https://ebpf.io/what-is-ebpf
來自大佬的總結:https://mp.weixin.qq.com/s/eI61wqcWh-_x5FYkeN3BOw
失敗嘗試
魅族18 內核版本5.4
雖說環境編譯成功了,但體驗腦殼疼
opensnoop 沒有 path
execsnoop pwd 命令監控不到,長命令被截斷
環境準備
PC環境:macOS
小米12 內核版本5.10.43
magisk 提供 root
androdeb 連接方式選取的也是 ssh 方式,故安裝 SSH for Magisk 模塊提供 ssh 功能
手機最好也科學上網一下吧,要 git 拉一些東西
環境準備 over,開干
確保手機 ssh 已開啟,先去 adb shell 中 ps 一下
ps -ef|grep sshd
沒問題的話,就查看下 PC 上的 ssh key
cat ~/.ssh/id_rsa.pub
然后把 key 粘貼到手機 authorized_keys 文件中,再改下權限
su
cd /data/ssh/root/.ssh/
/data/adb/magisk/busybox vi authorized_keys
chmod 600 authorized_keys
再看下手機 ip(因為是 ssh 連接,故手機和 PC 在同一局域網下)
ifconfig |grep addr
在 PC 上測試下 ssh 是否可以成功連接
ssh root@172.24.64.47
沒問題的話,直接開搞準備好的 androdeb 環境了(weishu大佬用rust重寫了叫eadb)
sudo chmod 777 ./eadb-darwin
./eadb-darwin --ssh root@172.24.64.47 prepare -a androdeb-fs.tgz
等待完成后,進 androdeb shell, 開始編譯 bcc
./eadb-darwin --ssh root@172.24.64.47 shell
git clone https://github.com/tiann/bcc.git --depth=1
cd bcc && mkdir build && cd build
cmake ..
make -j8 && make install
等待成功后,就有各種工具可以用了
root@localhost:/usr/share/bcc/tools# ls
argdist btrfsdist dbslower exitsnoop gethostlatency klockstat nfsdist perlflow pythonstat runqslower syncsnoop tcpdrop tplist zfsslower
bashreadline btrfsslower dbstat ext4dist hardirqs kvmexit nfsslower perlstat readahead shmsnoop syscount tcplife trace
bindsnoop cachestat dcsnoop ext4slower inject lib nodegc phpcalls reset-trace slabratetop tclcalls tcpretrans ttysnoop
biolatency cachetop dcstat filelife javacalls llcstat nodestat phpflow rubycalls sofdsnoop tclflow tcprtt vfscount
biolatpcts capable deadlock fileslower javaflow mdflush offcputime phpstat rubyflow softirqs tclobjnew tcpstates vfsstat
biopattern cobjnew deadlock.c filetop javagc memleak offwaketime pidpersec rubygc solisten tclstat tcpsubnet virtiostat
biosnoop compactsnoop dirtop funccount javaobjnew mountsnoop old profile rubyobjnew sslsniff tcpaccept tcpsynbl wakeuptime
biotop cpudist doc funcinterval javastat mysqld_qslower oomkill pythoncalls rubystat stackcount tcpcong tcptop xfsdist
bitesize cpuunclaimed drsnoop funclatency javathreads netqtop opensnoop pythonflow runqlat statsnoop tcpconnect tcptracer xfsslower
bpflist criticalstat execsnoop funcslower killsnoop netqtop.c perlcalls pythongc runqlen swapin tcpconnlat threadsnoop zfsdist
??????得益于 weishu 大佬的手把手環境工具包,androdeb + 內核5.10 的 eBPF 環境搭建起來就是這么簡單
反調試樣本實操
DetectFrida.apk 核心邏輯: https://github.com/kumar-rahul/detectfridalib/blob/HEAD/app/src/main/c/native-lib.c
哎??,這里我直接就拿山佬的實踐來說,至于為啥后面再說
[圖片上傳失敗...(image-7c9209-1655952331083)]
[圖片上傳失敗...(image-8edb3e-1655952331083)]
還少了一個關鍵的
[圖片上傳失敗...(image-60018f-1655952331083)]
手寫 trace 干它
trace 'do_readlinkat "%s", arg2@user' --uid 10229
再來一次
[圖片上傳失敗...(image-c9aa52-1655952331083)]
??????可以了,差不多了,這樣分析已經為后續對抗 bypass 提供了很大的幫助
當然了,上述只是最基礎的操作,后續還得繼續深入探索學習,解鎖更多頂級玩法
還有就是,其實我的 Xiaomi 12 還沒搞好,在等解 BL 鎖,至于秒解,我不想花錢,所以就拿山佬的實踐來借花獻佛,真是個好主意啊,哈哈??
總結
基于內核級別的監控,讓應用中所有的加固/隱藏/內聯匯編等防御措施形同虛設,而且可以在應用啟動的初期進行觀察,讓應用的一切行為在我們眼中無所遁形
這是真真正正的降維打擊,內核級的探測能力提供了無限可能,堪稱:屠龍技
最后
文中用的工具和軟件,我已經打包整理好了
https://mp.weixin.qq.com/s/h_ixxr1WZ8VqYt-zMrwSDA
聊天界面回復 "ebpf" 即可
再次感謝先行者大佬們的無私奉獻,和為技術發展所做的貢獻??????