เราเสนอเครื่องมือในการวิเคราะห์รหัส JavaScript แบบคงที่ ด้วยเหตุนี้เราจึงสร้าง AST (แผนผังไวยากรณ์นามธรรม) ของไฟล์จาวาสคริปต์อินพุต ด้วยเหตุผลเกี่ยวกับเงื่อนไขที่ต้องปฏิบัติตามสำหรับเส้นทางการดำเนินการเฉพาะที่จะดำเนินการเราต่อมาเพิ่มขอบการควบคุมการไหลเข้ากับ AST เราอ้างถึงกราฟผลลัพธ์เป็น CFG (กราฟการควบคุมการไหล) ต่อไปเพื่อเหตุผลเกี่ยวกับการพึ่งพาตัวแปรเราเพิ่มขอบการไหลของข้อมูลลงใน CFG ในที่สุดเพื่อคำนวณค่าตัวแปรเราทำการวิเคราะห์ตัวชี้ เราอ้างถึงกราฟผลลัพธ์เป็น PDG (กราฟการพึ่งพาโปรแกรม)
โปรดทราบว่าในสถานะปัจจุบันรหัสเป็น POC และไม่ใช่ API ที่พร้อมผลิตเต็มรูปแบบ
เราใช้คำจำกัดความของ CFG ที่แตกต่างจากอัลเลนเล็กน้อยในขณะที่เราปรับปรุง AST ของเราด้วยขอบการควบคุม ด้วยวิธีนี้เราจะสร้างโครงสร้างร่วมที่รวมข้อมูลการไหลของการควบคุมกับโหนด AST และขอบที่ละเอียด PDG ของเรายังแตกต่างจากคำจำกัดความของ Ferrante และคณะเล็กน้อย ในขณะที่เราเลือกที่จะเพิ่มขอบข้อมูลการไหลของ 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 นาทีสำหรับการวิเคราะห์การไหลของข้อมูล/ตัวชี้ (cf. บรรทัดที่ 149 ของ src/build_pdg.py ) และขีด จำกัด หน่วยความจำ 20GB (cf. บรรทัด 115 ของ src/build_pdg.py )
ลองพิจารณาไดเรกทอรี DIR มีไฟล์ JavaScript หลายไฟล์เพื่อวิเคราะห์ ในการสร้าง PDGs (= ASTs ที่ได้รับการปรับปรุงด้วยการควบคุมและการไหลของข้อมูลและการวิเคราะห์ตัวชี้) ของไฟล์เหล่านี้ทั้งหมดให้เรียกใช้คำสั่งเชลล์ต่อไปนี้จากตำแหน่งโฟลเดอร์ src :
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
PDG ที่เกี่ยวข้องจะถูกเก็บไว้ใน DIR/PDG
ขณะนี้เรากำลังใช้ 1 CPU แต่คุณสามารถเปลี่ยนแปลงได้โดยการแก้ไขตัวแปร num_workers จาก src/utility_df.py (หนึ่ง บรรทัด 51 )
โครงการนี้ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาต AGPL3 ซึ่งคุณสามารถค้นหาได้ใน LICENSE