
मल्टीथ्रेडेड Modbus/TCP डिटेक्शन स्कैनर, जो C में libmodbus का उपयोग करके लिखा गया है।
libmodbus का उपयोग करके Modbus/TCP सेवाओं का पता लगाने के लिए एक मल्टीथ्रेडेड C स्कैनर।
स्कैनर केवल TCP पोर्ट 502 के खुले होने पर निर्भर नहीं करता। इसके बजाय, यह एक Modbus/TCP कनेक्शन स्थापित करता है और एक एप्लिकेशन-लेयर Modbus अनुरोध भेजता है। एक वैध Modbus प्रतिक्रिया को Modbus सेवा की उपस्थिति का प्राथमिक संकेतक माना जाता है।
Modbus एक औद्योगिक संचार प्रोटोकॉल है जो आमतौर पर PLC, RTU, HMI, SCADA सिस्टम, सेंसर, मीटर और अन्य औद्योगिक उपकरणों द्वारा उपयोग किया जाता है।
Modbus/TCP Modbus एप्लिकेशन प्रोटोकॉल को TCP पर परिवहन करता है।
मानक Modbus/TCP पोर्ट है:
TCP/502
एक सामान्य संचार प्रवाह इस प्रकार है:
स्कैनर
|
| TCP कनेक्शन → 502
|
| Modbus/TCP अनुरोध
v
Modbus डिवाइस
|
| Modbus/TCP प्रतिक्रिया
v
स्कैनर
उन प्रोटोकॉल के विपरीत जो कनेक्ट होने के तुरंत बाद एक बैनर प्रदान करते हैं, Modbus/TCP को आम तौर पर डिवाइस से एप्लिकेशन-लेयर प्रतिक्रिया उत्पन्न करने से पहले क्लाइंट को एक वैध Modbus अनुरोध भेजने की आवश्यकता होती है।
स्कैनर दो चरणों में डिटेक्शन करता है।
स्कैनर निम्नलिखित के लिए TCP कनेक्शन स्थापित करने का प्रयास करता है:
<लक्ष्य>:502
यदि कनेक्शन स्थापित नहीं किया जा सकता है, तो लक्ष्य को Modbus/TCP पर प्रतिक्रिया नहीं देने वाला माना जाता है।
हालाँकि, अकेले एक खुला TCP/502 पोर्ट Modbus का पर्याप्त प्रमाण नहीं माना जाता।
कनेक्ट होने के बाद, स्कैनर libmodbus का उपयोग करके एक Modbus अनुरोध भेजता है।
प्राथमिक प्रोब है:
modbus_read_input_registers(ctx, 0, 1, ®);
यह एक Modbus फंक्शन कोड उत्पन्न करता है:
0x04 - Read Input Registers
अनुरोध लक्ष्य से पते 0 से शुरू होने वाले एक इनपुट रजिस्टर के लिए पूछता है।
यदि लक्ष्य एक वैध Modbus प्रतिक्रिया लौटाता है, तो स्कैनर सेवा का पता लगा हुआ मानता है।
एक Modbus/TCP पैकेट में निम्न शामिल होते हैं:
+----------------------+----------------------+
| MBAP हेडर | PDU |
+----------------------+----------------------+
MBAP हेडर:
+------------------+
| ट्रांज़ैक्शन आईडी | 2 बाइट्स
| प्रोटोकॉल आईडी | 2 बाइट्स
| लंबाई | 2 बाइट्स
| यूनिट पहचानकर्ता | 1 बाइट
+------------------+
PDU:
+------------------+
| फंक्शन कोड | 1 बाइट
| डेटा | N बाइट्स
+------------------+
MBAP हेडर Modbus/TCP के लिए विशिष्ट है।
स्कैनर का पहला प्रोब फंक्शन कोड 0x04 का उपयोग करता है।
एक प्रतिनिधि अनुरोध है:
00 01 00 00 00 06 01 04 00 00 00 01
इसे विभाजित करने पर:
00 01 ट्रांज़ैक्शन आइडेंटिफ़ायर
00 00 प्रोटोकॉल आइडेंटिफ़ायर
00 06 लंबाई
01 यूनिट आइडेंटिफ़ायर
04 फंक्शन कोड
00 00 प्रारंभिक पता
00 01 मात्रा
00 01
ट्रांज़ैक्शन की पहचान करता है।
मान भिन्न हो सकता है क्योंकि ट्रांज़ैक्शन आइडेंटिफ़ायर सामान्यतः Modbus क्लाइंट लाइब्रेरी द्वारा प्रबंधित किया जाता है।
00 00
मान 0 Modbus की पहचान करता है।
00 06
लंबाई फ़ील्ड के बाद आने वाले बाइट्स की संख्या निर्दिष्ट करता है।
01
लक्ष्य Modbus यूनिट की पहचान करता है।
04
फंक्शन कोड 0x04 का अर्थ है:
Read Input Registers
00 00
स्कैनर रजिस्टर पते 0 से शुरू करता है।
00 01
स्कैनर एक रजिस्टर का अनुरोध करता है।
अनुरोध की एक सफल प्रतिक्रिया में फंक्शन कोड 0x04 और अनुरोधित रजिस्टर डेटा होता है।
एक प्रतिनिधि प्रतिक्रिया इस प्रकार दिख सकती है:
00 01 00 00 00 05 01 04 02 00 00
इसे विभाजित करने पर:
00 01 ट्रांज़ैक्शन आइडेंटिफ़ायर
00 00 प्रोटोकॉल आइडेंटिफ़ायर
00 05 लंबाई
01 यूनिट आइडेंटिफ़ायर
04 फंक्शन कोड
02 बाइट गणना
00 00 रजिस्टर मान
डिटेक्शन के लिए महत्वपूर्ण हिस्सा यह है कि लक्ष्य Modbus अनुरोध को सफलतापूर्वक संसाधित करता है और एक वैध Modbus एप्लिकेशन-लेयर प्रतिक्रिया लौटाता है।
वास्तविक रजिस्टर मान डिवाइस पर निर्भर करता है।
केवल जाँच करना:
TCP/502 = OPEN
यह आवश्यक रूप से यह साबित नहीं करता कि सेवा Modbus है।
पोर्ट नंबर परंपराएँ हैं। एक अलग एप्लिकेशन TCP/502 पर सुन सकता है, और एक Modbus डिवाइस अपने कॉन्फ़िगरेशन के आधार पर अलग व्यवहार भी कर सकता है।
इसलिए स्कैनर उपयोग करता है:
TCP कनेक्टिविटी
+
Modbus प्रोटोकॉल प्रतिक्रिया
=
Modbus डिटेक्शन
यह एप्लिकेशन-लेयर डिटेक्शन को एक साधारण पोर्ट स्कैन से अधिक सार्थक बनाता है।
कुछ डिवाइस अपने रजिस्टर कॉन्फ़िगरेशन या समर्थित फंक्शन कोड के कारण प्रारंभिक 0x04 अनुरोध का जवाब नहीं दे सकते हैं।
इसलिए स्कैनर पहला अनुरोध विफल होने पर दूसरा अनुरोध करने का प्रयास करता है:
modbus_read_bits(ctx, 0, 1, bits);
यह फंक्शन कोड का उपयोग करता है:
0x01 - Read Coils
एक प्रतिनिधि अनुरोध है:
00 02 00 00 00 06 01 01 00 00 00 01
विभाजन:
00 02 ट्रांज़ैक्शन आइडेंटिफ़ायर
00 00 प्रोटोकॉल आइडेंटिफ़ायर
00 06 लंबाई
01 यूनिट आइडेंटिफ़ायर
01 फंक्शन कोड
00 00 प्रारंभिक पता
00 01 मात्रा
स्कैनर लक्ष्य का पता तब लगा हुआ मानता है जब कोई भी Modbus ऑपरेशन सफल प्रतिक्रिया प्राप्त करता है।
लक्ष्य IP
|
v
TCP कनेक्शन
पोर्ट 502
|
+------+------+
| |
विफल कनेक्टेड
| |
v v
अनदेखा करें फंक्शन 0x04
|
+------+------+
| |
वैध विफल
| |
v v
MODBUS मिला फंक्शन 0x01
|
+------+------+
| |
वैध विफल
| |
v v
MODBUS मिला कोई डिटेक्शन नहीं
स्कैनर मैन्युअल रूप से प्रोटोकॉल फ्रेम बनाने के बजाय Modbus/TCP पैकेट बनाने और पार्स करने के लिए libmodbus का उपयोग करता है।
प्राथमिक ऑपरेशन है:
modbus_read_input_registers(ctx, 0, 1, ®);
यदि यह विफल होता है:
modbus_read_bits(ctx, 0, 1, bits);
फिर कनेक्शन बंद कर दिया जाता है और libmodbus संदर्भ मुक्त कर दिया जाता है।
यह प्रोटोकॉल हैंडलिंग को Modbus लाइब्रेरी के भीतर रखता है जबकि स्कैनर निम्न को संभालता है:
स्कैनर छोटे कनेक्शन और प्रतिक्रिया टाइमआउट का उपयोग करता है:
#define TIMEOUT_SEC 2
यह एक अकेले अप्राप्य या अनुत्तरदायी होस्ट को एक वर्कर को अत्यधिक समय के लिए अवरुद्ध करने से रोकता है।
औद्योगिक नेटवर्क में अपेक्षाकृत धीमी प्रतिक्रिया वाले डिवाइस हो सकते हैं, इसलिए पर्यावरण के आधार पर टाइमआउट मानों को समायोजित करने की आवश्यकता हो सकती है।
लक्ष्य कई वर्कर थ्रेड्स के बीच विभाजित होते हैं।
उदाहरण के लिए:
थ्रेड 1 → लक्ष्य 1–64
थ्रेड 2 → लक्ष्य 65–128
थ्रेड 3 → लक्ष्य 129–192
थ्रेड 4 → लक्ष्य 193–254
प्रत्येक वर्कर स्वतंत्र रूप से Modbus/TCP डिटेक्शन का प्रयास करता है।
यह प्रत्येक लक्ष्य के लिए अनुक्रमिक रूप से प्रतीक्षा करने के बजाय कई होस्टों का एक साथ परीक्षण करने की अनुमति देता है।
एक सकारात्मक परिणाम का अर्थ है कि लक्ष्य ने स्कैनर द्वारा समझे गए Modbus अनुरोध का सफलतापूर्वक जवाब दिया।
यह आवश्यक रूप से नहीं पहचानता:
वे अलग फ़िंगरप्रिंटिंग या मूल्यांकन कार्य हैं।
स्कैनर मुख्य रूप से एक Modbus/TCP सेवा डिटेक्शन टूल है।
डिटेक्शन विधि जानबूझकर रूढ़िवादी है।
एक डिवाइस Modbus-सक्षम हो सकता है लेकिन डिटेक्शन में विफल हो सकता है यदि:
इसलिए:
कोई प्रतिक्रिया नहीं ≠ निश्चित रूप से Modbus नहीं
इसका अर्थ है कि स्कैनर अपने द्वारा प्रयास किए गए प्रोब का उपयोग करके सफल प्रतिक्रिया प्राप्त नहीं कर सका।
आवश्यक निर्भरताएँ स्थापित करें और संकलित करें:
make
या सीधे:
gcc -Wall -Wextra -O2 -o modbus modbus.c -lmodbus -lpthread
चलाएँ:
./modbus -i 192.168.1.0 -s /24 -t 10 -o results.txt
उदाहरण:
[+] Modbus detected: 192.168.1.20:502
[+] Modbus detected: 192.168.1.42:502
[+] Scanned: 254 | Found: 2 Modbus
[+] Results saved to: results.txt
स्कैनर केवल TCP पोर्ट डिटेक्शन पर निर्भर रहने के बजाय वास्तविक प्रोटोकॉल इंटरैक्शन करके Modbus/TCP सेवाओं का पता लगाता है।
डिटेक्शन प्रक्रिया है:
TCP/502 से कनेक्ट करें
↓
Modbus फंक्शन कोड 0x04 भेजें
↓
वैध Modbus प्रतिक्रिया प्राप्त करें?
↓
हाँ → Modbus detected
|
नहीं
↓
Modbus फंक्शन कोड 0x01 भेजें
↓
वैध Modbus प्रतिक्रिया प्राप्त करें?
↓
हाँ → Modbus detected
|
नहीं
↓
कोई डिटेक्शन नहीं
मुख्य सिद्धांत सरल है:
प्रोटोकॉल का पता लगाएं, केवल पोर्ट का नहीं।