https://www.cnblogs.com/revercc/p/17803876.html Az eBPF uprobe programja és a kernel/events/uprobe.c közötti kapcsolat lényegében az, hogy az eBPF mechanizmus újrahasználja a kernel natív uprobe infrastruktúráját a felhasználói állapotfüggvények hook funkciójának megvalósítására. Konkrétan az eBPF uprobe-ja a kernel uprobe keretrendszer "alkalmazása", amely egy belső kernel hívásláncon és adatstruktúrán keresztül kapcsolódik össze. Magkapcsolat: az eBPF a kernel uprobe keretrendszerre támaszkodik a hookok megvalósításához A kernel uprobe.c a Linux kernel natív felhasználó-állapotú próbáját (uprobe) a magimplementációja, és felelős a következőkért: Kezelje a felhasználó-állam próbák regisztrációját és törlését (pl. register_uprobe(), unregister_uprobe()). Kezeli a megszakítópont behelyezését (megszakítási pont utasításokat ír a célfüggvény címére, például az x86 int3-ára). Breakpoint trigger események rögzítése (beragadnak a kernel állapotfeldolgozásban, amikor egy programot egy megszakítási ponthoz futtatnak). Előre regisztrált visszahívási függvényt (azaz hook logicát) hívunk. Az eBPF uprobe program (például a hook libc.so példája) lényegében egy uprobe alapú eBPF visszahívási függvényt regisztrál a kernelrel az eBPF betöltőn keresztül (pl. bcc, libbpf), amely teljes mértékben az uprobe.c infrastruktúrájára támaszkodik. Specifikus híváslánc: az eBPF programból az uprobe.c-be terjedő áramlás Amikor egy uprobe-ot regisztrálsz egy eBPF töltőn keresztül (például a bcc attach_uprobe-én), az alapul szolgáló folyamat a következő: Az eBPF töltő regisztrációs kérést indít A betöltő (például a bcc Python kódja) rendszerhíváson keresztül (például bpf() vagy perf_event_open()) közli a kernelnek, hogy "szeretnék egy eBPF horgot akasztani a libc.so openat funkciójára", és átadja az eBPF program bájtkódját. Kernel ellenőrzés és eBPF programok előkészítése Az eBPF kernel ellenőrző ellenőrzi a program legitimitását, hogy ne veszélyeztesse a kernel biztonságát. Miután áthaladt, töltsd be az eBPF programot a kernelbe, és legyen egy "eBPF visszahívási funkció" (azaz az általad írt uprobe_openat logikát). Az uprobe.c regisztrációs interfész kernelének újrafelhasználása meghívja az uprobe.c register_uprobe() függvényét, regisztrál egy "natív uprobet", és az eBPF visszahívási függvényt használja az uprobe "trigger kezelőjeként". A kulcs itt az: az eBPF uprobe-jának lényege, hogy egy eBPF típusú visszahívást kötjön a mag natív uprobe-jához. Uprobe.c egy megszakítópontot helyez be, és várja, hogy elindítsák az Uprobe.c egy megszakítópont-utasítást (például x86 int3-át) ír a felhasználó állapotmemóriájába a regisztrált célcím alapján (az openat címe libc.so-ben), és rögzíti a megszakítópont eredeti utasítását (a végrehajtás folytatásához a trigger után). A függvényhívások megszakítási pontokat indítanak el, uprobe.c eBPF visszahívásokat hív Amikor az alkalmazás libc.so:openat hívást hív, a megszakítási pont utasítás végrehajtása csapdát indít el, és a kernel állapotba esik. Ekkor: A mag az uprobe.c formátumban a uprobe_handler() függvényt (kernel feldolgozási logikát) hívja. uprobe_handler() ellenőrzi a megszakítási ponthoz tartozó regisztrációs adatokat, és megállapítja, hogy az eBPF visszahíváshoz van kötve, így hívja az eBPF programot (azaz azt a uprobe_openat, amit írtál). Az eBPF program végrehajtása után (pl. paramétergyűjtés, ringbuf-ra írás), a uprobe_handler() visszaállítja az eredeti utasítást, és lehetővé teszi a program végrehajtását. Összefoglaló: A kettő kapcsolata kernel/events/uprobe.c az alapvető infrastruktúra, amely alapvető funkciókat biztosít, mint például a felhasználói állapot megszakítási pontok behelyezése, rögzítése és helyreállítása, és az összes felhasználói állapot próbának (beleértve az eBPF uprobe-ot, gdb hibakeresést stb.) alapja. Az eBPF uprobe programja egy felsőrétegű alkalmazás, amely ezen az infrastruktúrán alapul, amely regisztrálja az eBPF visszahívási funkciókat, és lehetővé teszi a mag számára, hogy eBPF logikát hajtson végre, amikor az uprobe aktiválódik, így hatékony felhasználói állapot függvénykövetést ér el. Röviden: az eBPF esetén az uprobe a "felhasználó", az uprobe.c pedig a "szolgáltató", az előbbi pedig az utóbbira támaszkodik a hookok regisztrációjának, indításának és végrehajtásának befejezéséhez. |