0Pricing
Cyber Security Academy · บทเรียน

ไวยากรณ์กฎ YARA

สตริง เงื่อนไข และเมทาดาทา

ไวยากรณ์กฎ YARA เป็นบทเรียน Cyber Security Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cyber Security Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน

สามส่วนของกฎ

กฎ YARA มีชื่อและส่วนต่าง ๆ ได้สูงสุดสามส่วน ได้แก่ meta, strings และ condition ส่วนเงื่อนไขเป็นส่วนเดียวที่จำเป็น แต่กฎที่ใช้งานจริงมักใช้ครบทั้งสามส่วน

rule Example_Malware
{
  meta:
    author = "analyst"
    description = "Detects Example family"
  strings:
    $a = "EvilConfig"
    $b = { 6A 40 68 00 30 00 00 }
  condition:
    $a and $b
}

ส่วน meta

meta เก็บข้อมูลกำกับเชิงบรรยายที่ไม่ส่งผลต่อการจับคู่ แต่มีความสำคัญอย่างยิ่งต่อการคัดแยกเบื้องต้นและการบำรุงรักษา

  • author, date, description
  • reference — ลิงก์รายงานหรือคำแนะนำ
  • hash — ตัวอย่างที่ใช้สร้างกฎ
  • tlp — การจัดประเภทการแบ่งปัน

ค่าอาจเป็นข้อความ จำนวนเต็ม หรือค่าบูลีน ให้ถือว่าส่วนข้อมูลกำกับเป็นเอกสารประกอบ เพราะผู้รับผิดชอบคนถัดไปต้องอาศัยข้อมูลนี้

สตริงข้อความ

ส่วน strings กำหนดตัวระบุ (เริ่มต้นด้วย $) ที่ผูกกับรูปแบบ รูปแบบที่ง่ายที่สุดคือสตริงข้อความในเครื่องหมายคำพูด

ตัวปรับแต่งช่วยกำหนดรายละเอียดการจับคู่:

  • nocase — ไม่คำนึงถึงตัวพิมพ์เล็กใหญ่
  • wide — UTF-16 (สองไบต์ต่อตัวอักษร ซึ่งพบได้ทั่วไปในวินโดวส์)
  • ascii — ASCII (ค่าเริ่มต้น ใช้ร่วมกับ wide เพื่อจับคู่ได้ทั้งสองรูปแบบ)
  • fullword — จับคู่เฉพาะเมื่อเป็นคำทั้งคำ
strings:
  $s1 = "cmd.exe /c" nocase
  $s2 = "InjectDll" wide ascii
  $s3 = "admin" fullword

สตริงเลขฐานสิบหก

สำหรับรูปแบบไบนารี ให้ใช้สตริงเลขฐานสิบหกภายในวงเล็บปีกกา รูปแบบเหล่านี้จับคู่ไบต์ดิบ จึงเหมาะสำหรับรหัสคำสั่ง หมายเลขบ่งชี้รูปแบบ และโครงสร้าง

สตริงเลขฐานสิบหกรองรับความยืดหยุ่นดังนี้:

  • ?? — อักขระแทนค่าระดับครึ่งไบต์/ไบต์
  • [n-m] — การข้ามไบต์ใด ๆ จำนวนตั้งแต่ n ถึง m
  • ( A | B ) — ทางเลือกหลายแบบ
strings:
  $h1 = { 4D 5A 90 00 }
  $h2 = { E8 ?? ?? ?? ?? 83 C4 04 }
  $h3 = { 6A 00 [2-6] FF 15 ?? ?? ?? ?? }
  $h4 = { ( B8 | B9 ) 00 00 00 00 }

นิพจน์ปกติ

YARA รองรับรูปแบบนิพจน์ปกติที่คั่นด้วยเครื่องหมายทับ โดยมีตัวปรับแต่งแบบเดียวกับสตริงข้อความ ใช้นิพจน์ปกติเมื่อรูปแบบมีความแตกต่างกันแต่เป็นไปตามโครงสร้าง เช่น เครื่องหมายกำกับการตั้งค่าหรือชื่อมิวเท็กซ์ที่สร้างขึ้น

นิพจน์ปกติมีพลังมากแต่ใช้ทรัพยากรสูง ควรเลือกใช้สตริงคงที่หรือเลขฐานสิบหกเมื่อทำได้ และกำหนดจุดยึดของนิพจน์ปกติให้รัดกุมเพื่อหลีกเลี่ยงการสแกนทั้งไฟล์

strings:
  $re1 = /mutex_[a-f0-9]{8}/ nocase
  $re2 = /https?:\/\/[a-z0-9]{12,20}\.top\// ascii

ส่วนเงื่อนไข

condition คือนิพจน์บูลีนที่ใช้ตัดสินว่าตรงกันหรือไม่ อ้างอิงตัวระบุสตริงโดยตรง ส่วน $a ที่อยู่เดี่ยว ๆ จะเป็นจริงเมื่อพบสตริงนั้น

ใช้ and, or, not และวงเล็บร่วมกัน ส่วนนี้คือจุดที่คุณกำหนดตรรกะเพื่อแยกการตรวจพบตระกูลจริงออกจากการบังเอิญตรงกัน

condition:
  $a and ($b or $c) and not $benign

การนับและเซต

YARA มีตัวระบุปริมาณที่ยืดหยุ่นสำหรับเซตสตริง:

  • any of them / all of them
  • 2 of ($s*) — อย่างน้อยสองรายการจากกลุ่ม
  • #a > 3 — จำนวนการจับคู่ของ $a มากกว่า 3

สิ่งเหล่านี้ช่วยให้คุณกำหนดให้มี เช่น เครื่องหมายบ่งชี้ตระกูลห้ารายการต้องตรงกันอย่างน้อยสามรายการ โดยสร้างสมดุลระหว่างความไวกับผลบวกลวง

condition:
  3 of ($str*) and #marker >= 2

ออฟเซตและขนาดไฟล์

เงื่อนไขสามารถอ้างอิงได้ว่า ตำแหน่งใด ที่เกิดการจับคู่ รวมถึงขนาดของไฟล์:

  • $a at 0 — การจับคู่ต้องอยู่ที่ออฟเซต 0
  • $a in (0..1024) — อยู่ภายในช่วงไบต์
  • filesize — ขนาดทั้งหมด เช่น filesize < 200KB
  • uint16(0) == 0x5A4D — อ่านจำนวนเต็มที่ออฟเซต (ในที่นี้คือส่วนหัว MZ)

การยึดการจับคู่เข้ากับตำแหน่งช่วยลดผลบวกลวงได้อย่างมากและเร่งการสแกน

condition:
  uint16(0) == 0x5A4D and filesize < 500KB and $payload

โมดูล

โมดูลของ YARA เปิดเผยข้อมูลแบบมีโครงสร้างที่คำนึงถึงรูปแบบไฟล์ ทำให้เงื่อนไขใช้เหตุผลกับฟิลด์ที่แยกวิเคราะห์แล้วแทนไบต์ดิบ

  • pe — imports ของ PE, ส่วนต่าง ๆ, จุดเริ่มต้นการทำงาน, ลายเซ็น, imphash
  • hash — คำนวณ md5/sha256 ของส่วนต่าง ๆ
  • math — entropy และสถิติ
  • elf, dotnet, magic

ตัวอย่างเช่น การนำเข้า pe ช่วยให้คุณจับคู่ฟังก์ชันใน imports หรือ imphash เฉพาะได้ ซึ่งทนทานกว่าสตริงตามตัวอักษรมาก

import "pe"
condition:
  pe.imphash() == "a1b2c3d4e5f6..." and
  pe.imports("kernel32.dll", "VirtualAllocEx")

การวนซ้ำบนเซต

สำหรับตรรกะที่ซับซ้อนขึ้น YARA รองรับการวนซ้ำเหนือกลุ่มข้อมูลด้วย for คุณสามารถเขียนเงื่อนไข เช่น ออฟเซตอย่างน้อยสองค่าต้องมีคุณสมบัติตามกำหนด หรือชื่อส่วนใด ๆ ต้องตรงกับรูปแบบ

ความสามารถนี้จำเป็นอย่างยิ่งเมื่อทำงานกับข้อมูลจากโมดูล เช่น ส่วนต่าง ๆ ของ PE หรือ imports ซึ่งต้องตรวจสอบรายการที่มีความยาวเปลี่ยนแปลงได้แทนค่าค่าเดียว

import "pe"
condition:
  for any i in (0..pe.number_of_sections - 1) : (
    pe.sections[i].name == ".evil"
  )

ทั่วไป ส่วนตัว และแท็ก

คีย์เวิร์ดระดับ rule ช่วยจัดระเบียบชุดกฎ:

  • global rule — เงื่อนไขของ rule นี้จะควบคุมกฎอื่นทั้งหมดในไฟล์ (เช่น สแกนเฉพาะไฟล์ PE)
  • private rule — องค์ประกอบพื้นฐานที่นำกลับมาใช้ได้ ไม่รายงานด้วยตัวเอง แต่ rule อื่นอ้างอิงได้
  • แท็กหลังชื่อ rule ใช้จัดประเภทการตรวจพบ (เช่น ใช้กรองผลลัพธ์)
global private rule IsPE { condition: uint16(0) == 0x5A4D }

rule Dropper : trojan dropper {
  strings: $a = "drop_payload"
  condition: $a
}

ตรวจสอบด่วน

วิเคราะห์ความทนทานของเงื่อนไข

สรุป

ไวยากรณ์ rule ของ YARA ในภาพรวม:

  • rule หนึ่งรายการ = meta + strings + condition
  • สตริงข้อความพร้อมตัวปรับแต่งที่ไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ แบบกว้าง ASCII และเต็มคำ
  • สตริงเลขฐานสิบหกพร้อมไวลด์การ์ด ?? การกระโดด [n-m] และทางเลือก
  • นิพจน์ปกติสำหรับรูปแบบตัวแปรที่มีโครงสร้าง (ใช้เท่าที่จำเป็น)
  • condition รวมสตริงด้วย and/or/not
  • ตัวระบุปริมาณ: any/all/N of และการนับด้วย #a
  • การยึดตำแหน่ง: at, in, filesize และการอ่านค่าด้วย uint
  • โมดูล (พีอี, แฮช, คณิตศาสตร์) ใช้จับคู่ข้อมูลแบบมีโครงสร้างและ imphash
  • global, private และแท็กใช้จัดระเบียบชุด rule

ถัดไป: การค้นหาเชิงปฏิบัติด้วยสตริงและเลขฐานสิบหก

คำถามที่พบบ่อย

บทเรียน “ไวยากรณ์กฎ YARA” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ไวยากรณ์กฎ YARA” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cyber Security Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ไวยากรณ์กฎ YARA”

สตริง เงื่อนไข และเมทาดาทา คุณปฏิบัติ Cyber Security Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cyber Security Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cyber Security Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ไวยากรณ์กฎ YARA” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Cyber Security Academy นี้ได้ไหม

ได้ บทเรียน Cyber Security Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. YARA ใช้ทำอะไร
  2. ไวยากรณ์กฎ YARA
  3. การล่าภัยคุกคามด้วยสตริงและเลขฐานสิบหก
  4. การขยายขนาดและทำให้การสแกนเป็นอัตโนมัติ
← กลับไปที่ Cyber Security Academy