אז פשוט קראתי קצת על האופן שבו ניתן היה להזריק dll לתוכנית פועלת בוויקיפדיה (הרעיון CreateRemoteThread
). עקבתי אחר השלבים המתוארים ובסופו של דבר הספקתי שזה עובד. הדבר שנראה לי מעניין, שלקח קצת זמן להבין הם הדברים הבאים: בעת יצירת השרשור המרוחק שלי ושליחת הפונקציה הייתי רוצה שיופעל כראשון / התחלתי פגעתי במלואו, כשהוא הופעל הוא נכשל כדי לקרוא לתפקודים המתאימים, נראה שהם הופכים לאשפה כשהסתכלתי עליהם ב- OllyDBG, מה שבתורו הביא לתוכנית להתרסק עלי. הקוד בו השתמשתי אז היה משהו בסגנון הבא:
DWORD static __stdcall inject (LPVOID threadParam) {MessageBoxA (NULL, "test", "test", NULL); LoadLibrary ("my.dll"); להחזיר 0;}
ובמקום אחר:
CreateRemoteThreadEx (hProcess, NULL, 0, LPTHREAD_START_ROUTINE (fnPageBase), dbPageBase, 0, NULL, &threadId) ;
היכן ש- fnPageBase
הוא הזיכרון שהקצתי בתהליך שיוזרק לתפקוד שלי ו- dbPageBase הזיכרון שהקצתי עבור מבנה שהוא עבר כ LPVOID threadParam
.
משהו כזה, הבעיה הייתה שגם MessageBoxA
וגם LoadLibrary
לא קיבלו נראה שזה כתובת נכונה, כשבדקתי אותם ב- OllyDBG הם תמיד הצביעו על משהו שלא היה קיים. חיפשתי קצת סביב וגיליתי שאני צריך להשתמש ב GetProcAddr
כדי לקבל כתובת למשל: LoadLibrary
בה אוכל להשתמש אחר כך על ידי שליחת נתונים דרך ה LPVOID threadParam
בשיחה שלי inject ()
. אז השאלה שלי היא: מדוע זה עובד כשאני משתמש ב- GetProcAddr
ולא כשאני פשוט מנסה להשתמש בו "כרגיל"? האם אני מקבל כתובת ספציפית שתמיד ממופה לכולם באותו אזור בזיכרון בעת השימוש בה?
כמו כן, מה קורה למחרוזות שלי בפונקציה inject ()
? האם הם עוברים למקום אחר במהלך הקומפילציה, מה שהופך אותם ללא זמינים לתוכנית שאני מזריק מכיוון שהיא נמצאת במקום אחר לגמרי בזיכרון (כלומר, היא לא ממופה לשם?)? עבדתי על ידי שליחת זה גם במבנה עם LPVOID threadParam
גם במבנה שהעתקתי לזיכרון שזמין ל .exe
שהזרקתי.
אם אתה זקוק למידע נוסף על האופן שבו עשיתי את החלקים האחרים, אנא ספר זאת ואעדכן.