การขยายนิยาม Provider
(ตอนนี้ขั้นตอนนี้ค่อนข้างน่าเบื่อ เราวางแผนจะเปลี่ยนวิธีทำในอนาคต)
provider ของ Whamm ถูกนิยามผ่านไฟล์ .yaml ที่อยู่ในโฟลเดอร์ providers/
ไฟล์เหล่านี้ถูกประมวลผลโดย provider_handler.rs เพื่อค้นหาเหตุการณ์ที่แมตช์ตามกฎการแมตช์ของโพรบ
เหตุผลที่มันน่าเบื่อมากคือ ไฟล์ .yaml ทั้งหมดที่ส่งให้ Whamm ถูกต่อรวมเป็นไฟล์ .yaml ใหญ่ไฟล์เดียว เพื่อให้เข้ากับไลบรารีแยกวิเคราะห์ yaml ของ Rust
ยิ่งไปกว่านั้น ไลบรารีนี้ยังมีบั๊กในการจัดการ anchor ของ yaml ทำให้สิ่งที่ต้องเขียนซ้ำซ้อนมาก
และเนื่องจากไลบรารีนี้เพิ่งถูก archive ไป เราจึงจำเป็นต้องย้ายไปใช้อะไรที่เสถียรกว่านี้จริงๆ
อย่างไรก็ตาม การขยายสิ่งที่เรามีตอนนี้ทำได้โดยแก้ไฟล์ที่พบในโฟลเดอร์ providers/
หากต้องการทดสอบการเปลี่ยนแปลง ให้ใช้ยูทิลิตี้ whamm info ซึ่งควรแสดงการเปลี่ยนแปลงให้เห็นทันที
ถ้าคุณเจอข้อผิดพลาดตอนแยกวิเคราะห์ yaml แสดงว่าการเปลี่ยนแปลงของคุณมีปัญหา
นอกจากนี้ จำไว้ว่า CLI ของ whamm รองรับการเปลี่ยนเส้นทางที่ใช้ค้นหาโฟลเดอร์ providers/
โดยใช้ตัวเลือก --defs-path
การผูกข้อมูลสำหรับ Rewriting
หากคุณต้องการรองรับการเปลี่ยนแปลง provider ของคุณในแบ็กเอนด์ rewriting ของ Whamm คุณต้องนิยามก่อนว่าสถานะจริงๆ คืออะไรในคอมไพเลอร์
ทั้งหมดนี้จัดการอยู่ใน emitter/rewriting/rules/mod.rs
ไฟล์นี้แมตช์กับกฎการแมตช์ของโพรบ (เช่น “wasm:opcode:call:before”) แล้วดูว่าสถานะของแอปพลิเคชันใดที่โพรบต้องใช้ในการทำงาน
จากนั้นจึงนิยามสถานะนี้และให้คอมไพเลอร์ดำเนินการแทรกโพรบต่อไป
นิยาม Provider + wei = เจ๋ง
ฟังก์ชันนี้ถึงขั้นให้คุณนิยาม provider ใหม่ทั้งหมดสำหรับ Whamm ได้ ทำให้คุณทำ instrumentation กับอะไรก็ได้ด้วยโค้ด Wasm!
บางทีคุณอาจอยากทำ instrumentation กับ syscall ของลินุกซ์ด้วย Wasm (ระวังตัวไว้ eBPF)
หากต้องการทำเช่นนี้ คุณต้องสร้างนิยาม provider สำหรับสิ่งนั้น แล้วสร้างสิ่งที่รองรับ wei
เจ้า wei นี้จะทำแบบเดียวกับที่เอนจิน Wasm ทำกับโมดูลมอนิเตอร์ของคุณ คือหาเมธอดที่ส่งออกที่เกี่ยวข้อง ทำเพรดิเคชัน และจำสถานะไว้ส่งต่อเมื่อเรียกคอลแบ็ก
จากนั้นมันต้องแทรกตรรกะเข้าไปในเคอร์เนลให้เรียกคอลแบ็กและส่งสถานะที่เกี่ยวข้องไปยังโมดูล Wasm ด้วย
สิ่งนี้ช่วยให้คุณทำ instrumentation กับอะไรก็ได้ด้วย Wasm ผ่านส่วนต่อประสานที่เรียบง่ายและขยายได้: wei