
Go बाइनरीज़ को पार्स करके सिंबल्स, फ़ंक्शन मेटाडेटा, टाइप्स, फ़ाइल पाथ्स और एम्बेडेड स्ट्रिंग्स को पुनः प्राप्त करता है, जिसमें स्ट्रिप्ड या UPX-पैक्ड सैंपल्स भी शामिल हैं, साथ ही IDA Pro इम्पोर्ट सपोर्ट भी है।

GoReSym एक Go सिंबल पार्सर है जो प्रोग्राम मेटाडेटा (जैसे CPU आर्किटेक्चर, OS, एंडियननेस, कंपाइलर संस्करण, आदि), फ़ंक्शन मेटाडेटा (प्रारंभ और अंत पते, नाम, स्रोत), फ़ाइलनाम और पंक्ति संख्या मेटाडेटा, तथा एम्बेडेड संरचनाओं और प्रकारों को निकालता है। यह क्रॉस-प्लेटफ़ॉर्म प्रोग्राम सीधे ओपन सोर्स Go कंपाइलर और रनटाइम कोड पर आधारित है।
अपस्ट्रीम Go रनटाइम कोड को निम्नलिखित को संभालने के लिए विस्तारित किया गया है:
moduledata संरचना का स्थानरिवर्स इंजीनियरिंग विवरण और उदाहरण उपयोग के लिए https://www.mandiant.com/resources/blog/golang-internals-symbol-recovery देखें।
आप Releases टैब से पहले से बनी linux, macos, और windows GoReSym बाइनरीज़ डाउनलोड कर सकते हैं।
हाल के Go कंपाइलर के साथ स्रोत से बनाने के लिए, Go कंपाइलर को आमंत्रित करें:
go build
एक बार बन जाने के बाद GoReSym को इस तरह से लागू करें:
GoReSym.exe -t -d -p /path/to/input.exe
इस उदाहरण में, हम GoReSym से फ़ाइल /path/to/input.exe में एम्बेडेड टाइप नाम (-t), उपयोगकर्ता पैकेज नाम, मानक Go पैकेज नाम (-d), और इनपुट फ़ाइल पथ (-p) पुनर्प्राप्त करने के लिए कहते हैं। आउटपुट इस प्रकार दिखता है:
{
"Version": "1.14.15",
"BuildId": "Zb9QmokKTiOUgHKmaIwz/wd2rtE3W9PN-um1Ocdzh/qTdqcTY_jVajHy_-TtYv/Z_kJu9M77OjfijEiHMcF",
"Arch": "amd64",
"TabMeta": {
"VA": 5174784,
"Version": "1.2",
"Endianess": "LittleEndian",
"CpuQuantum": 1,
"CpuQuantumStr": "x86/x64",
"PointerSize": 8
},
"ModuleMeta": {
"VA": 5678816,
"Types": 4845568,
"ETypes": 5171904,
"Typelinks": {
"Data": 5171904,
"Len": 695,
"Capacity": 695
},
"ITablinks": {
"Data": 5174688,
"Len": 11,
"Capacity": 11
},
"LegacyTypes": {
"Data": 0,
"Len": 0,
"Capacity": 0
}
},
"Types": [ ... ],
"Files": [ ... ],
"Strings": [ ... ],
"UserFunctions": [ ... ],
"StdFunctions": [ ... ]
}
यहाँ सभी उपलब्ध फ़्लैग दिए गए हैं:
-d ("default", वैकल्पिक) फ़्लैग उपयोगकर्ता पैकेजों के अतिरिक्त मानक Go पैकेजों को भी प्रिंट करेगा।-p ("paths", वैकल्पिक) फ़्लैग pclntab में एम्बेड किए गए किसी भी फ़ाइल पथ को प्रिंट करेगा।-t ("types", वैकल्पिक) फ़्लैग Go प्रकार के नाम प्रिंट करेगा।-strings (वैकल्पिक) फ़्लैग स्ट्रिंग इंटर्नमेंट तालिका का विश्लेषण करके बाइनरी से एम्बेड किए गए Go स्ट्रिंग्स को निकालेगा।-m <virtual address> ("manual", वैकल्पिक) फ़्लैग दिए गए वर्चुअल एड्रेस पर RTYPE संरचना को पुनरावर्ती रूप से डंप करेगा-v <version string> ("version", वैकल्पिक) फ़्लैग स्वचालित संस्करण पहचान को ओवरराइड करेगा और प्रदान किए गए संस्करण का उपयोग करेगा। यह कुछ स्ट्रिप्ड बाइनरीज़ के लिए आवश्यक है। यदि संस्करण सटीक नहीं है तो प्रकार पार्सिंग विफल हो जाएगी।-human (वैकल्पिक) फ़्लैग JSON के बजाय एक सपाट टेक्स्ट सूची प्रिंट करेगा। संरचना और इंटरफ़ेस प्रकारों को प्रिंट करते समय विशेष रूप से उपयोगी।-about (वैकल्पिक) फ़्लैग लाइसेंस जानकारी प्रिंट करेगाइस जानकारी को IDA Pro में आयात करने के लिए आप https://github.com/mandiant/GoReSym/blob/master/IDAPython/goresym_rename.py में मौजूद स्क्रिप्ट चला सकते हैं। यह GoReSym द्वारा उत्पादित एक json फ़ाइल पढ़ेगी और IDA में सिंबल/लेबल सेट करेगी।
चूँकि Go कंपाइलर और रनटाइम बदल गए हैं, वैसे ही एम्बेडेड मेटाडेटा संरचनाएँ भी बदल गई हैं। GoReSym Go रिलीज़ और मेटाडेटा के निम्नलिखित संयोजनों का समर्थन करता है:
pclntab पार्सिंग: >= Go 1.2moduledata स्थान: >= Go 1.2moduledata प्रकार पार्सिंग: >= Go 1.5प्रकारों को निकालने के लिए उपयोग की जाने वाली moduledata तालिका Go 1.5 से पहले मौजूद नहीं थी, इसलिए यह लाइब्रेरी बहुत पुराने Go संस्करणों से प्रकार निकालने का समर्थन कभी नहीं करेगी।
यह लाइब्रेरी वर्तमान में 1.2 से पहले, 1.2, 1.16, 1.18, और 1.20 के pclntab लेआउट को संभालती है। ध्यान दें कि pclntab संस्करण हमेशा <= Go रनटाइम संस्करण होता है (उदाहरण: Go रनटाइम 1.19, 1.18 pclntab लेआउट का उपयोग करता है), हमारा लक्ष्य हमेशा नवीनतम रनटाइम संस्करणों का समर्थन करना है।
GoReSym का अधिकांश स्रोत कोड अपस्ट्रीम Go कंपाइलर स्रोत निर्देशिका /internal से कॉपी किया गया है। इसे कार्यशील बनाने के लिए, हमें स्रोत को थोड़ा संशोधित करना पड़ा। यदि आप GoReSym में योगदान देना चाहते हैं, तो आगे पढ़ें ताकि हम इस आयात प्रक्रिया को समझा सकें।
Go पैकेजों के कार्य करने के तरीके के कारण, हमें स्रोत फ़ाइल ट्री से /internal पथ को हटाना पड़ा। इसके परिणामस्वरूप आंतरिक Go फ़ाइलों की बहुत सारी प्रतिलिपि बनाई गई, जहाँ निर्देशिका ट्री अधिकतर बरकरार है लेकिन कई फ़ाइलों के इम्पोर्ट में छोटे बदलाव हैं: /internal पथों के संदर्भों को github.com/mandiant/GoReSym/ से बदल दिया गया।
हमने फ़ील्ड और मेथड्स को एक्सपोर्ट करने के लिए कई आंतरिक संरचनाओं को भी संशोधित किया। ये Go अपस्ट्रीम द्वारा एक्सपोर्ट नहीं किए जाते क्योंकि उपयोगकर्ताओं को इन पर निर्भर नहीं रहना चाहिए। हालाँकि, इस टूल का उद्देश्य आंतरिक जानकारी निकालना है, इसलिए हम इन संरचनाओं को बनाए रखने का कार्य अपने ऊपर ले रहे हैं। यह एक अच्छी स्थिति नहीं है, लेकिन इससे आसानी से बचा नहीं जा सकता। यदि आप इस रिपॉज़िटरी को अपडेट करते हैं, तो आपको इन संशोधनों को बरकरार रखने का ध्यान रखना होगा। अपस्ट्रीम फ़ाइलों को पूरी तरह कॉपी करने के बजाय अपस्ट्रीम से कमिट्स को मैन्युअल रूप से मर्ज करना शायद बेहतर होगा।
मैं इस बारे में सुझावों के लिए खुला हूँ कि इस प्रोजेक्ट को बेहतर ढंग से कैसे संरचित किया जाए ताकि इन समस्याओं से बचा जा सके और फिर भी सामान्य go build के साथ संकलन हो सके। Go मेंटेनर्स से जुड़ी एक पिछली चर्चा यहाँ है।
कुछ मामूली बदलावों को छोड़कर, अधिकांश नया लॉजिक /objfile में मौजूद है। उदाहरण के लिए, फ़ाइल objfile/internals उन रिवर्स्ड आंतरिक Go संरचनाओं को परिभाषित करती है जिन्हें GoReSym पार्स करता है।
pclntab विनिर्देश: golang.org/s/go12symtabpclntab मैजिक्स: pclntab.go#L169objfile बग:
buildID लीगेसी बग: golang/go#50809