نقترح أداة لتحليل رمز JavaScript بشكل ثابت. تحقيقًا لهذه الغاية ، نقوم ببناء AST (شجرة بناء الجملة المجردة) لملف javaScript الإدخال. للسبب في الشروط التي يجب مواجهتها لاتخاذ مسار تنفيذ محدد ، نضيف لاحقًا حواف تدفق التحكم إلى AST. نشير إلى الرسم البياني الناتج مثل CFG (الرسم البياني لتدفق التحكم). بعد ذلك ، للسبب في التبعيات المتغيرة ، نضيف حواف تدفق البيانات إلى CFG. أخيرًا ، لحساب القيم المتغيرة ، نقوم بإجراء تحليل المؤشر. نشير إلى الرسم البياني الناتج باسم PDG (رسم بياني اعتماد البرنامج).
من فضلك ، لاحظ أنه في حالته الحالية ، فإن الكود هو POC وليس واجهة برمجة تطبيقات جاهزة للإنتاج بالكامل.
نعتمد تعريفًا لـ CFG يختلف قليلاً عن Allen's حيث نعزز AST مع حواف تدفق التحكم. وبهذه الطريقة ، نقوم ببناء بنية مشتركة تجمع بين معلومات التدفق التحكم مع العقد والحواف AST ذات الحبيبات الدقيقة. PDG لدينا أيضا يختلف قليلا عن تعريف Ferrante et al. كما اخترنا إضافة حواف تدفق البيانات إلى CFG لدينا. وبهذه الطريقة ، نحتفظ بالمعلومات المتعلقة بترتيب البيان ولدينا تمثيل دقيق للبيانات يتدفق مباشرة على المستوى المتغير (حيث نقوم ببناء CFG على AST).
يمكن العثور على تفاصيل إضافية في رسالتي.
تم استخدام هذا الرمز لتحليل امتدادات المتصفح بشكل ثابت. انظر Doublex Paper & Code.
تم استخدام الإصدارات الأولية من هذا الرمز أيضًا للكشف عن عينات JavaScript الضارة: Hidenoseek Paper & Code و JSTAP Paper & Code.
ودراسة تقنيات تحويل رمز JavaScript: الورق والرمز.
install python3 # (tested with 3.7.3 and 3.7.4)
install nodejs
install npm
cd src
npm install esprima # (tested with 4.0.1)
npm install escodegen # (tested with 1.14.2 and 2.0.0)
لتثبيت GraphViz (فقط لرسم الرسوم البيانية ، لم يتم توثيقها بعد ، يرجى فتح مشكلة إذا كانت مهتمة)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
لإنشاء PDG لملف *.js محدد ، قم بتشغيل أوامر Python3 التالية من موقع مجلد src :
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
لكل افتراضي ، لن يتم تخزين PDG المقابل. لتخزينه في مجلد PDG_Path موجود ، اتصل على:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
لاحظ أننا أضفنا مهلة 10 دقائق لتحليل تدفق البيانات/مؤشر البيانات (السطر 149 من src/build_pdg.py ) ، وحد ذاكرة 20 جيجابايت (راجع السطر 115 من src/build_pdg.py ).
دعونا نفكر في دليل DIR الذي يحتوي على عدة ملفات JavaScript لتحليلها. لإنشاء PDGs (= ASTS محسّن مع التحكم وتدفق البيانات ، وتحليل المؤشر) لجميع هذه الملفات ، قم بتشغيل الأمر shell التالي من موقع مجلد src :
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
سيتم تخزين PDGs المقابلة في DIR/PDG .
حاليًا ، نستخدم 1 وحدة المعالجة المركزية ، ولكن يمكنك تغيير ذلك عن طريق تعديل Fariable Num_workers من src/utility_df.py ( السطر الواحد 51 ).
تم ترخيص هذا المشروع بموجب شروط ترخيص AGPL3 ، والذي يمكنك العثور عليه في LICENSE .