
यूनिवर्सल विंडोज़ एक्सट्रैक्शन टूल जो अज्ञात फ़ाइलों का पता लगाता है और उन्हें सही बंडल किए गए एक्सट्रैक्टर तक पहुँचाता है।
# Magic Extractor
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7022/1ecc2fe011937465abd72031b0aa914c85a941290702969520086741770b5bea.png" alt="Magic Extractor" width="250" height="250">
</p>
## विवरण
मैजिक एक्सट्रैक्टर विंडोज़ के लिए एक सार्वभौमिक निष्कर्षण उपकरण है जो एक फ़ाइल की पहचान कई डिटेक्टरों से करता है और उसे सही बंडल किए गए एक्सट्रैक्टर तक पहुँचाता है। इसका उद्देश्य मुख्यधारा के संपीड़न प्रारूप, आज दिखने वाले इंस्टॉलर, और कई कम सामान्य आर्काइवर शामिल करना है।
यह **80+ प्रारूपों** का स्वतः पता लगाता है — आर्काइव, इंस्टॉलर, डिस्क इमेज, फोरेंसिक इमेज (EWF/AFF/AD1), डिस्क इमेज, मेल स्टोर और आधुनिक कोडेक। पूरी सूची के लिए [`formats.md`](https://github.com/xchwarze/magic-extractor/blob/master/docs/formats.md) देखें।
## त्वरित आरंभ
[नवीनतम रिलीज़](../../releases/latest) डाउनलोड करें, इसे अनज़िप करें, और चलाएँ:
```text
magic-extractor.exe extract mystery.bin
```
`identify`, `list`, `carve`, `--recursive` और `--bruteforce` के लिए [उदाहरण](#examples) देखें।
## परियोजना संरचना
- `cli`: स्रोत कोड।
- `bin`: बंडल किए गए डिटेक्टर और एक्सट्रैक्टर बाइनरी।
- `detectors`: DIE, Magika, binwalk (TrID की परिभाषाएँ `data/signatures.json` में परिवर्तित की जाती हैं)।
- `extractors`: 7z, unrar, unace, unshield, lessmsi, dark (WiX), और अन्य।
- `data`: रनटाइम कॉन्फ़िगरेशन, गतिशील रूप से लोड किया जाता है (नीचे देखें)।
- `formats`: प्रत्येक प्रारूप परिवार के लिए एक हैंडलर मॉड्यूल।
- `gui`: वैकल्पिक tkinter फ्रंट-एंड जो CLI को रैप करता है (देखें [GUI](#gui))।
- `test`: प्रारूप के अनुसार नमूना फ़ाइलें (निष्कर्षण/पहचान परीक्षणों के लिए फिक्स्चर)।
- `tools`: डेवलपर टूलिंग (`generate_data.py` — हैंडलर से डेटा फ़ाइलें बनाता है)।
संकलित बिल्ड `bin/`, `data/` और `config.ini` को exe के बाहर रखता है ताकि उन्हें फ़ाइल स्वैप के साथ अपडेट किया जा सके; `main.py` में पाथ रिज़ॉल्वर उन्हें निष्पादन योग्य (फ्रोज़न) के बगल में या `cli/` (डेव) के अंतर्गत ढूंढता है।
## डिटेक्शन कैसे काम करता है
सामान्य निष्कर्षण के लिए, डिटेक्टर **अर्ली-एग्ज़िट** के साथ इस क्रम में चलते हैं — जो पहले ज्ञात हैंडलर देता है वही जीतता है (सबसे सस्ता पहले, इसलिए ML मॉडल आमतौर पर छोड़ दिया जाता है):
1. **puremagic** — शुद्ध-पायथन, कोई सबप्रोसेस नहीं; अच्छी तरह से बने आर्काइव के लिए एक सस्ती MIME जाँच।
2. **built-in signatures** — `data/signatures.json` में मैजिक-बाइट पैटर्न; उन आर्काइवर्स के नाम बताता है जिन्हें इंजन नहीं पहचान पाते (bcm, dgca, kgb, uharc, alzip, freearc, ...) बिना किसी बाहरी प्रोसेस के।
3. **DIE** (Detect It Easy) — सिग्नेचर इंजन; इंस्टॉलर, PE और SFX का विशेषज्ञ।
4. **binwalk** — छोटी प्रकार कुंजियाँ (cpio, lzma, ...) और एम्बेडेड सामग्री।
5. **Magika** — Google का AI कंटेंट-टाइप डिटेक्टर, कैच-ऑल के रूप में।
प्रत्येक डिटेक्टर विशिष्ट रूप से योगदान देता है (वे पूरक हैं, अनावश्यक नहीं): सिग्नेचर DB उन आर्काइवर्स के नाम बताता है जिन्हें इंजन नहीं पहचान पाते, DIE इंस्टॉलर/PE संभालता है, binwalk उन कुछ प्रकारों को पकड़ता है जिन्हें अन्य नहीं पहचान पाते, puremagic/Magika MIME को कवर करते हैं।
PureMagic 2.x पूरी फ़ाइल मिलने पर सामग्री-जागरूक गहन स्कैनिंग भी प्रदान करता है। पूर्ण-फ़ाइल विश्लेषण डिफ़ॉल्ट है; वैकल्पिक `--fast-check` संशोधक केवल पहला 64 KiB पास करता है जब स्टार्टअप गति गहन निरीक्षण से अधिक मायने रखती है।
प्रत्येक हैंडलर अपने स्वयं के संकेतक `detection_mimes()` / `detection_names()` / `detection_signatures()` के माध्यम से घोषित करता है; `tools/generate_data.py` इन्हें `data/handlers.json` और `data/signatures.json` में संकलित करता है (वैकल्पिक `data/extra_detections.json` शीर्ष पर मर्ज किया जाता है)। TrID का उपयोग नहीं किया जाता है।
> नोट: कोई भी प्रारूप जिसका सिग्नेचर puremagic के [`magic_data.json`](https://github.com/cdgriffith/puremagic/blob/master/puremagic/magic_data.json) में अनुपस्थित है (या जिसे puremagic केवल सामान्य `application/octet-stream` के रूप में रिपोर्ट करता है) उसे अपने हैंडलर में एक कस्टम `detection_signatures()` प्रविष्टि घोषित करनी होगी — अन्यथा यह सामग्री द्वारा पहचाना नहीं जाएगा।
- `--bruteforce` अर्ली-एग्ज़िट को अक्षम करता है: हर डिटेक्टर चलता है और प्रत्येक पहचाने गए हैंडलर को बारी-बारी से आज़माया जाता है (उपयोगी जब पहला अनुमान गलत हो)।
- जिन निष्पादन योग्य फ़ाइलों की कोई डिटेक्टर पहचान नहीं करता, वे रैप्ड-exe इंस्टॉलर हैंडलर (BitRock, Clickteam, Inno, ...) पर वापस आ जाती हैं, जो स्व-सत्यापन करते हैं।
- `carve` सबकमांड अतिरिक्त रूप से binwalk के ऑफसेट मैप का उपयोग करके आर्बिट्रेरी ऑफसेट पर एम्बेडेड आर्काइव निकालता है (जैसे फर्मवेयर इमेज के अंदर)।
डिटेक्शन → हैंडलर रूटिंग मैप `data/handlers.json` में रहता है (हाथ से क्यूरेट किया गया, रनटाइम पर लोड होता है); एक जेनेरिक-टोकन ब्लैकलिस्ट `data/detection_blacklist.json` में रहती है।
## समर्थित प्रारूप
प्रारूपों और उनके हैंडलर की पूरी सूची के लिए [formats.md](https://github.com/xchwarze/magic-extractor/blob/master/docs/formats.md) देखें।
## एक प्रारूप जोड़ना
किसी नए प्रारूप के लिए समर्थन जोड़ने हेतु, [docs/adding-a-handler.md](https://github.com/xchwarze/magic-extractor/blob/master/docs/adding-a-handler.md) देखें — एंड-टू-एंड गाइड (हैंडलर क्लास, डिटेक्शन घोषणा, DIE/TrID लुकअप, मैजिक सिग्नेचर, रूटिंग डेटा को पुनः उत्पन्न करना, टूल को बंडल करना, और परीक्षण)।
## स्थापना (स्रोत से)
अधिकांश उपयोगकर्ता केवल रिलीज़ डाउनलोड करते हैं (देखें [त्वरित आरंभ](#quick-start))। स्रोत से चलाने के लिए:
Python 3.12 या नया आवश्यक है।
```bash
git clone <repo-url>
cd magic-extractor
pip install -r cli/requirements.txt
```
## उपयोग
मैजिक एक्सट्रैक्टर सबकमांड का उपयोग करता है:
```bash
python cli/main.py extract <path> [output_dir] [options] # detect and extract
python cli/main.py identify <path> # report type + candidate handlers
python cli/main.py list <path> # list archive contents
python cli/main.py carve <path> [output_dir] [options] # carve embedded archives (binwalk offsets)
```
एक बेयर पाथ जिसमें कोई सबकमांड नहीं है, `extract` पर डिफ़ॉल्ट होता है (पिछड़ा संगत):
```bash
python cli/main.py <path> <output_dir> [options]
```
`extract` विकल्प:
- `--password <password>`: एन्क्रिप्टेड आर्काइव के लिए पासवर्ड।
- `-r`, `--recursive`: आउटपुट के अंदर पाए गए आर्काइव निकालें (`--max-depth` द्वारा सीमित, डिफ़ॉल्ट 5)।
- `-b`, `--bruteforce`: पहले पर रुकने के बजाय पहचाने गए हर हैंडलर को आज़माएँ।
- `--open-output-folder <true|false>`: समाप्त होने पर आउटपुट फ़ोल्डर खोलें।
- `--check-free-space <true|false>`: चेतावनी दें यदि आउटपुट वॉल्यूम में स्थान की कमी हो सकती है।
- `--check-unicode <true|false>`: गैर-ASCII निकाले गए नामों के बारे में चेतावनी दें।
- `--fix-file-extensions <true|false>`: बिना एक्सटेंशन वाली निकाली गई फ़ाइलों को सामग्री-आधारित एक्सटेंशन दें (मौजूदा एक्सटेंशन को कभी अधिलेखित नहीं करता)।
- `--create-log-files <true|false>`: आउटपुट निर्देशिका में प्रति-रन लॉग लिखें।
(प्रत्येक का डिफ़ॉल्ट छोड़े जाने पर उसका `config.ini` मान होता है; दिए गए मान को स्थायी बनाने के लिए `--update-defaults` के साथ जोड़ें — जैसे `--open-output-folder false --update-defaults` पहले से सहेजे गए डिफ़ॉल्ट को बंद कर देता है।)
- `--fast-check`: पूर्ण-फ़ाइल डिटेक्शन चलाने के बजाय केवल पहले 64 KiB की जाँच करें।
- `--update-defaults`: दिए गए सेटिंग्स को `config.ini` में डिफ़ॉल्ट के रूप में स्थायी करें।
`carve` विकल्प: `--list` (binwalk फ्रैगमेंट तालिका प्रिंट करें), `--fragment N` (सूचकांक द्वारा एक फ्रैगमेंट निकालें), `--raw` (हर फ्रैगमेंट निकालें, केवल हैंडलर-ज्ञात नहीं)।
> नीचे दिए गए उदाहरणों में, `magic-extractor` निर्मित `.exe` है। स्रोत से, इसे `python cli/main.py` से बदलें — तर्क समान हैं।
## उदाहरण
**एक आर्काइव निकालें** — आपको इसका प्रकार जानने की आवश्यकता नहीं है; यह स्वतः पहचाना जाता है:
```text
magic-extractor extract mystery.bin
# extracts into mystery_extracted/ next to the file
```
**किसी फ़ाइल की पहचान करें** — उसे छुए बिना; दिखाता है कि प्रत्येक डिटेक्टर ने क्या देखा और कौन सा हैंडलर चलेगा:
```text
magic-extractor identify setup.exe
File: setup.exe
[DIE] detect inno setup installer
Candidate handlers (in order):
- FormatInnoSetupHandler
```
**किसी आर्काइव की सामग्री सूचीबद्ध करें** (बिना निष्कर्षण):
```text
magic-extractor list backup.7z
```
**रिकर्सिव** — आउटपुट के अंदर पाए गए आर्काइव निकालें (जैसे .tar.gz, या एक इंस्टॉलर जिसमें और आर्काइव हों), `--max-depth` स्तरों तक:
```text
magic-extractor extract app-1.0.tar.gz --recursive
```
**ब्रूटफोर्स** — जब पहचान अनिश्चित हो, तो पहले पर रुकने के बजाय मेल खाने वाले हर हैंडलर को आज़माएँ:
```text
magic-extractor extract weird-archive.dat --bruteforce
```
**कार्व** — बड़ी फ़ाइल के अंदर किसी ऑफसेट पर एम्बेडेड आर्काइव निकालें (फर्मवेयर इमेज के लिए सामान्य)। पहले निरीक्षण करें, फिर कार्व करें:
```text
magic-extractor carve router-firmware.bin --list
IDX OFFSET SIZE NAME DESCRIPTION
0 0x00000000 793,720 pe Windows PE binary
1 0x000c1c78 2,495,983 lzma LZMA compressed data
magic-extractor carve router-firmware.bin # carve + extract the known blobs
magic-extractor carve router-firmware.bin --fragment 1 # carve only fragment #1
```
## GUI
एक वैकल्पिक tkinter फ्रंट-एंड (`gui/` में) CLI को रैप करता है — एक Universal-Extractor-शैली विंडो जिसमें `extract`, `scan` और `carve` मोड, ड्रैग-एंड-ड्रॉप, बैच कतार, रन इतिहास और एक प्राथमिकताएँ संवाद हैं। ब्रूटफोर्स रन विकल्पों के अंतर्गत उपलब्ध है। यह उसी `main.py` को शेल करता है, इसलिए पहचान और निष्कर्षण समान व्यवहार करते हैं।
```bash
python gui/main.py # launch the window
python gui/main.py <file> [outdir] # prefill the source (and destination)
python gui/main.py <file> /scan # prefill and start in identify mode
```
ड्रैग-एंड-ड्रॉप के लिए वैकल्पिक `tkinterdnd2` पैकेज आवश्यक है (`pip install -r gui/requirements.txt`); इसके बिना भी विंडो काम करती है, केवल ड्रॉप समर्थन नहीं होता। यह अपने प्राथमिकताएँ संवाद से Explorer संदर्भ-मेनू प्रविष्टि भी पंजीकृत कर सकता है।
## निर्माण (Windows)
```bash
cd cli
pyinstaller --onefile main.py --name magic-extractor --collect-data puremagic
```
फिर `bin/`, `data/` और `config.ini` को `dist/magic-extractor.exe` के बगल में कॉपी करें।
CI यह स्वचालित रूप से करता है — देखें `.github/workflows/release.yml`।
## लाइसेंस
MIT — देखें `LICENSE.txt`। नोट: `cli/bin/` के अंतर्गत बंडल किए गए तृतीय-पक्ष एक्सट्रैक्टर/डिटेक्टर बाइनरी अपने स्वयं के लाइसेंस रखते हैं (कुछ स्वामित्व फ्रीवेयर हैं) और MIT द्वारा कवर नहीं हैं; वितरण से पहले उनकी पुनर्वितरण शर्तों को सत्यापित करें।
## लेखक
- मुख्य डेवलपर: DSR! — [email protected]
- सभी योगदानकर्ताओं को धन्यवाद।