כאחד מכלי לכידת מנות הרשת הטובים בעולם, Wireshark מאפשר לך להשיג מנות נתונים ספציפיות כדי שתוכל לנתח אותן גם במצב לא מקוון וגם בזמן אמת. חשבו על האפליקציה כעל דרך לבחון מקרוב את הנתונים הזורמים ברשת שלכם, ומאפשרת לכם לתפוס בעיות ואי סדרים.

אתה יכול להשתמש בנתחים אם אתה רוצה לנתח חלק מסוים מנתוני החבילה. כפי שהשם מרמז, תהליך זה 'מנתח' את הקוד, ומאפשר לך לחתוך היבטים מסוימים שזקוקים לתשומת לבך. מדריך זה מסביר כיצד ליצור ולהשתמש בנתחים ב-Wireshark באמצעות שפת הסקריפט Lua.
לפני שתתחיל - מה שאתה צריך לדעת על מנתחים
למרות שמנתחים מציעים דרך מהירה לנתח חלקים מחבילת נתונים ב-Wireshark, הם צריכים לפעול לפי פרוטוקולים מסוימים כדי לעבוד ביעילות. פרוטוקולים אלה כוללים את הדברים הבאים:
- כל מנתח שאתה יוצר צריך להיות רשום כדי לטפל בסוג מוגדר של מטען מפרוטוקול אחר. כדי להשלים רישום זה, עליך להקצות אובייקט 'פרוטו' למנתח שלך, אותו תראה להלן.
- כאשר אתה מתקשר לנתח דרך Wireshark, הוא מקבל שלושה דברים מהאפליקציה:
- TVB Object – מאגר TVB מחבילת הנתונים.
- TreeItem Object - שורש עץ המייצג צומת בודד בעץ נתונים.
- Pinfo Object - רשומת מידע על מנות.
- אתה יכול לקרוא לנתח רק אם חבילת הנתונים שלך תואמת ל-DissectorTable שהגדרת לאובייקט ה'פרוטו' שלך.
- אתה יכול לעקוף את הדרישה הזו על ידי כפיית השימוש במנתח באמצעות הפונקציה 'פענוח בשם'. אבל גם אז, אתה יכול לאלץ את הנתח רק אם ה-DisectorTable שהגדרת לאובייקט ה'פרוטו' שלך הוא מהסוג הנכון.
הגדרת הדיסקקטור שלך באמצעות LUA
מכיוון ש-Wireshark גם כתוב בשפת התכנות C וגם משתמשת, רוב הנתחים כתובים באופן דומה ב-C. עם זאת, ייתכן שתרצה להשתמש ב-Lua. שפת סקריפטים זו פשוטה יותר מ-C ולכן נגישה יותר למצטרפים חדשים מקודדים או לאלה שפשוט רוצים ליצור מנתח באמצעות שפה קלת משקל יותר.
למרות שהקוד שלך יהיה פשוט יותר, הנתח שאתה מקבל בעת שימוש ב-Lua הוא בדרך כלל איטי יותר מזה שתיצור באמצעות C. עם זאת, אלו השלבים שיש לבצע אם ברצונך ליצור מנתח Wireshark באמצעות Lua.
כיצד אוכל למצוא את היסטוריית
שלב 1 - הגדר את Lua ב-Wireshark
תצטרך להגדיר את Lua אם לא השתמשת בו ב-Wireshark בעבר:
איפה הקובץ מארח ב- Mac
- לחץ על 'עזרה', ולאחר מכן על 'אודות Wireshark'.
- לחץ על 'תיקיות'.
- בחר אחת מהאפשרויות הבאות כדי ליצור סקריפט Lua פעיל:
- תוספים גלובליים של Lua
- תוספים אישיים של Lua
- אישי
לאחר ההפעלה, הסקריפט שלך יהיה מוכן בכל פעם שתפעיל את Wireshark. בכל פעם שאתה מבצע שינוי בסקריפט זה, אתה צריך להפעיל מחדש את Wireshark כדי לרשום את השינוי או ללחוץ על 'Ctrl + Shift + L' כדי לטעון מחדש את כל הסקריפטים של Lua שלך כדי להפוך את השינויים שלך לפעילים.
שלב 2 - השלבים הבסיסיים ליצירת הדיסקקטור שלך
אם אתה כבר מכיר את Lua, אתה יכול להשתמש בשלבים הבאים כדי ליצור סקריפט מנתח משלך שיעבוד ב-Wireshark:
- הכריז על הפרוטוקול של הנתח שלך, מה שמחייב אותך להגדיר גם שם ארוך לשימוש בעץ הפרוטוקולים וגם שם קצר שמשמש כשם מסנן התצוגה של הנתח.
- צור את שלושת השדות הבאים, עם הסוגים המתאימים להם:
- שאלה - מציג את סוג השאלה.
- תשובה - מציג את סוג התשובה.
- MessageType - מדגים אם החבילה שלך מבקשת שאלה או תשובה.
- רשום את השדות שלך כדי ש-Wireshark ידע להציג אותם. ללא שדות רשומים, תקבל הודעת 'שגיאת Lua', בדרך כלל אומרת לך שה-Tree Item ProtoField שלך לא חוקי.
- צור פונקציית נתיחה הכוללת את ה-Pinfo שהוזכר קודם לכן (המכיל נתונים על החבילה שלך) ופריט עץ (יצירת העץ שתצרף לתת-עץ). עליך גם ליצור 'מאגר' שיושב על גבי ה-TCP שלך.
- ציין גם את הפרוטוקול וגם את היציאה שעבורם Wireshark חייב להשתמש בנתח. לדוגמה, אתה יכול להגדיר את הפרוטוקול ל-'TCP' ואת מספר היציאה לאיזה תרצה להשתמש.
שלב 3 - הוסף את הדיסקקטור שלך ל-Wireshark
כרגע, הנתח שלך הוא כמו נורה ללא חשמל. זה קיים, אבל זה לא מועיל לך עד שאתה יכול להפעיל קצת כוח דרכו. במילים אחרות, הנתח שלך עדיין לא נוסף ל-Wireshark, אז עליך להוסיף אותו באופן ידני כדי להפעיל אותו באמצעות השלבים הבאים:
- לחץ על 'עזרה' ועבור לתפריט 'אודות Wireshark'.
- בחר בכרטיסייה 'תיקייה' כדי למצוא רשימה של נתיבים לקובץ Lua שלך.
- בחר 'Personal Lua Plugins.' צור ספרייה במידת הצורך.
- העתק והדבק את קובץ Lua שיצרת בספריית 'Personal Lua Plugins'. טען מחדש את Wireshark כדי להפעיל את הנתח.
מומלץ להריץ בדיקה על מנתח החדש שלך על ידי פתיחת חלק מהחבילות שלכדת. Wireshark אמור להעביר הודעה המציגה את השם הארוך שבחרת למנתח שלך, יחד עם מידע על סוג ההודעה (שאלה או תשובה) ותוצאת הבדיקה שלך.
קוד לדוגמה
אם לא יצרת מנתח בעבר (או שאתה חדש בלואה), Wireshark מציע מנתח דוגמה שימושי שתוכל לנסות:
windows 10 1809 iso
local p_multi = Proto("multi", "MultiProto");
local vs_protos = {
[2] = "mtp2",
[3] = "mtp3",
[4] = "alcap",
[5] = "h248",
[6] = "ranap",
[7] = "rnsap",
[8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = {
[2] = Dissector.get("mtp2"),
[3] = Dissector.get("mtp3"),
[4] = Dissector.get("alcap"),
[5] = Dissector.get("h248"),
[6] = Dissector.get("ranap"),
[7] = Dissector.get("rnsap"),
[8] = Dissector.get("nbap"),
[9] = Dissector.get("rrc"),
[10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
[11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}
function p_multi.dissector(buf, pkt, tree)
local subtree = tree:add(p_multi, buf(0,2))
subtree:add(f_proto, buf(0,1))
subtree:add(f_dir, buf(1,1))
local proto_id = buf(0,1):uint()
local dissector = protos[proto_id]
if dissector ~= nil then
-- Dissector was found, invoke subdissector with a new Tvb,
-- created from the current buffer (skipping first two bytes).
dissector:call(buf(2):tvb(), pkt, tree)
elseif proto_id < 2 then
subtree:add(f_text, buf(2))
-- pkt.cols.info:set(buf(2, buf:len() - 3):string())
else
-- fallback dissector that just shows the raw data.
data_dis:call(buf(2):tvb(), pkt, tree)
end
end
local wtap_encap_table = DissectorTable.get("wtap_encap")
local udp_encap_table = DissectorTable.get("udp.port")
wtap_encap_table:add(wtap.USER15, p_multi)
wtap_encap_table:add(wtap.USER12, p_multi)
udp_encap_table:add(7555, p_multi)
Postdissectors ו-Chained Disctors
אולי תרצה ללכת קצת יותר לעומק עם השימוש בנתח שלך לאחר שתשלוט ביצירת אותם ב-Lua. Wireshark מציעה שני סוגים נוספים של מנתחים - פוסט-נתחים ומנתחים משורשרים - המציעים יותר פונקציונליות.
פוסט-דיסקטור דומה מאוד לבדיקה סופית של כל הנתחים שהרצת עבור חבילה. אתה רושם אותו כדי לקבל הודעה ברגע ש-Wireshark התקשר לכל מנתח אחר שאתה רוצה שהוא ישתמש בו, ותוכל להשתמש בו כדי לסנן את העמודות 'פרוטוקול' ו'מידע'. תכונה זו שימושית במיוחד אם ברצונך לסנן מספר מנות בסשן שבו היה לך פער ארוך בין ערכות נתונים ואינך יכול לזכור כל אחת בנפרד.
שרשרת מנתחים משרתת פונקציה דומה (לפחות במונחים של סינון דרך מנתחים שהיו בשימוש בעבר) בכך שהיא נותנת לך גישה לנתונים של מנתח יחיד. היתרון העיקרי כאן הוא שהנתח המשורשר לא צריך לרוץ שוב על כל חבילה, מה שנותן לך תוצאה מבלי להכריח אותך לחכות שהמנתח המקורי יפעל שוב.
לנתח בלואה
בהתחשב בכך ש-Wireshark כבר מציע את היכולת ליצור מנתחים ב-C (השפה הטבעית שלו), ייתכן שלא תראה את הצורך ליצור אותם גם ב-Lua. ובכל זאת, מי שלא מרגיש בנוח עם C, כמו גם אלה שכבר שלטו ב-Lua, עשויים לגלות שהתסריט קל משקל של Lua מקל על יצירת הנתחים שלהם. נכון, אתה צריך להחליף זמן טעינה ארוך יותר כשאתה מפעיל את התהליך בהשוואה לנתחים מבוססי C, אבל זה מועיל לקבל את האפשרות בלי קשר.
עם זאת, אנו רוצים לשמוע ממך. באיזו תדירות אתה משתמש בנתחים ב-Wireshark? האם ניסית ליצור אותם ב-C בעבר, ואילו יתרונות לדעתך מספקת יצירת מנתחים ב-Lua? ספר לנו בקטע ההערות למטה.