כשאני מצרף את OllyDbg או ImmunityDebugger לתהליך, זה מפסיק את הביצוע באופן אוטומטי. אני מתחבר לשירות במצב משתמש הפועל כ- SYSTEM וצריך רק לתפוס חריגים, כך שזה לא אידיאלי. האם יש דרך להשבית את התנהגות break-on-attach?
כשאני מצרף את OllyDbg או ImmunityDebugger לתהליך, זה מפסיק את הביצוע באופן אוטומטי. אני מתחבר לשירות במצב משתמש הפועל כ- SYSTEM וצריך רק לתפוס חריגים, כך שזה לא אידיאלי. האם יש דרך להשבית את התנהגות break-on-attach?
ההפסקה בנספח נובעת מהפונקציות ntdll
DbgUiRemoteBreakin
ו- DbgBreakPoint
. אם תבדוק את הפונקציה kernel32
DebugActiveProcess
שנקראה על ידי הבאגים, OllyDbg או ImmunityDebugger, תראה שיחה לפונקציה CreateRemoteThread
, CreateRemoteThreadEx פונקציה
, או ZwCreateThreadEx
תלוי במערכת ההפעלה שלך.
אז אני מניח שדרך אחת לעקוף שבירה היא:
DbgUiIssueRemoteBreakin
ואתר את השיחה לפונקציה היוצרת את השרשור המרוחק. lpStartAddress
פרמטר במקרה של CreateRemoteThread
/ CreateRemoteThreadEx
to DbgBreakPoint
+1 RETN 0xC3
יצרתי OllyDbg v1.10 תוסף אשר NOP
הוא ה- INT3
ב- DbgBreakPoint
בתהליך עם ה- PID שתבחר. זה נבדק רק ב- Windows 7.
הצב את SilentAttach.dll בספריה OllyDbg, פטר את OllyDbg, לחץ על Alt + F12 , ואז הזן את מזהה התהליך של התהליך שאליו אתה רוצה לצרף בשקט.
NBS מכיוון שלא מתרחשת הפסקה, OllyDbg לא מוציאה מידע רב. לְמָשָׁל רשימת המודולים הטעונים. אז אתה צריך להפעיל את ההקשר על ידי משהו כמו Alt + E ואז Alt+C
אחת הדרכים לעשות זאת היא לקבל תוסף OllyDbg המבצע
WriteProcessMemory (hDebuggee, GetProcAddress (GetModuleHandle ("ntdll"), "DbgBreakPoint"), &mynop, 1 , NULL)
כאשר hDebuggee הוא הידית לתהליך ניפוי באגים (אני מאמין של- OllyDbg יש ממשק API לאחזור ערך זה), ו- mynop הוא משתנה המחזיק בתים 0x90 (nop ההוראה).
פעולה זו תנקה את ההוראה int3 שגורמת להפסקה, ותאפשר להמשיך בביצוע באופן מיידי. זהו טריק נפוץ נגד ניפוי באגים.
אני לא חושב שזה אפשרי בלי לעשות משהו פולשני ביותר. או טלאי את OllyDbg כדי להשתמש בפונקציה חלופית של ZwXX / NtXX שמקבלת כמה דגלים או מדביקה את הגרעין. ההפסקה הראשונית נעשית על ידי מערכת ההפעלה, כך שהבאגים יכול לאסוף מידע על התהליך אליו הוא מצורף.
לא אימתתי, אבל אני מניח שאולדיבג קוראת ל DebugActiveProcess על מנת להיצמד אליו. בתיעוד עבורו נאמר:
לאחר שהמערכת בודקת את מזהה התהליך וקובעת כי מתבצע קובץ מצורף ניפוי באגים תקף, הפונקציה מחזירה TRUE. לאחר מכן צפוי הבאגים להמתין לאירועי איתור באגים באמצעות הפונקציה WaitForDebugEvent. המערכת משעה את כל הנושאים בתהליך, ושולחת את אירועי הבאגים המייצגים את המצב הנוכחי של התהליך.
ובהמשך
אחרי הכל זה נעשה, המערכת מחדשת את כל הנושאים בתהליך. כאשר החוט הראשון בתהליך מתחדש, הוא מבצע הוראת נקודת שבר שגורמת לאירוע ניפוי ניפוי EXCEPTION_DEBUG_EVENT להישלח לבאגים. כל אירועי הבאגים העתידיים נשלחים לבאגים באמצעות המנגנון והכללים הרגילים.