שְׁאֵלָה:
ההבדל בין DllMain ל- DllEntryPoint
k0ng0
2013-05-23 00:33:34 UTC
view on stackexchange narkive permalink

יש לי תוכנה זדונית לניתוח. זהו קובץ DLL לפי ה- IMAGE_FILE_HEADER->Characteristics . ניסיתי לעשות עליו ניתוח דינמי. עשיתי את הפעולות הבאות:

  • הפעל אותו עם rundll32.exe , על ידי קריאה לייצוא שלו. שום דבר.
  • שינה את מאפייני הבינארי ל- exe. שום דבר.

אז עברתי לניתוח סטטי, טעון ב- IDA ואולידבג. מה שמביא אותי לשאלתי. :)

מה ההבדל העיקרי בין DllMain ל- DllEntryPoint?

מתי / כיצד מתקשרים האחד מול השני?

[עריכה]

אז לאחר קריאת MSDN וכמה ספרים בנושא טרשת נפוצה תִכנוּת. אני מבין את DllEntryPoint . DllEntryPoint הוא ה- DllMain שלך בעת כתיבת הקוד שלך. נכון?! אז מדוע יש DllMain . במילים אחרות, בעת פתיחת הבינארי ב- IDA יש לך DllEntryPoint ו- DllMain.

אני יודע שזה כנראה משהו קל אבל אני אדם חזותי, אז ברור שלא רואים משהו כאן.

שְׁלוֹשָׁה תשובות:
0xC0000022L
2013-05-23 19:09:28 UTC
view on stackexchange narkive permalink

שניהם, DllMain ו- DllEntryPoint הם רק שמות סמלים של אותו מושג . הם אפילו חולקים את אותו אב-טיפוס. אך הם אינם זהים:

יש להגדיר את הפונקציה באמצעות מוסכמת השיחה __stdcall . יש להגדיר את הפרמטרים ואת ערך ההחזרה כפי שתועדו ב- API של Win32 עבור WinMain (עבור קובץ .exe) או DllEntryPoint (עבור DLL). מומלץ לתת למקשר להגדיר את נקודת הכניסה כך שספריית זמן הריצה C תאותחל כראוי, ובוני C ++ לאובייקטים סטטיים יבוצעו.

(ספריית MSDN מ- Visual Studio 2005)

נקודת הכניסה ב- DLL זהה ל- EXE מבחינה טכנית , אך עם סמנטיקה ואב טיפוס שונים (EXE לעומת DLL). שניהם נמצאים בכתובת IMAGE_OPTIONAL_HEADER :: AddressOfEntryPoint . עם זאת, ב- DLL נקודת כניסה זו היא אופציונלית (אם כי בדרך כלל מסופקת על ידי ספריית זמן הריצה). נקודת הכניסה לא מיוצאת במפורש דרך ספריית הייצוא (אם כי IDA למשל מראה אותם תחת "יצוא"). לרוב אין שם ציבורי המצורף לנקודת כניסה זו, ולכן התיעוד מתייחס אליו כ- DllEntryPoint . אם אתה מוצא שם זה בספריית הייצוא של קובץ PE, כנראה שזה לא נקודת הכניסה בפועל מכותרת ה- PE האופציונלית (עם זאת, יהיה צורך לאשר זאת על ידי בחינת המדגם המדויק). הנקודה האחרונה, btw, מתקיימת גם עבור DllMain .

DllMain הוא השם ש ספריית זמן הריצה (ATL, MFC ...) יישום מצפה ממך לספק. זה שם שהמקשר יראה הפניה מיישום ברירת המחדל של DllEntryPoint אשר נקרא _DllMainCRTStartup ביישומי זמן הריצה. עיין בקובצי המקור של CRT crtdll.c ו- dllcrt0.c אם יש לך Visual Studio.

פירוש הדבר ש- DllEntryPoint קורא DllMain - בהנחה שהתנהגות ברירת המחדל היא. פונקציית נקודת הכניסה המיושמת בזמן ריצה ( _DllMainCRTStartup ) מבצעת אתחול אחר.

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


צד- הערה: ב- EXE ה- calls של TLS פועלים לפני קוד נקודת הכניסה, דבר שעלול להיות מסוכן במחקר תוכנות זדוניות. אני לא חושב שזה רלוונטי ל- DLLs, אבל אם למישהו יש יותר ידע בתחום אני מעוניין לראות מצביעים על חומר. s>

פיטר Ferrie, מהפך נכבד ואנליסט של תוכנות זדוניות, ציין בתגובה לתשובה זו:

התקשרות חוזרת של TLS פועלת תמיד בקבצי DLL מקושרים סטטית, ומכיוון ש- Vista הם גם פועלים קבצי DLL מקושרים באופן דינמי! למידע נוסף, עיין ב מצגות TLS שלי, וכמובן ב התייחסות "אולטימטיבית" נגד איתור באגים

תודה פיטר.

התקשרות חוזרת של TLS פועלת תמיד בקבצי DLL מקושרים סטטית, ומאז ויסטה, הם פועלים גם בקבצי DLL המקושרים באופן דינמי! למידע נוסף, עיין במצגות TLS שלי ([pferrie.host22.com/papers/com2008.htm ](http://pferrie.host22.com/papers/com2008.htm)), וכמובן האנטי-אולטימטיבי שלי " הפניה לאיתור באגים ([pferrie.host22.com/papers/unp2011.htm ](http://pferrie.host22.com/papers/unp2011.htm)).
PhoeniX
2013-05-23 01:38:57 UTC
view on stackexchange narkive permalink

DLLEntryPoint - היא הכתובת שממנה תתחיל הביצוע (אך לא חייבת אם אנחנו מדברים על תוכנות זדוניות) לאחר שהמטען סיים את תהליך הטעינה של את תמונת ה- PE. כתובת זו מוגדרת בתוך הכותרת האופציונלית של PE. אנא הסתכלו כאן. השם האחר עבור DllEntryPoint הוא AddressOfEntryPoint.

DllMain - הוא שם ברירת המחדל של הפונקציה שניתן במהלך פיתוח ה- DLL וכך המהדר יודע שעליו לקחת את הכתובת של פונקציה זו ולהכניס אותה לשדה PE AddressOfEntryPoint . היזם יכול לשנות שם זה לכל מה שהוא רוצה, אך עליו להורות למהדר ואז באיזו פונקציה להשתמש במקרה זה. בנוסף, אם הספרייה היא רק חבורה של פונקציות (נניח ולא יישום), אז המהדר יספק יישום ברירת מחדל של הפונקציה DllMain . אנא עיין עוד כאן בהערות.

למה ש ** MMavipc ** כתב, אוסיף כי דרוש DllMain כדי להכין את הסביבה או להגיב אחרת לאירועים שונים (יצירת חוטים, טעינת dll לתהליך, סיום התהליך) לפני שניתן לקרוא להיגיון ה- dll בפועל. לפעמים ניתן לראות ב- IDA את הקריאה להיגיון ה- Dll בפועל כ- * StartAddress *.
Ultralisk
2018-07-05 13:19:35 UTC
view on stackexchange narkive permalink

כאשר מעורב זמן הטעינה נקודת הכניסה היא DllMain.
(לדוגמא. שרת ה- DLL בתהליך ה- DLL).
כאשר זמן הריצה כרוך בנקודת הכניסה היא DllEntryPoint.
(לדוגמא LoadLibrary get שקוראים לו).



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...