Hooking

בתכנות, Hooking היא שיטה המשמשת לשינוי ההתנהגות של מערכת ההפעלה, תוכנה או קוד מכונה באמצעות יירוט קריאה לשגרה או הודעה המועברת בין תוכניות. קטע הקוד האחראי ליירוט נקרא Hook. 

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

טכניקות

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

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

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

קישורים חיצוניים
 Hooks, Microsoft Developer Network Website

תכנות
תוכנות זדוניות