
बाइनरी विज़ुअलाइज़र और ट्राइएज टूल — एक साझा एड्रेस-स्पेस मॉडल पर एन्ट्रॉपी, बाइट-क्लास और हिल्बर्ट सतहें, डॉट प्लॉट और कंट्रोल-फ्लो ग्राफ़।
बाइनरी विज़ुअलाइज़र और ट्रायेज टूल: एक साझा एड्रेस-स्पेस मॉडल पर जुड़े इंटरैक्टिव दृश्य (एन्ट्रॉपी, हिस्टोग्राम, इमेज/डॉट-प्लॉट सतहें, कंट्रोल-फ्लो ग्राफ़)।
pipx install binviz && binviz serve
एक फ़ाइल खोलें और हर दृश्य एक ही एड्रेस स्पेस को देख रहा है। एक में रेंज चुनें और बाकी उसका अनुसरण करते हैं — उद्देश्य यह है कि "यह क्षेत्र क्या है" का उत्तर एक साथ कई तरीकों से देखकर पाया जाए।
binviz model LIEF के माध्यम से ELF/PE/Mach-O को क्षेत्रों, प्रतीकों और ऑफ़सेट↔वर्चुअल-एड्रेस मैपिंग में पार्स करता है, जिसमें गैप और ओवरले शामिल होते हैं। दोषपूर्ण इनपुट विफल होने के बजाय रॉ मॉडल पर वापस आ जाता है।binviz triage बताता है कि फ़ाइल कैसी दिखती है और क्यों; UI में प्रत्येक निष्कर्ष उन बाइट्स पर क्लिक करता है जिनसे यह प्राप्त हुआ था।UI पाँच वर्कस्पेस है — Overview, Bytes, Patterns, Code, और All — एक ही चयन पर। केवल स्थैतिक विश्लेषण: नमूनों को पार्स किया जाता है, कभी निष्पादित नहीं किया जाता।




उसी कोड द्वारा रेंडर किया गया जो UI चित्रित करता है, सीधे CLI से — python docs/make_plates.py के साथ पुनर्जनित करें।
| एक स्थैतिक बाइनरी | वही प्रोग्राम, UPX-पैक्ड |
|---|---|
![]() | ![]() |
| कोड, स्ट्रिंग्स और पैडिंग दृश्य क्षेत्रों में अलग हो जाते हैं। | संरचना एक समान शोर में ढह जाती है — पैकिंग का संकेत। |
![]() | ![]() |
| विंडोड एन्ट्रॉपी बैंडेड और कम रहती है। | सपाट और उच्च, अनपैकिंग स्टब तक। |
| सही रो स्ट्राइड | गलत रो स्ट्राइड |
|---|---|
![]() | ![]() |
वही बाइट्स, एक संख्या अलग। यही कारण है कि स्ट्राइड सुझावक मौजूद है: गलत रो स्ट्राइड एक फ़ोटोग्राफ़ को विकर्ण शोर में बदल देता है, और आप निष्कर्ष निकालते हैं कि कोई फ़ोटोग्राफ़ नहीं है।
ARCHITECTURE.md बताता है कि यह कैसे बनाया गया है: क्या शामिल है, वह ब्रांडिंग जो हर सतह विरासत में लेती है, वे परंपराएँ जिनका एक नई स्क्रीन को पालन करना चाहिए, और वे सीमाएँ जो जानबूझकर हैं। SECURITY.md सुरक्षा स्थिति है।
python -m venv .venv
# -c उन सटीक संस्करणों को पिन करता है जिनके विरुद्ध सुइट हरा है; pyproject.toml
# रेंज प्रकाशित करता है, इसलिए इसके बिना आपको वही मिलता है जो आज हल होता है
.venv/Scripts/pip install -e ".[dev]" -c constraints-dev.txt # POSIX: .venv/bin/pip
# ग्राउंड-ट्रुथ कॉर्पस बनाएं (ziglang pip पैकेज से zig cc का उपयोग करता है;
# PATH में UPX चाहिए, $UPX में, या corpus/tools/upx-*/ में अनज़िप किया हुआ)
make -C corpus # या: python corpus/build.py
# थ्रेशोल्ड मापे जाते हैं, कभी हार्डकोड नहीं (ARCHITECTURE.md §2.1 देखें)
python corpus/calibrate.py # corpus/calibration.json लिखता है
pytest # कार्यात्मक सुइट
pytest -m perf -s # 100 MB प्रदर्शन लक्ष्य
binviz probe corpus/out/hello_O2
binviz model corpus/out/hello_upx
binviz signal corpus/out/hello_upx --name entropy_4096 --png out.png
binviz hist corpus/out/ramp16.bin --n 2 --dtype u16le --png bigram.png
# सतहें: -p सतह पैरामीटर पास करता है
binviz surface corpus/out/hello_static --name hilbert -p mode=byteclass --png h.png
binviz surface corpus/out/rgb_raw.bin --name image -p mode=rgb8 -p width=320 --png i.png
binviz surface corpus/out/repeats.bin --name dotplot -p mode=exact --png d.png
binviz stride corpus/out/bayer_raw.bin --mode bayer_RGGB_RGB_12
# कोड
binviz disasm corpus/out/hello_O2 --limit 20
binviz functions corpus/out/hello_static --sort size
binviz cfg corpus/out/hello_O2 --func main --dot main.dot
# निर्णय, और क्यों
binviz triage corpus/out/hello_upx
binviz serve # 127.0.0.1:8000
यह एक सत्र टोकन वाला URL प्रिंट करता है — उसे खोलें। हर /api रूट को टोकन चाहिए, क्योंकि "यह केवल localhost पर सुनता है" किसी अन्य टैब में एक वेब पेज के विरुद्ध बचाव नहीं है, जो किसी भी अन्य ओरिजिन की तरह 127.0.0.1 तक पहुँचता है। SECURITY.md में तर्क है।
फ़ाइल एक्सेस --root (डिफ़ॉल्ट: कार्यशील निर्देशिका) तक सीमित है, इसलिए इसके बाहर के पथ अस्वीकार कर दिए जाते हैं।
सभी चार में एक फ़्लैग और एक पर्यावरण चर है, और सभी चार एक स्थानीय कॉलर को आपके इच्छित से अधिक उपभोग करने से रोकने के लिए मौजूद हैं। डिफ़ॉल्ट एक लैपटॉप के लिए चुने गए हैं; यदि आपकी मशीन बड़ी है तो उन्हें बढ़ाएँ।
| फ़्लैग | Env | डिफ़ॉल्ट | यह क्या सीमित करता है |
|---|---|---|---|
--max-cache BYTES | BINVIZ_MAX_CACHE | 5 GiB | कैश किए गए विश्लेषणों का कुल आकार। इससे अधिक होने पर, सबसे कम उपयोग किए गए प्रविष्टियाँ हटा दी जाती हैं — कभी भी वह नहीं जो विश्लेषित या देखा जा रहा है। |
--max-upload BYTES | BINVIZ_MAX_UPLOAD | 8 GiB | स्वीकृत सबसे बड़ा अपलोड। |
--max-analyses N | — | 4 | एक साथ विश्लेषण; इससे अधिक पर /api/open 503 लौटाता है। |
--root DIR | — | cwd | वह निर्देशिका जिससे सर्वर फ़ाइलें पढ़ सकता है। |
विश्लेषण ~/.cache/binviz (या $BINVIZ_CACHE) के अंतर्गत कैश किए जाते हैं, सामग्री हैश द्वारा कुंजीबद्ध, इसलिए बाइनरी को फिर से खोलना तुरंत होता है। यदि आप उनमें से अधिक रखना चाहते हैं तो --max-cache बढ़ाएँ; कैश किसी भी समय हाथ से हटाना सुरक्षित है — सबसे खराब स्थिति यह है कि अगला खोलना फिर से विश्लेषण करता है।
अन्य फ़्लैग: --token पुनः आरंभों के बीच एक टोकन पिन करने के लिए (Vite dev proxy के साथ उपयोगी, जो BINVIZ_TOKEN पढ़ता है), --port, --cache, और CI के लिए --no-auth। --no-auth एक बैनर प्रिंट करता है जो बताता है कि उसने क्या बंद किया; इसे उस मशीन पर उपयोग न करें जिसे आप साझा करते हैं।
pip install "binviz[app]"
binviz app # नेटिव विंडो; --browser आपके ब्राउज़र के लिए
वही सर्वर, वही टोकन, वही --root सीमा जैसा binviz serve — केवल अंतर यह है कि इसे क्या प्रदर्शित करता है। pywebview स्थापित नहीं होने पर, binviz app आपके ब्राउज़र को खोलता है।
यह जानबूझकर उस URL को प्रिंट करता है जिस पर यह सेवा कर रहा है: UI को एक विंडो में लपेटना नेटवर्क लिसनर को नहीं हटाता, यह केवल यह भूलना आसान बनाता है कि एक है। लिसनर किसी भी तरह से प्रमाणित है, और binviz app पर कोई --no-auth नहीं है।
विंडो पृष्ठ को ठीक एक फ़ंक्शन उजागर करती है — एक नेटिव फ़ाइल पिकर — और कुछ नहीं। देखें src/binviz/app.py कि वह सूची इतनी छोटी क्यों है।
रिलीज़ एक व्हील और कुछ नहीं भेजती हैं। एक अहस्ताक्षरित फ्रोज़न Python निष्पादन योग्य जो capstone और lief को बंडल करता है और पैक्ड बाइनरीज़ को विच्छेदित करने के लिए मौजूद है, ठीक वही प्रोफ़ाइल है जिस पर SmartScreen और AV ह्यूरिस्टिक्स गलत सकारात्मक देते हैं — इसलिए इसे भेजने के बजाय, रिपो में वह सब कुछ है जो आपको इसे स्वयं बनाने के लिए चाहिए, जो कोड साइनिंग को पूरी तरह से दरकिनार कर देता है।
pip install pyinstaller # 6.x
python tools/build_ui.py # web/ बनाता है और इसे पैकेज में स्टेज करता है
pyinstaller packaging/binviz.spec # -> dist/binviz/
लगभग ~100 MB की उम्मीद करें, जिसमें numpy और lief प्रमुख हैं। यह एक onedir बंडल है, एकल स्व-निकालने वाली फ़ाइल नहीं: डेस्कटॉप विंडो के लिए dist/binviz/binviz.exe लॉन्च करें (या डबल-क्लिक करें), या इसे कोई भी सबकमांड दें — dist/binviz/binviz.exe triage sample.exe — क्योंकि फ्रोज़न बिल्ड पूरा CLI है, केवल विंडो नहीं।
स्टेजिंग चरण वैकल्पिक नहीं है। web/dist Python पैकेज के बाहर रहता है, इसलिए इसे छोड़ने से एक ऐप बनता है जिसकी विंडो JSON 404 पर खुलती है; spec चुपचाप ऐसा होने देने के बजाय बनाने से इनकार करता है।
macOS पर वही कमांड dist/Striate.app भी बनाता है, जो packaging/icons/icon.icns से ब्रांडेड है। दोनों में से किसी को भी Mac पर नहीं चलाया गया है — ARCHITECTURE.md §5 देखें।
--root अभी भी कार्यशील निर्देशिका पर डिफ़ॉल्ट है, इसलिए एक डबल-क्लिक किया गया निष्पादन योग्य उस फ़ोल्डर तक सीमित है जिसमें यह शुरू होता है — जो आमतौर पर ऐप का अपना फ़ोल्डर होता है। शॉर्टकट का "Start in" सेट करें, या इसे --root DIR के साथ लॉन्च करें।
एक डबल-क्लिक किया गया निष्पादन योग्य एक क्रेडेंशियल माँगता है। बिना तर्कों के फ्रोज़न बिल्ड binviz app --auth local चलाता है, जो व्हील के अपने डिफ़ॉल्ट साइन-इन स्क्रीन के बिना से एकमात्र अंतर है। दोनों अलग-अलग प्रश्नों का उत्तर देते हैं: टर्मिनल में टाइप किया गया binviz app पहले से ही सत्र के स्वामी द्वारा एक जानबूझकर कार्य है, जबकि एक डबल-क्लिक कुछ भी स्थापित नहीं करता — यह एकमात्र लॉन्च पथ है जिसमें कोई टर्मिनल, कोई टाइप किया गया कमांड और इसके पीछे कोई सीमा निर्णय नहीं है। क्रेडेंशियल माँगना वह तरीका है जिससे विंडो ज़ोर से कहती है जो टर्मिनल कहता। पहले binviz passwd चलाकर एक सेट करें, या इसे छोड़ने के लिए स्पष्ट रूप से --auth none पास करें; कमांड लाइन पर आप जो भी देते हैं वह अभी भी जीतता है।
डिफ़ॉल्ट रूप से कोई लॉगिन स्क्रीन नहीं है और कॉपी करने के लिए कुछ नहीं है: सर्वर एक सत्र टोकन बनाता है और इसे उस पृष्ठ में इंजेक्ट करता है जिसे वह सेवा करता है, इसलिए http://127.0.0.1:8000/ खोलना बस काम करता है जबकि हर API कॉल अभी भी प्रमाणित है।
उस मशीन पर जिसे आप साझा करते हैं, साइन-इन स्क्रीन चालू करें:
binviz passwd # प्रॉम्प्ट करता है; scrypt डाइजेस्ट, मोड 0600
binviz serve --auth local
यदि आप binviz passwd छोड़ते हैं, तो पहला साइन-इन इंस्टॉल का दावा करता है — स्टार्टअप बैनर उसके बारे में चेतावनी देता है, क्योंकि जो कोई भी पोर्ट तक पहले पहुँचता है वह खाता बन जाता है।
एक डबल-क्लिक किया गया फ्रोज़न निष्पादन योग्य अपने लिए --auth local चालू करता है; देखें Building a standalone app कि यह डिफ़ॉल्ट व्हील से क्यों भिन्न है।
लॉगिन स्क्रीन सुरक्षा सीमा नहीं है; हर /api रूट पर टोकन जाँच है। मशीन पर कुछ भी फ़ॉर्म छोड़ सकता है और API को सीधे कॉल कर सकता है, जो ठीक वही कारण है कि टोकन मौजूद है। देखें SECURITY.md।
binviz उन फ़ाइलों को खोलता है जिन्हें एक हमलावर ने चुना — यह काम है, कोई किनारा मामला नहीं, और एक ट्रायेज टूल जहाँ मैलवेयर का विश्लेषण करने से विश्लेषक से समझौता होता है, उपलब्ध सबसे खराब विफलता है। नमूनों को पार्स किया जाता है, कभी निष्पादित नहीं किया जाता। बाकी के बारे में क्या किया जाता है:
एक शत्रुतापूर्ण बाइनरी के विरुद्ध
/api/{id}/… रूट में id को पथ बनाने के लिए उपयोग करने से पहले ठीक 64 हेक्स वर्ण होना चाहिए।एक शत्रुतापूर्ण ब्राउज़र के विरुद्ध — वह खतरा जिसे "यह केवल localhost पर सुनता है" संबोधित नहीं करता, क्योंकि दूसरे टैब में एक पृष्ठ किसी भी अन्य ओरिजिन की तरह 127.0.0.1 तक पहुँचता है:
/api रूट को एक टोकन चाहिए। यह स्टार्टअप पर बनाया जाता है और पृष्ठ में इंजेक्ट किया जाता है, इसलिए कुछ भी हाथ से चिपकाया नहीं जाता और कोई रूट खुला नहीं छोड़ा जाता।--root तक सीमित है, जो कार्यशील निर्देशिका पर डिफ़ॉल्ट है। इसके बाहर के पथ अस्वीकार कर दिए जाते हैं।Host अनुमति सूची और संकीर्ण CORS, ताकि जिस ओरिजिन को एक्सेस चाहिए वही एकमात्र है जिसे वह मिलता है।डेस्कटॉप विंडो नेटवर्क लिसनर को नहीं हटाती, यह केवल भूलना आसान बनाती है। इसलिए binviz app पर कोई --no-auth नहीं है, और js_api ब्रिज ठीक एक विधि उजागर करता है — pick_file(), जो कोई तर्क नहीं लेता और उसी --root सीमा के माध्यम से एक पथ लौटाता है। यदि कभी दूसरी विधि दिखाई देती है तो एक परीक्षण विफल हो जाता है।
--auth local के लिए क्रेडेंशियल scrypt डाइजेस्ट हैं जो मोड 0600 में लिखे गए हैं; binviz कोई सादा-पाठ पासवर्ड संग्रहीत नहीं करता।
SECURITY.md में खतरा मॉडल, प्रत्येक नियंत्रण के पीछे का तर्क, जो जानबूझकर अभी तक नहीं किया गया है, और एक भेद्यता को निजी रूप से कैसे रिपोर्ट करें, है।
MIT — देखें LICENSE।
कॉर्पस zig cc के साथ ELF नमूनों को क्रॉस-कंपाइल करता है, इसलिए Windows/macOS पर कोई Linux टूलचेन आवश्यक नहीं है — नमूनों को पार्स किया जाता है, कभी निष्पादित नहीं किया जाता।