חיפוש
  • יניב אור

ניתוח malware שנכתב ב-JavaScript - וירוס 5

עודכן ב: מאי 19

האינדקס לסדרת המאמרים:

ניתוח וירוסים


מתוך אוסף הנוזקות הבא:

https://github.com/HynekPetrak/javascript-malware-collection


תיקיית 2016 בתוכה תיקיה 20161214 - הקובץ

20161214_0c2c975b1f0e61378861a733bfc9bd65.js


אני ב-malware החמישי, יש עוד קרוב ל-39,995 וירוסים בסדרה. זה כמו כתב חידה. את האמת, לא ידעתי שזה כזה כיף.


אז הוירוס הבא נראה שונה מהקודמים.

הרצתי את התוסף Beautify על הקובץ

אין הרבה שינוי. הפונקציה הראשית ברורה יותר ויש קריאה לפונקציה הזאת בשאר חלקי הקוד.

בוירוס הזה יש שימוש נרחב ב-eval אשר הופך מחרוזת לפקודה ומריץ את הפקודה.


אגב, הוירוסים בתיקיות 20161215 ו-20161216 מקודדים באותו סגנון.


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


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


אז נתחיל עם הפונקציה הראשית. לצורך העניין, אכניס את שאר הקוד - פרט לפונקציה הזאת - להערה, כך שלא יפעל כשאריץ את הסקריפט - ואקרא לפונקציה הזאת עם המחרוזת: "a`b`c`d`e`f", למשל (ראה: הקוד שמופיע בהמשך).

ברגע שהרצתי את הקוד עם NodeJS אני מקבל שגיאה:

כלומר ה-eval בשורה הראשונה בפונקציה לא עבד והמשתנה aGHl6 לא הוגדר כראוי.

לא יצא לי להתקל בשורת קוד שנמצאת בתוך בלוק של הערה - /* */ - וה-eval מתעלם מההערה ומבצע את הקוד. יכול להיות שהתוספת של ה-@ ביחד עם ה-cc_on גורמת לשורת קוד להתייחסות שונה. אולי בדפדפנים מסויימים. אני צריך לבדוק את זה.


בכל מקרה, ניסיתי את הקוד ללא ההערה ושאר הסימנים ובסופו של דבר רוב הקוד בפונקציה הזאת בעצם מיותר משום שהשורה הבאה:

מחזירה true בכל מצב.


לכן, הקוד מצטמצם לדבר הבא:

וכשאריץ אותו, הערך של v_ccdd יהיה:

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


נעבור לקוד שהכנסתי להערה. ניקח לדוגמא את השורה הראשונה.

יש את המשתנה v_ccdd שמקבל שלוש הגדרות מופרדות בפסיקים - ושלושתן בתוך סוגריים מעוגלים.


בכולן ההגדרה הראשונה היא:

ההגדרה השניה היא הצורה הבאה:

ההגדרה השלישית:

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


ביטלתי את ההערות בקוד והרצתי אותו עם NodeJS. קיבלתי את השגיאה הבאה:

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


אני רוצה עכשיו להדפיס את הקוד השלם. את הפונקציה הראשונה שיניתי לדבר הבא:

הרצתי שוב את הקוד וקיבלתי:

נראה טוב. זאת אומרת רע.


בדיקת הוירוס במעבדת cuckoo


© 2023 by DO IT YOURSELF. Proudly created with Wix.com