
TLOU2 DC स्क्रिप्ट्स के लिए एक डिस्सेम्बलर और प्रायोगिक डीकंपाइलर।

dconstruct The Last of Us Part II में उपयोग किए जाने वाले DC-Script फ़ाइलों के लिए एक रिवर्स इंजीनियरिंग उपकरण है। इसमें एक डिसअसेंबलर और एक डीकंपाइलर शामिल है।
यह .asm फ़ाइलें आउटपुट करता है जिनमें डिसअसेंबल संरचनाएँ और बाइटकोड होते हैं, साथ ही .dcpl (DC स्यूडो भाषा) फ़ाइलें जिनमें C-जैसा स्यूडो कोड होता है।
आप कमांड लाइन के माध्यम से फ़ाइलों में संपादन भी कर सकते हैं, जिसमें बिना अधिक प्रयास के पूरी संरचनाओं को बदलना शामिल है। इससे .bin फ़ाइलों के अंदर कुछ मान बदलने वाले मॉड बनाना बेहद आसान हो जाता है।
-e फ़्लैग के माध्यम से संपादन करना, नई फ़ाइलें बनाना जिनका उपयोग आप मॉड के लिए कर सकते हैंपहले, यह अनुशंसित है कि आप अनज़िप किए गए dconstruct निर्देशिका को किसी सुरक्षित स्थान पर ले जाएँ, जैसे C:\Program Files।
dconstruct का उपयोग यथासंभव आसान बनाने के लिए, यह अनुशंसित है कि आप dconstruct फ़ोल्डर के अंदर .\bin निर्देशिका को अपने PATH में जोड़ें। आप इसके बारे में यहाँ अधिक जान सकते हैं, या इन त्वरित चरणों का पालन कर सकते हैं:

सुनिश्चित करें कि आपका पथ "\bin" पर समाप्त होता है न कि "\dconstruct" पर।
सभी खुले संवादों पर 'OK' क्लिक करें।
यह सत्यापित करने के लिए कि यह काम कर गया, एक नया कमांड प्रॉम्प्ट खोलें और dconstruct --about टाइप करें। आपको प्रोग्राम से कुछ आउटपुट देखना चाहिए और कोई त्रुटि संदेश नहीं देखना चाहिए।
अपनी पहली डिसअसेंबल फ़ाइल उत्पन्न करने के लिए कमांड लाइन में इस तरह एक कमांड चलाएँ:```shell dconstruct my_bin_file.bin
यह आपके इनपुट फ़ाइल के समान निर्देशिका में `my_bin_file.bin.asm` नामक एक फ़ाइल आउटपुट करेगा। फिर आप उस फ़ाइल को टेक्स्ट/कोड एडिटर का उपयोग करके खोल सकते हैं। मैं VSCode जैसे किसी एडिटर की सलाह दूंगा जो उन्नत खोज सुविधाएँ प्रदान करता है और बड़ी फ़ाइलों को संभालने में अच्छा है। मानक Windows नोटपैड की अनुशंसा नहीं की जाती है।
किसी फ़ाइल को डीकंपाइल करने के लिए, कमांड चलाते समय `--decompile` फ़्लैग जोड़ें।
# कमांड लाइन आर्गुमेंट्स
- `-i` - इनपुट फ़ाइल या फ़ोल्डर। यदि इनपुट पथ को पहले आर्गुमेंट के रूप में पास किया जा रहा है तो इसे छोड़ा जा सकता है।
- `-o` - आउटपुट पथ। यदि आपका इनपुट पथ एक फ़ोल्डर है, तो यह कोई फ़ाइल नहीं हो सकता। यदि कोई आउटपुट निर्दिष्ट नहीं है, तो .txt फ़ाइल इनपुट फ़ाइल के बगल में रखी जाएगी। यदि इनपुट एक फ़ोल्डर है और कोई आउटपुट निर्दिष्ट नहीं है, तो प्रोग्राम वर्तमान कार्यशील निर्देशिका में एक "output" निर्देशिका बनाएगा और सभी फ़ाइलों को वहाँ रखेगा।
- सिडबेस को एक्सीक्यूटेबल के बगल में स्थित `sidbase.bin` से लोड किया जाता है।
- `--no_decompile` - .dcpl फ़ाइल में डीकंपाइल्ड स्यूडो कोड को उत्सर्जित न करें। फ़ाइल .asm फ़ाइल के बगल में रखी जाएगी। डिफ़ॉल्ट रूप से यह false है।
- `--no_optimize` - dcpl कोड को ऑप्टिमाइज़ और साफ़ न करें। इसमें फ़ंक्शन कॉल को इनलाइन करना, अप्रयुक्त चर हटाना, संगत for लूप को foreach लूप में बदलना, और कुछ if-else श्रृंखलाओं को match एक्सप्रेशन में बदलना शामिल है।
- `--pascal_case` - dcpl आउटपुट में गेम के फ़ंक्शन नामों को पास्कल केस में बदलें, उदा. get-boolean -> GetBoolean।
- `--graphs` - सभी डीकंपाइल किए गए फ़ंक्शनों के लिए कंट्रोल फ्लो ग्राफ़ वाली .svg फ़ाइलें उत्सर्जित करें। प्रत्येक .bin फ़ाइल के लिए उसके सभी ग्राफ़ वाला अपना फ़ोल्डर बनता है। यह डीकंपाइलेशन की गति को **काफी** धीमा कर देता है, इसलिए एक साथ बड़ी संख्या में फ़ाइलों को डीकंपाइल करते समय इसकी अनुशंसा नहीं की जाती है।
- `--emit_once` - एक ही संरचना को डिसअसेंबली में दो बार उत्सर्जित होने से रोकता है। यदि कोई संरचना कई बार दिखाई देती है, तो केवल पहली बार ही पूरी तरह उत्सर्जित की जाएगी, और अन्य सभी अवसरों को `ALREADY_EMITTED` टैग से बदल दिया जाएगा। इससे फ़ाइल का आकार काफी कम हो सकता है।
- `-e` - एक संपादन करें। नीचे दिए गए अनुभाग में अधिक जानकारी।
- `--edit_file` - एक संपादन फ़ाइल प्रदान करें। एक संपादन फ़ाइल में प्रति पंक्ति एक संपादन होता है। यह `-e` फ़्लैग के समान सिंटैक्स का उपयोग करता है।
# डिस्सेम्बलर क्या है?
एक [डिस्सेम्बलर](https://en.wikipedia.org/wiki/Disassembler) एक उपकरण है जो बाइनरी निर्देशों (उर्फ [बाइटकोड](https://en.wikipedia.org/wiki/Bytecode) या [मशीन कोड](https://en.wikipedia.org/wiki/Machine_code)) को पढ़ता है और प्रत्येक को एक मानव-पठनीय संस्करण में अनुवादित करता है जिसे [मनेमोनिक](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics) कहा जाता है। डिस्सेम्बलर आमतौर पर इन निर्देशों के अर्थ के बारे में अधिक व्याख्या करने का प्रयास नहीं करते हैं और केवल उन्हें 1-1 रूप में उनके पठनीय संस्करणों में बदल देते हैं। उदाहरण के लिए, निर्देश:```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
निम्नलिखित मानव-पठनीय संस्करणों में डिस्सेम्बल किए जाते हैं:```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
बाइटकोड में सभी संख्याएँ [हेक्साडेसिमल](https://en.wikipedia.org/wiki/hexadecimal) में लिखी जाती हैं। प्रत्येक पंक्ति में पहला कॉलम `opcode` या निष्पादित किए जाने वाले निर्देश के प्रकार को दर्शाता है। अगला कॉलम गंतव्य रजिस्टर है, जहाँ संक्रिया का परिणाम संग्रहीत किया जाएगा। अंतिम दो कॉलम प्रचालक 1 और 2 हैं, जो या तो रजिस्टर हैं या शाब्दिक संख्याएँ हैं जिन पर संक्रिया की जाएगी। सभी निर्देश सभी 4 बाइट्स का उपयोग नहीं करते, उदाहरण के लिए, पहले `LookupPointer` निर्देश को केवल एक प्रचालक की आवश्यकता होती है।
dconstruct डिसअसेंबलर कुछ अतिरिक्त जानकारी भी जोड़ता है जिसका उद्देश्य निर्देशों को पढ़ना थोड़ा आसान बनाना है। यह कोड में शाखाओं को ट्रेस करना आसान बनाने के लिए लेबल (जैसे `L_0`) भी सम्मिलित करता है।```arm
15 00 00 00 LookupPointer r0, 0 r0 = ST[0] -> <is-player-abby?>
4A 01 01 00 LoadStaticU64Imm r1, 1 r1 = ST[1] -> <player>
43 31 01 00 Move r49, r1 r49 = player
1C 00 00 01 CallFf r0, r0, 1 r0 = is-player-abby?(player)
2F 0D 00 00 BranchIfNot r0, 0xD IF NOT r0 => L_0
यह तब उपयोगी है जब आप प्रोग्राम द्वारा बहुत अधिक अनुमान लगाए बिना फ़ाइल की कच्ची सामग्री देखना चाहते हैं। लेकिन कोड के बड़े ब्लॉकों के लिए इसे पढ़ना मुश्किल हो सकता है, क्योंकि कोई संरचना नहीं होती है। यह वह जगह है जहाँ एक डीकंपाइलर काम आता है।