
ret-sync एक प्लगइन्स का सेट है जो डिबगिंग सत्र (WinDbg/GDB/LLDB/OllyDbg2/x64dbg) को IDA/Ghidra/Binary Ninja डिसअसेंबलरों के साथ सिंक्रोनाइज़ करने में मदद करता है।
ret-sync का मतलब Reverse-Engineering Tools SYNChronization है। यह प्लगइन्स का एक सेट है जो डिबगिंग सत्र (WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg) को डिसअसेंबलर (IDA/Ghidra/Binary Ninja) के साथ सिंक्रोनाइज़ करने में मदद करता है। मूल विचार सरल है: दोनों दुनियाओं (स्थैतिक और गतिशील विश्लेषण) से सर्वश्रेष्ठ लेना।
डीबगर्स और गतिशील विश्लेषण हमें प्रदान करते हैं:
!peb, !drvobj,
!address, आदि)डिसअसेंबलर और स्थैतिक विश्लेषण हमें प्रदान करते हैं:
मुख्य विशेषताएं:
ret-sync qb-sync का एक फ़ोर्क है जिसे मैंने Quarkslab में अपने प्रवास के दौरान विकसित और रखरखाव किया था।
डीबगर प्लगइन्स:
ext_windbg/sync: WinDbg एक्सटेंशन स्रोत फ़ाइलें, निर्माण के बाद: sync.dllext_gdb/sync.py: GDB प्लगइनext_lldb/sync.py: LLDB प्लगइनext_olly1: OllyDbg 1.10 प्लगइनext_olly2: OllyDbg v2 प्लगइनext_x64dbg: x64dbg प्लगइनडिसअसेंबलर प्लगइन्स:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip: Ghidra प्लगइनext_bn/retsync: Binary Ninja प्लगइनऔर लाइब्रेरी प्लगइन:
ext_lib/sync.py: स्वतंत्र पायथन लाइब्रेरीIDA और GDB प्लगइन्स को एक मान्य पायथन सेटअप की आवश्यकता होती है। पायथन 2 (>=2.7) और पायथन 3 समर्थित हैं।
WinDbg/OllyDbg/OllyDbg2/x64dbg डीबगर्स के लिए पूर्व-निर्मित बाइनरी एक Azure DevOps पाइपलाइन के माध्यम से प्रस्तावित हैं:
अंतिम बिल्ड चुनें और Related अनुभाग के अंतर्गत आर्टिफैक्ट्स की जाँच करें: 6 प्रकाशित।

Ghidra प्लगइन का एक पूर्व-निर्मित प्लगइन आर्काइव ext_ghidra/dist में प्रदान किया गया है।
ret-sync अधिकांश उपयोगकर्ताओं के लिए एक सामान्य सेटअप के साथ बॉक्स के बाहर काम करना चाहिए: डीबगर और डिसअसेंबलर एक ही होस्ट पर, मॉड्यूल नाम मेल खाते हैं।
फिर भी, कुछ परिदृश्यों में एक विशिष्ट कॉन्फ़िगरेशन का उपयोग किया जा सकता है। इसके लिए, एक्सटेंशन और प्लगइन्स उपयोगकर्ता की होम डायरेक्टरी में एक वैकल्पिक वैश्विक कॉन्फ़िगरेशन फ़ाइल .sync की जाँच करते हैं। यह एक मान्य .INI फ़ाइल होनी चाहिए।
इसके अतिरिक्त, IDA और Ghidra प्लगइन्स पहले IDB या प्रोजेक्ट डायरेक्टरी (<project>.rep) में कॉन्फ़िगरेशन फ़ाइल की तलाश करते हैं ताकि स्थानीय, प्रति-IDB/प्रोजेक्ट सेटिंग्स की अनुमति मिल सके। यदि कोई स्थानीय कॉन्फ़िगरेशन फ़ाइल मौजूद है, तो वैश्विक कॉन्फ़िगरेशन फ़ाइल को अनदेखा कर दिया जाता है।
इन कॉन्फ़िगरेशन फ़ाइलों में घोषित मान डिफ़ॉल्ट मानों को ओवरराइड करते हैं। कृपया ध्यान दें, कि डिफ़ॉल्ट रूप से कोई .sync फ़ाइल नहीं बनाई जाती है।
नीचे हम तीन सामान्य परिदृश्यों का विवरण देते हैं जहाँ एक कॉन्फ़िगरेशन फ़ाइल उपयोगी/आवश्यक है:
[INTERFACE] सेक्शन का उपयोग नेटवर्क संबंधी सेटिंग्स को अनुकूलित करने के लिए किया जाता है। मान लीजिए कि कोई IDA को एक वर्चुअल मशीन (या बस दूसरे होस्ट) के अंदर चल रहे डीबगर के साथ सिंक्रोनाइज़ करना चाहता है, जो सामान्य रिमोट कर्नेल डीबगिंग परिदृश्य है।
बस दो .sync फ़ाइल बनाएँ:
यह **ret-sync** ``IDA`` प्लगइन को इंटरफ़ेस ``192.168.128.1`` पर पोर्ट ``9234`` के साथ सुनने का निर्देश देता है। यह कहने की आवश्यकता नहीं है कि यह इंटरफ़ेस रिमोट होस्ट या वर्चुअल मशीन से पहुँच योग्य होना चाहिए।
* एक उस मशीन पर जहाँ डीबगर निष्पादित किया जाता है, उपयोगकर्ता की होम निर्देशिका में:```
[INTERFACE]
host=192.168.128.1
port=9234
यह ret-sync डीबगर प्लगइन को पहले से कॉन्फ़िगर किए गए ret-sync IDA प्लगइन से इस इंटरफ़ेस पर सुनने के लिए कनेक्ट करने का निर्देश देता है।
नोट: आपको यहाँ एक वास्तविक IP निर्दिष्ट करना होगा, न कि 0.0.0.0 का उपयोग करना। ऐसा इसलिए है क्योंकि वेरिएबल का उपयोग कई स्रोतों द्वारा बाइंडिंग और कनेक्टिंग दोनों के लिए किया जाता है, इसलिए 0.0.0.0 का उपयोग करने से अजीब त्रुटियाँ होंगी।
[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe
The ``[ALIASES]`` अनुभाग का उपयोग उस नाम को अनुकूलित करने के लिए किया जाता है जो एक डिस्सेम्बलर (IDA/Ghidra) द्वारा किसी मॉड्यूल को उसके डिस्पैचर/प्रोग्राम प्रबंधक में पंजीकृत करने के लिए उपयोग किया जाता है।
डिफ़ॉल्ट रूप से, डिस्सेम्बलर प्लगइन्स इनपुट फ़ाइल का नाम उपयोग करते हैं। हालांकि, हो सकता है कि किसी ने फ़ाइल का पहले से नाम बदल दिया हो और वह डीबगर द्वारा देखे गए वास्तविक प्रक्रिया या लोड किए गए मॉड्यूल के नाम से मेल न खाता हो।
यहाँ हम डिस्पैचर को बस यह बताते हैं कि `ntkrnlmp.exe` (वास्तविक नाम) का मिलान करें, न कि `ntoskrnl_vuln.exe` (IDB नाम) का।
## Qt Creator डिबगिंग फ्रंटएंड के साथ gdb
Qt Creator डिबगिंग फ्रंटएंड gdb कमांड आउटपुट के लॉग होने के तरीके को बदल देता है। चूंकि यह सिंक्रोनाइज़ेशन में हस्तक्षेप करेगा, इसलिए एक विकल्प मौजूद है जो अस्थायी फ़ाइल के बजाय सिंक्रोनाइज़ेशन के लिए रॉ gdb आउटपुट का उपयोग करता है। .sync कॉन्फ़िगरेशन फ़ाइल में उपयोग करें```
[GENERAL]
use_tmp_logging_file=false
यदि आप लक्ष्य के लिए Qt डिबगिंग फ्रंटएंड का उपयोग करना चाहते हैं।
/proc/<pid>/mapsकुछ परिदृश्यों में, जैसे कि सीरियल या QEMU में रॉ फर्मवेयर पर एम्बेडेड उपकरणों को डीबग करना, gdb PID से अवगत नहीं होता है और /proc/<pid>/maps तक पहुँच नहीं सकता है।
इन मामलों में, [INIT] अनुभाग का उपयोग प्लगइन को एक कस्टम कॉन्टेक्स्ट पास करने के लिए किया जाता है। यह PID और मेमोरी मैपिंग जैसे कुछ फ़ील्ड को ओवरराइड करने की अनुमति देता है।
.sync content extract:```
[INIT]
context = {
"pid": 200,
"mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ]
}
प्रत्येक मैपिंग में प्रविष्टियाँ हैं: ``mem_base``, ``mem_end``, ``mem_size``, ``mem_name``।
## स्वचालित पता रीबेसिंग को बायपास करना
कुछ परिदृश्यों में, जैसे कि एम्बेडेड डिवाइसों को डीबग करना या न्यूनतम डीबग इंटरफेस से कनेक्ट करना, डिसअसेंबलर प्लगइन्स में लागू स्वचालित पता रीबेसिंग सुविधा को बायपास करना अधिक सुविधाजनक हो सकता है।
`use_raw_addr` विकल्प वर्तमान में केवल Ghidra के लिए समर्थित है। .sync कॉन्फ़िगरेशन फ़ाइल में उपयोग करें:```
[GENERAL]
use_raw_addr=true
IDA 9.2+ आवश्यक है। पुराने संस्करणों के लिए कृपया उपलब्ध Tags से ida9.2 टैग से पहले के प्रोजेक्ट को चेकआउट करें।
IDA इंस्टॉलेशन के लिए, Syncplugin.py और retsync फ़ोल्डर को ext_ida से IDA प्लगइन्स निर्देशिका में कॉपी करें, उदाहरण के लिए:
C:\Program Files\IDA Pro 7.4\plugins%APPDATA%\Hex-Rays\IDA Pro\plugins~/.idapro/pluginsAlt-Shift-S) या Edit -> Plugins -> ``ret-sync`````
[sync] default idb name: ld.exe
[sync] sync enabled
[sync] cmdline: "C:\Program Files\Python38\python.exe" -u "C:\Users\user\AppData\Roaming\Hex-Rays\IDA Pro\plugins\retsync\broker.py" --idb "target.exe"
[sync] module base 0x100400000
[sync] hexrays #7.3.0.190614 found
[sync] broker started
[sync] plugin loaded
[sync] << broker << dispatcher not found, trying to run it
[sync] << broker << dispatcher now runs with pid: 6544
[sync] << broker << connected to dispatcher
[sync] << broker << listening on port 63107### IDA प्लगइन समस्या निवारण
IDA एक्सटेंशन के साथ समस्याओं का निवारण करने के लिए फ़ाइल `retsync/rsconfig.py` में दो विकल्प उपलब्ध हैं:```
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False
Setting LOG_LEVEL value to logging.DEBUG makes the plugin more verbose.
LOG_TO_FILE_ENABLE मान को True पर सेट करने से broker.py और dispatcher.py से अपवाद जानकारी का लॉगिंग समर्पित फ़ाइलों में होता है। लॉग फ़ाइलें %TMP% फ़ोल्डर में retsync.%s.err नाम पैटर्न के साथ उत्पन्न होती हैं।
या तो ext_ghidra/dist फ़ोल्डर से पूर्व-निर्मित संस्करण का उपयोग करें या इसे बनाने के निर्देशों का पालन करें।
प्रत्येक एक्सटेंशन बिल्ड केवल प्लगइन के फ़ाइल नाम में निर्दिष्ट Ghidra संस्करण का समर्थन करता है।
उदा. ghidra_9.1_PUBLIC_20191104_retsync.zip Ghidra 9.1 Public के लिए है।
3. अपने Ghidra इंस्टॉलेशन के लिए एक्सटेंशन बनाएं (`$GHIDRA_DIR` को अपने इंस्टॉलेशन डायरेक्टरी से बदलें)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR
File -> Install Extensions..., + चिह्न पर क्लिक करें और ext_ghidra/dist/ghidra_*_retsync.zip चुनें और OK पर क्लिक करें।
यह प्रभावी रूप से ज़िप से retsync फ़ोल्डर को $GHIDRA_DIR/Extensions/Ghidra/ में निकाल देगा।4. Ghidra CodeBrowser टूल से: सिंक्रोनाइज़ेशन को सक्षम (``Alt+s``)/अक्षम (``Alt+Shift+s``)/पुनरारंभ (``Alt+r``) करने के लिए टूलबार आइकन या शॉर्टकट का उपयोग करें।
एक स्थिति विंडो भी ``Windows`` -> ``RetSyncPlugin`` से उपलब्ध है। आप इसे साइड पर रखना चाहेंगे ताकि यह Ghidra पर्यावरण विंडो के साथ एकीकृत हो जाए।
## Binary Ninja एक्सटेंशन
Binary Ninja समर्थन प्रायोगिक है, सुनिश्चित करें कि आप अपने विश्लेषण डेटाबेस का बैकअप लें।
### Binary Ninja पूर्वापेक्षाएँ
**ret-sync** को कम से कम Binary Ninja संस्करण 2.2 और Python 3 की आवश्यकता है (Python 2 समर्थित नहीं है)।
### Binary Ninja एक्सटेंशन स्थापित करें
**ret-sync** अभी तक Binary Ninja के Plugin Manager के माध्यम से वितरित नहीं किया गया है; मैन्युअल स्थापना आवश्यक है। बस `ext_bn` फ़ोल्डर की सामग्री को Binary Ninja के प्लगइन्स फ़ोल्डर में कॉपी करें, उदाहरण के लिए:
`%APPDATA%\Binary Ninja\plugins`
Binary Ninja को पुनरारंभ करने के बाद, कंसोल विंडो में निम्न आउटपुट मौजूद होना चाहिए:```
[sync] commands added
Loaded python3 plugin 'retsync'
ext_windbg में दिए गए Visual Studio 2017 समाधान का उपयोग करें। Visual Studio Community Edition
2017 और 2026 का सफलतापूर्वक परीक्षण किया गया (बीच के संस्करणों को भी काम करना चाहिए)।
यह x64\release\sync.dll फ़ाइल बनाएगा।
आपको परिणामी sync.dll फ़ाइल को उपयुक्त Windbg एक्सटेंशन पथ में कॉपी करना होगा।
Windbg के पुराने संस्करणों के लिए यह कुछ इस प्रकार है (x86/x64 प्रकारों से सावधान रहें), उदाहरण के लिए
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll
एक्सटेंशन को संग्रहीत करने का फ़ोल्डर PATH पर आधारित प्रतीत होता है, इसलिए आपको इसे खोजे गए स्थानों में से किसी एक पर रखना होगा।
एक उदाहरण इसे यहाँ रखना है:
C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll
.load कमांड)```
0:000> .load sync
[sync.dll] DebugExtensionInitialize, ExtensionApis loaded3. WinDbg को समन्वयित करें```
0:000> !sync
[sync] No argument found, using default host (127.0.0.1:9100)
[sync] sync success, sock 0x5a8
[sync] probing sync
[sync] sync is now enabled with host 127.0.0.1
उदाहरण के लिए, IDA के आउटपुट विंडो में``` [] << broker << dispatcher msg: add new client (listening on port 63898), nb client(s): 1 [] << broker << dispatcher msg: new debugger client: dbg connect - HostMachine\HostUser [sync] set debugger dialect to windbg, enabling hotkeys
यदि Windbg का वर्तमान मॉड्यूल IDA फ़ाइल नाम से मेल खाता है```
[sync] idb is enabled with the idb client matching the module name.
नोट: यदि आपको निम्न त्रुटि मिलती है, तो इसका कारण यह है कि आपने ऊपर दिए गए चरणों में फ़ाइल को सही फ़ोल्डर में कॉपी नहीं किया है।``` 0: kd> .load sync The call to LoadLibrary(sync) failed, Win32 error 0n2 "The system cannot find the file specified." Please check your debugger configuration and/or network access.
नीचे दी गई त्रुटि का आमतौर पर अर्थ है कि Windbg ने एक्सटेंशन का गलत संस्करण लोड करने का प्रयास किया, उदाहरण: ``x64`` के स्थान पर ``x86`` `sync.dll`।```
0:000> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n193
"%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.
जैसे WinDbg Preview दोनों प्लगइन्स (x86 और x64) को एक ही निर्देशिका से लोड करता है, कोई भी x86 फ़ाइल sync32.dll का नाम बदल सकता है।```
0:000> .load sync32
## GNU gdb (GDB) स्थापना
1. `ext_gdb/sync.py` को अपनी पसंद की निर्देशिका में कॉपी करें
2. एक्सटेंशन लोड करें (ऑटो-लोड स्क्रिप्ट्स देखें)```
gdb> source sync.py
[sync] configuration file loaded 192.168.52.1:9100
[sync] commands added
~/.lldbinit में भी जोड़ा जा सकता है)```
lldb> command script import sync## OllyDbg 1.10 स्थापना
OllyDbg 1.10 का समर्थन प्रायोगिक है, हालांकि:
1. VS समाधान का उपयोग करके प्लगइन बनाएँ (वैकल्पिक, पूर्व-निर्मित बाइनरी देखें)
2. dll को OllyDbg के प्लगइन निर्देशिका में कॉपी करें
## OllyDbg2 स्थापना
OllyDbg2 का समर्थन प्रायोगिक है, हालांकि:
1. VS समाधान का उपयोग करके प्लगइन बनाएँ (वैकल्पिक, पूर्व-निर्मित बाइनरी देखें)
2. dll को OllyDbg2 के प्लगइन निर्देशिका में कॉपी करें
## x64dbg स्थापना
testplugin पर आधारित, https://github.com/x64dbg/testplugin. x64dbg का समर्थन प्रायोगिक है, हालांकि:
1. VS समाधान का उपयोग करके प्लगइन बनाएँ (वैकल्पिक, पूर्व-निर्मित बाइनरी देखें)।
आपको प्लगइन sdk के एक अलग संस्करण की आवश्यकता हो सकती है,
एक प्रति x64dbg के प्रत्येक रिलीज़ में पाई जा सकती है।
"``pluginsdk``" निर्देशिका को "``ext_x64dbg\x64dbg_sync``" में पेस्ट करें
2. dll (एक्सटेंशन ``.d32`` या ``.dp64`` है) को x64dbg के प्लगइन निर्देशिका में कॉपी करें।
# उपयोग
## **ret-sync** डीबगर कमांड
कमांड-लाइन उन्मुख डीबगर्स (मुख्य रूप से Windbg और GDB) के लिए कमांड का एक सेट
**ret-sync** द्वारा रिवर्स-इंजीनियरिंग कार्य में सहायता के लिए प्रदर्शित किया जाता है।
नीचे दिए गए कमांड सामान्य (Windbg और GDB) हैं, कृपया ध्यान दें कि WinDbg पर एक `!`
उपसर्ग की आवश्यकता है (जैसे: GDB में `sync`, WinDbg में `!sync`)।
| डीबगर कमांड | विवरण |
|----------------------------|-------------------------------------------------------------------------------------------|
| `synchelp` | उपलब्ध कमांड की सूची संक्षिप्त विवरण के साथ प्रदर्शित करें |
| `sync` | सिंक्रनाइज़ेशन प्रारंभ करें |
| `syncoff` | सिंक्रनाइज़ेशन रोकें |
| `cmt [-a address] <string>` | डिसअसेंबलर में वर्तमान ip पर एक टिप्पणी जोड़ें |
| `rcmt [-a address]` | डिसअसेंबलर में वर्तमान ip पर टिप्पणी रीसेट करें |
| `fcmt [-a address] <string>` | उस फ़ंक्शन के लिए फ़ंक्शन टिप्पणी जोड़ें जिसमें वर्तमान ip स्थित है |
| `raddr <expression>` | अभिव्यक्ति से पुनर्स्थापित पते के साथ एक टिप्पणी जोड़ें |
| `rln <expression>` | दिए गए पते के लिए डिसअसेंबलर से प्रतीक प्राप्त करें |
| `lbl [-a address] <string>` | डिसअसेंबलर में वर्तमान ip पर एक लेबल नाम जोड़ें |
| `cmd <string>` | डीबगर में एक कमांड निष्पादित करें और उसका आउटपुट डिसअसेंबलर में वर्तमान ip पर टिप्पणी के रूप में जोड़ें |
| `bc <\|\|on\|off\|set 0xBBGGRR>` | डिसअसेंबलर में पथ रंगाई सक्षम/अक्षम करें |
| `idblist` | डिस्पैचर से जुड़े सभी IDB क्लाइंट की सूची प्राप्त करें |
| `syncmodauto <on\|off>` | मॉड्यूल नाम के आधार पर डिसअसेंबलर ऑटो स्विच सक्षम/अक्षम करें |
| `idbn <n>` | सक्रिय IDB को nth क्लाइंट पर सेट करें |
| `jmpto <expression>` | |
| `jmpraw <expression>` | यदि कोई IDB सक्षम है तो डिसअसेंबलर का दृश्य परिणामी पते के साथ सिंक हो जाता है। |
| `translate <base> <addr> <mod>` | एक पते को उसके मॉड्यूल के नाम और ऑफ़सेट के संबंध में रीबेस करें |
WinDbg विशिष्ट कमांड:
| डीबगर कमांड | विवरण |
|----------------------------|-------------------------------------------------------------------------------------------|
| `curmod` | वर्तमान निर्देश ऑफ़सेट के लिए मॉड्यूल जानकारी प्रदर्शित करें (समस्या निवारण के लिए) |
| `modlist` | सक्रिय आईडीबी स्विचिंग को आसान बनाने के लिए डीबगर मार्कअप लैंग्वेज (डीएमएल) संवर्धित मॉड्यूल सूची |
| `idb <module name>` | दिए गए मॉड्यूल को सक्रिय idb के रूप में सेट करें (देखें `modlist` का `lm` का उन्नत संस्करण) |
| `modmap <base> <size> <name>` | एक सिंथेटिक ("नकली") मॉड्यूल (इसके आधार पते और आकार का उपयोग करके परिभाषित) डीबगर की आंतरिक सूची में जोड़ा जाता है |
| `modunmap <base>` | आधार पते पर पहले से मैप किए गए सिंथेटिक मॉड्यूल को हटाएं |
| `modcheck <\|\|md5>` | यह जांचने के लिए उपयोग करें कि क्या वर्तमान मॉड्यूल वास्तव में IDB की फ़ाइल से मेल खाता है (उदा: मॉड्यूल अपडेट किया गया है) |
| `bpcmds <\|\|save\|load\|>` | **bpcmds** रैपर, वर्तमान IDB में **.bpcmds** (ब्रेकपॉइंट कमांड सूची) आउटपुट को सहेजें और पुनः लोड करें |
| `ks` | **kv** कमांड का डीबगर मार्कअप लैंग्वेज (डीएमएल) संवर्धित आउटपुट |
GDB विशिष्ट कमांड:
| डीबगर कमांड | विवरण |
|----------------------------|-------------------------------------------------------------------------------------------|
|`bbt` | सुंदर बैकट्रेस। GDB में **bt** के समान लेकिन डिसअसेंबलर से प्रतीकों का अनुरोध करता है |
| `patch` | लाइव संदर्भ के आधार पर डिसअसेंबलर में बाइट्स पैच करें |
| `bx` | GDB **x** के समान लेकिन प्रतीक का उपयोग करके। प्रतीक डिसअसेंबलर द्वारा हल किया जाएगा |
| `cc` | डिसअसेंबलर में कर्सर पर जारी रखें |
## IDA उपयोग
### IDA प्लगइन का GUI
``Overwrite idb name`` इनपुट फ़ील्ड डिफ़ॉल्ट IDB
नाम बदलने के लिए है। यह वह नाम है जिसका उपयोग प्लगइन द्वारा डिस्पैचर के साथ पंजीकरण करने के लिए किया जाता है। IDB स्वचालित स्विच मॉड्यूल नाम मिलान पर आधारित है। संघर्ष नामों (जैसे ``foo.exe`` और ``foo.dll``) के मामले में, इसका उपयोग मिलान को आसान बनाने के लिए किया जा सकता है। कृपया ध्यान दें, यदि आप सिंक सक्रिय होने पर इनपुट फ़ील्ड को संशोधित करते हैं, तो आपको डिस्पैचर के साथ पुनः पंजीकरण करना होगा; यह केवल "``Restart``" बटन का उपयोग करके किया जा सकता है।
एक अनुस्मारक के रूप में डिफ़ॉल्ट रूप से ``.sync`` कॉन्फ़िगरेशन फ़ाइल का उपयोग करके उपनाम देना संभव है।
### IDA वैश्विक शॉर्टकट
**ret-sync** IDA में ये वैश्विक शॉर्टकट परिभाषित करता है:
* ``Alt-Shift-S`` - **ret-sync** प्लगइन चलाएँ
* ``Ctrl-Shift-S`` - वैश्विक सिंकिंग टॉगल करें
* ``Ctrl-H`` - Hex-Rays सिंकिंग टॉगल करें
वैश्विक और Hex-Rays सिंकिंग को टॉगल करने के लिए डीबग टूलबार में दो बटन भी उपलब्ध हैं।
### IDA डीबगर कमांड पर बाइंडिंग
``Syncplugin.py`` डीबगर कमांड रैपर हॉटकी भी पंजीकृत करता है।
* ``F2`` - कर्सर पते पर ब्रेकपॉइंट सेट करें
* ``F3`` - कर्सर पते पर वन-शॉट ब्रेकपॉइंट सेट करें
* ``Ctrl-F2`` - कर्सर पते पर हार्डवेयर ब्रेकपॉइंट सेट करें
* ``Ctrl-F3`` - कर्सर पते पर वन-शॉट हार्डवेयर ब्रेकपॉइंट सेट करें
* ``Alt-F2`` - वर्तमान कर्सर पते का अनुवाद करें (डीबगर में रीबेस करें)
* ``Alt-F5`` - जाएँ
* ``Ctrl-Alt-F5`` - चलाएँ (केवल GDB)
* ``F10`` - एकल चरण
* ``F11`` - एकल ट्रेस
ये कमांड केवल तभी उपलब्ध हैं जब वर्तमान IDB सक्रिय हो। जहाँ संभव हो, इन्हें अन्य डीबगर्स के लिए भी लागू किया गया है।
## Ghidra उपयोग
### Ghidra प्लगइन का GUI
एक बार RetSyncPlugin खोलने के बाद, आप इसे सरल ड्रैग'एन'ड्रॉप द्वारा CodeBrowser विंडो में जोड़ सकते हैं:

यदि आप कई मॉड्यूल देखना चाहते हैं, तो फ़ाइलों को एक ही CodeBrowser दृश्य में खोलने की आवश्यकता है, बस अतिरिक्त फ़ाइलों को CodeBrowser विंडो में ड्रैग'एन'ड्रॉप करें जैसा कि ऊपर परिणाम प्राप्त करने के लिए।
### Ghidra वैश्विक शॉर्टकट
**ret-sync** Ghidra में ये वैश्विक शॉर्टकट परिभाषित करता है:
* ``Alt-S`` - सिंकिंग सक्षम करें
* ``Alt-Shift-S`` - सिंकिंग अक्षम करें
* ``Alt-R`` - सिंकिंग पुनः प्रारंभ करें
* ``Alt-Shift-R`` - कॉन्फ़िगरेशन पुनः लोड करें
### Ghidra डीबगर कमांड पर बाइंडिंग
डीबगर कमांड पर बाइंडिंग भी लागू की गई हैं। वे IDA के एक्सटेंशन के समान हैं ("Go" कमांड को छोड़कर)।
* ``F2`` - कर्सर पते पर ब्रेकपॉइंट सेट करें
* ``Ctrl-F2`` - कर्सर पते पर हार्डवेयर ब्रेकपॉइंट सेट करें
* ``Alt-F3`` - कर्सर पते पर वन-शॉट ब्रेकपॉइंट सेट करें
* ``Ctrl-F3`` - कर्सर पते पर वन-शॉट हार्डवेयर ब्रेकपॉइंट सेट करें
* ``Alt-F2`` - वर्तमान कर्सर पते का अनुवाद करें (डीबगर में रीबेस करें)
* ``F5`` - जाएँ
* ``Alt-F5`` - चलाएँ (केवल GDB)
* ``F10`` - एकल चरण
* ``F11`` - एकल ट्रेस
## Binary Ninja उपयोग
### Binary Ninja वैश्विक शॉर्टकट
**ret-sync** Binary Ninja में ये वैश्विक शॉर्टकट परिभाषित करता है:
* ``Alt-S`` - सिंकिंग सक्षम करें
* ``Alt-Shift-S`` - सिंकिंग अक्षम करें
### Binary Ninja शॉर्टकट
डीबगर कमांड पर बाइंडिंग भी लागू की गई हैं। वे IDA के एक्सटेंशन के समान हैं।
* ``F2`` - कर्सर पते पर ब्रेकपॉइंट सेट करें
* ``Ctrl-F2`` - कर्सर पते पर हार्डवेयर ब्रेकपॉइंट सेट करें
* ``Alt-F3`` - कर्सर पते पर वन-शॉट ब्रेकपॉइंट सेट करें
* ``Ctrl-F3`` - कर्सर पते पर वन-शॉट हार्डवेयर ब्रेकपॉइंट सेट करें
* ``Alt-F2`` - वर्तमान कर्सर पते का अनुवाद करें (डीबगर में रीबेस करें)
* ``Alt-F5`` - जाएँ
* ``F10`` - एकल चरण
* ``F11`` - एकल ट्रेस
## WinDbg उपयोग
### WinDbg प्लगइन कमांड
* **!sync**: सिंक्रनाइज़ेशन प्रारंभ करें
* **!syncoff**: सिंक्रनाइज़ेशन रोकें
* **!synchelp**: उपलब्ध कमांड की सूची संक्षिप्त विवरण के साथ प्रदर्शित करें।
* **!cmt [-a address] <string>**: IDA में वर्तमान ip पर टिप्पणी जोड़ें```
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
0:000:x86> dd esp 8
0028ed94 00000000 00433845 0028eebc 00000032
0028eda4 0028f88c 00000064 002b049e 00000110
0:000:x86> !cmt 0028ed94 00000000 00433845 0028eebc 00000032
[sync.dll] !cmt called
[IDA]
.text:00430DB1 push edi ; 0028ed94 00000000 00433845 0028eebc 00000032
!rcmt [-a address]: IDA में वर्तमान IP पर टिप्पणी रीसेट करें``` [WinDbg] 0:000:x86> !rcmt [sync] !rcmt called
[IDA] .text:00430DB1 push edi
* **!fcmt [-a address] <string>**: एक function comment जोड़ें उस फंक्शन के लिए जिसमें वर्तमान ip स्थित है```
[WinDbg]
0:000:x86> !fcmt decodes buffer with key
[sync] !fcmt called
[IDA]
.text:004012E0 ; decodes buffer with key
.text:004012E0 public decrypt_func
.text:004012E0 decrypt_func proc near
.text:004012E0 push ebp
नोट: इस कमांड को बिना तर्क के कॉल करने से फ़ंक्शन की टिप्पणी रीसेट हो जाती है।
!raddr : एक्सप्रेशन से मूल्यांकित rebased पते के साथ एक टिप्पणी जोड़ें
!rln : दिए गए पते के लिए डिसअसेंबलर से प्रतीक प्राप्त करें
!lbl [-a address] : डिसअसेंबलर में वर्तमान ip पर एक लेबल नाम जोड़ें``` [WinDbg] 0:000:x86> !lbl meaningful_label [sync] !lbl called
[IDA] .text:000000000040271E meaningful_label: .text:000000000040271E mov rdx, rsp
* **!cmd <string>**: WinDbg में एक कमांड निष्पादित करें और डिस्सेम्बलर में वर्तमान ip पर इसके आउटपुट को टिप्पणी के रूप में जोड़ें।```
[WinDbg]
0:000:x86> pr
eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
image00000000_00400000+0x30db1:
00430db1 57 push edi
[sync.dll] !cmd r edi
[IDA]
.text:00430DB1 push edi ; edi=00000064
currently connected idb(s): [0] target.exe
* **!syncmodauto <on|off>**: डिस्सेम्बलर ऑटो स्विच को मॉड्यूल नाम के आधार पर सक्षम/अक्षम करें:```
[WinDbg]
0:000> !syncmodauto off
[IDA]
[*] << broker << dispatcher msg: sync mode auto set to off
current idb set to 0
इस उदाहरण में, वर्तमान सक्रिय IDB क्लाइंट सेट किया गया होगा:```
[0] target.exe.
Alt-F2 शॉर्टकट), अपने मॉड्यूल के नाम और ऑफसेट के संबंध में एक पते को रीबेस करें।!cmt, !rcmt और !fcmt कमांड एक वैकल्पिक पता विकल्प का समर्थन करते हैं: -a या --address।
पता हेक्साडेसिमल मान के रूप में पारित किया जाना चाहिए। कमांड पार्सिंग python के
argparse मॉड्यूल पर आधारित है। लाइन पार्सिंग को रोकने के लिए -- का उपयोग करें।```
[WinDbg]
0:000:x86> !cmt -a 0x430DB2 comment
पता एक मान्य निर्देश का पता होना चाहिए।
## GNU gdb (GDB) उपयोग
होस्ट के साथ सिंक करें:```
gdb> sync
[sync] sync is now enabled with host 192.168.52.1
<not running>
gdb> r
Starting program: /bin/ls
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
कमांड का उपयोग करें, बिना "!" उपसर्ग के``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi
(gdb) synchelp
[sync] extension commands help:
> sync <host>
> syncoff
> cmt [-a address] <string>
> rcmt [-a address] <string>
> fcmt [-a address] <string>
> cmd <string>
> bc <on|off|>
> rln <address>
> bbt <symbol>
> patch <addr> <count> <size>
> bx /i <symbol>
> cc
> translate <base> <addr> <mod>
* **rln**: दिए गए पते के लिए IDB से प्रतीक प्राप्त करें
* **bbt**: सुंदर बैकट्रेस। **bt** के समान लेकिन डिसअसेंबलर से प्रतीक अनुरोध करता है```
(gdb) bt
#0 0x0000000000a91a73 in ?? ()
#1 0x0000000000a6d994 in ?? ()
#2 0x0000000000a89125 in ?? ()
#3 0x0000000000a8a574 in ?? ()
#4 0x000000000044f83b in ?? ()
#5 0x0000000000000000 in ?? ()
(gdb) bbt
#0 0x0000000000a91a73 in IKE_GetAssembledPkt ()
#1 0x0000000000a6d994 in catcher ()
#2 0x0000000000a89125 in IKEProcessMsg ()
#3 0x0000000000a8a574 in IkeDaemon ()
#4 0x000000000044f83b in sub_44F7D0 ()
#5 0x0000000000000000 in ()
patch: लाइव संदर्भ के आधार पर डिसअसेंबलर में बाइट्स पैच करें
bx: सुंदर प्रदर्शन। x के समान लेकिन प्रतीक का उपयोग करते हुए। प्रतीक डिसअसेंबलर द्वारा हल किया जाएगा।
cc: डिसअसेंबलर में कर्सर पर जारी रखें। यह F3 का उपयोग करने का एक विकल्प है
एक-शॉट ब्रेकपॉइंट सेट करने और F5 को जारी रखने के लिए। यह उपयोगी है यदि आप
इसे gdb से करना पसंद करते हैं।```
(gdb) b* 0xA91A73
Breakpoint 1 at 0xa91a73
(gdb) c
Continuing.
Breakpoint 1, 0x0000000000a91a73 in ?? () (gdb) cc [sync] current cursor: 0xa91a7f [sync] reached successfully (gdb)
## LLDB उपयोग
1. होस्ट के साथ समन्वयित करें```
lldb> process launch -s
lldb> sync
[sync] connecting to localhost
[sync] sync is now enabled with host localhost
[sync] event handler started
sync = synchronize with or the default value syncoff = stop synchronization cmt = add comment at current eip in IDA rcmt = reset comments at current eip in IDA fcmt = add a function comment for 'f = get_func(eip)' in IDA cmd = execute command and add its output as comment at current eip in IDA bc <on|off|> = enable/disable path coloring in IDA color a single instruction at current eip if called without argument lldb> cmt mooo
## OllyDbg 1.10 का उपयोग
1. सिंक्रोनाइज़ेशन सक्षम करने (``Alt+s``)/अक्षम करने (``Alt+u``) के लिए प्लगइन मेनू या शॉर्टकट का उपयोग करें।
## OllyDbg2 का उपयोग
1. सिंक्रोनाइज़ेशन सक्षम करने (``Ctrl+s``)/अक्षम करने (``Ctrl+u``) के लिए प्लगइन मेनू या शॉर्टकट का उपयोग करें।
OllyDbg2 API की बीटा स्थिति के कारण, केवल निम्नलिखित सुविधाएँ लागू की गई हैं:
- ग्राफ़ सिंक [स्टेपिंग के लिए ``F7``; ``F8`` का उपयोग करें]
- टिप्पणी [``CTRL+;`` का उपयोग करें]
- लेबल [``CTRL+:`` का उपयोग करें]
## x64dbg का उपयोग
1. सिंक्रोनाइज़ेशन सक्षम करने ("``!sync"``) या अक्षम करने ("``!syncoff``") के लिए प्लगइन मेनू या कमांड का उपयोग करें।
2. कमांड का उपयोग करें```
[sync] synchelp command!
[sync] extension commands help:
> !sync = synchronize with <host from conf> or the default value
> !syncoff = stop synchronization
> !syncmodauto <on | off> = enable / disable idb auto switch based on module name
> !synchelp = display this help
> !cmt <string> = add comment at current eip in IDA
> !rcmt <string> = reset comments at current eip in IDA
> !idblist = display list of all IDB clients connected to the dispatcher
> !idb <module name> = set given module as the active idb (see !idblist)
> !idbn <n> = set active idb to the n_th client. n should be a valid decimal value
> !translate <base> <addr> <mod> = rebase an address with respect to local module's base
> !insync = synchronize the selected instruction block in the disassembly window.
नोट: एक डिस्सेम्बलर (IDA/Ghidra, Alt-F2 शॉर्टकट) से !translate कमांड का उपयोग करने पर, डिस्सेम्बलर विंडो विशिष्ट पते पर "कूद" जाएगी (x64dbg कमांड लाइन में disasm चलाने के बराबर)।
कोई व्यक्ति ret-sync की मुख्य सुविधाओं (डिस्सेम्बलर के साथ स्थिति सिंकिंग, प्रतीक समाधान) का उपयोग करना चाह सकता है, भले ही पूर्ण डीबगिंग वातावरण उपलब्ध न हो या कस्टम टूल के साथ हो। इस उद्देश्य के लिए, एक न्यूनतम पायथन लाइब्रेरी निकाली गई है।
नीचे दिया गया उदाहरण एक स्क्रिप्ट के साथ पायथन लाइब्रेरी के उपयोग को दर्शाता है जो इवेंट-आधारित लॉगिंग/ट्रेसिंग टूल के आउटपुट के माध्यम से चलती है।```python from sync import *
HOST = '127.0.0.1'
MAPPINGS = [ [0x555555400000, 0x555555402000, 0x2000, " /bin/tempfile"], [0x7ffff7dd3000, 0x7ffff7dfc000, 0x29000, " /lib/x86_64-linux-gnu/ld-2.27.so"], [0x7ffff7ff7000, 0x7ffff7ffb000, 0x4000, " [vvar]"], [0x7ffff7ffb000, 0x7ffff7ffc000, 0x1000, " [vdso]"], [0x7ffffffde000, 0x7ffffffff000, 0x21000, " [stack]"], ]
EVENTS = [ [0x0000555555400e74, "malloc"], [0x0000555555400eb3, "open"], [0x0000555555400ee8, "exit"] ]
synctool = Sync(HOST, MAPPINGS)
for e in EVENTS: offset, name = e synctool.invoke(offset) print(" 0x%08x - %s" % (offset, name)) print("[>] press enter for next event") input()
# विस्तार
हालाँकि प्रारंभ में डायनामिक विश्लेषण (डीबगर्स) पर ध्यान केंद्रित किया गया था, लेकिन प्लगइन्स सेट का विस्तार करना और अन्य टूल्स के साथ एकीकृत करना संभव है।
- **REVEN** Timeless Analysis and Debugging Platform के साथ एकीकरण [Tetrane](https://www.tetrane.com/) द्वारा:
- http://blog.tetrane.com/2015/02/reven-in-your-toolkit.html
- https://twitter.com/tetrane/status/1374768014193799175
- **EFI DXE Emulator** के साथ एकीकरण Assaf Carlsbad ([@assaf_carlsbad](https://twitter.com/assaf_carlsbad)) द्वारा:
- https://twitter.com/assaf_carlsbad/status/1242114356881641474
- https://github.com/assafcarlsbad/efi_dxe_emulator
अन्य संसाधन:
- "*Combining static and dynamic binary analysis - ret-sync*" Jean-Christophe Delaunay द्वारा
- https://www.synacktiv.com/ressources/bieresecu1_ret-sync_en.pdf
# TODO
- निश्चित।
# ज्ञात बग/सीमाएँ
- Python 2.7/3.7, IDA 7.7 (Windows, Linux और Mac OS X), Ghidra 10.1.1, Binary Ninja 3.0.3225-dev, GNU gdb (GDB) 8.1.0 (Debian), lldb 310.2.37 के साथ परीक्षण किया गया।
- पक्षों के बीच कोई **प्रमाणीकरण/एन्क्रिप्शन** नहीं है; आप अपने आप ही हैं।
- स्व-संशोधित कोड दायरे से बाहर है।
GDB के साथ:
- ऐसा लगता है कि 'return' कमांड का उपयोग करने पर stop event कॉल नहीं होता।
- मल्टी-थ्रेडिंग डीबगिंग में सिग्नल्स के साथ समस्याएँ हैं।
WinDbg के साथ:
- IDA का क्लाइंट प्लगइन को सूचित किया जाता है, भले ही सामना किया गया ब्रेकपॉइंट एक कमांड स्ट्रिंग का उपयोग करता हो जो इसे जारी रखता है ('``g``')। यदि इन घटनाओं की अधिकता हो तो इससे बड़ा धीमा हो सकता है। एक सीमित सुधार लागू किया गया है, सबसे अच्छा समाधान अस्थायी रूप से सिंक बंद करना है।
- संभावित रेस कंडीशन
Ghidra के साथ:
- डीकंपाइलर विजेट में शॉर्टकट्स अपेक्षित रूप से काम नहीं कर रहे हैं।
IDA के साथ:
- बड़े ग्राफ़ के लिए ग्राफ़ विंडो का पुनः चित्रण काफी धीमा है।
- Linux वातावरण में **ret-sync** शॉर्टकट्स में संघर्ष।
संघर्ष:
- Logitech Updater सॉफ्टवेयर समान डिफ़ॉल्ट पोर्ट (9100) का उपयोग करने के लिए जाना जाता है। एक समाधान एक अलग पोर्ट परिभाषित करने के लिए वैश्विक `.sync` कॉन्फ़िगरेशन फ़ाइल का उपयोग करना है।```
[INTERFACE]
host=127.0.0.1
port=9234
ret-sync मुफ्त सॉफ्टवेयर है: आप इसे फ्री सॉफ्टवेयर फाउंडेशन द्वारा प्रकाशित GNU जनरल पब्लिक लाइसेंस की शर्तों के तहत, या तो लाइसेंस के संस्करण 3 के तहत, या (अपनी पसंद पर) किसी भी बाद के संस्करण के तहत पुनर्वितरित और/या संशोधित कर सकते हैं।
यह प्रोग्राम इस उम्मीद में वितरित किया जाता है कि यह उपयोगी होगा, लेकिन बिना किसी वारंटी के; यहां तक कि व्यापारिकता या किसी विशेष उद्देश्य के लिए उपयुक्तता की निहित वारंटी के बिना भी। अधिक जानकारी के लिए GNU जनरल पब्लिक लाइसेंस देखें।
आपको इस प्रोग्राम के साथ GNU जनरल पब्लिक लाइसेंस की एक प्रति प्राप्त होनी चाहिए थी। यदि नहीं, तो http://www.gnu.org/licenses/ देखें।
बाइनरी निंजा प्लगइन MIT लाइसेंस के तहत जारी किया गया है।
ब्रूस डैंग, StalkR, @Ivanlef0u, डेमियन ऑमेत्रे, सेबेस्टियन रेनॉड और केविन स्कुडलाप्स्की, @m00dy, @saidelike, जेवियर मेहरेनबर्गर, ben64, राफेल रिगो, Jiss को उनकी दयालुता, मदद, प्रतिक्रिया और विचारों के लिए। इल्फ़ाक गिलफ़ानोव, इगोर स्कोचिंस्की और अर्नो डीडेरेन को IDA के आंतरिक भागों में उनकी सहायता और उत्कृष्ट समर्थन के लिए। जॉर्डन वीन्स और वेक्टर 35 को धन्यवाद। अंत में, सभी योगदानकर्ताओं और उन सभी को भी धन्यवाद जिन्होंने समस्याओं/बगों की सूचना दी।