zgrab2/schemas/modbus.py
Justin Bastress 6f55be0fbb fix schema
2018-03-21 11:00:22 -04:00

55 lines
1.5 KiB
Python

# zschema sub-schema for zgrab2's modbus module
# Registers zgrab2-modbus globally, and modbus with the main zgrab2 schema.
from zschema.leaves import *
from zschema.compounds import *
import zschema.registry
import schemas.zcrypto as zcrypto
import schemas.zgrab2 as zgrab2
mei_object_names = [
'vendor',
'product_code',
'revision',
'vendor_url',
'product_name',
'model_name',
'user_application_name',
]
# IDs without an explicit name are encoded as oid_(decimal id).
mei_object_set = SubRecord({
i < len(mei_object_names) and mei_object_names[i]
or 'oid_' + str(i): String()
for i in range(0, 256)
})
mei_response = SubRecord({
'conformity_level': Unsigned8BitInteger(),
'more_follows': Boolean(),
'next_object_id': Unsigned8BitInteger(),
'object_count': Unsigned8BitInteger(),
'objects': mei_object_set,
})
exception_response = SubRecord({
'exception_function': Unsigned8BitInteger(),
'exception_type': Unsigned8BitInteger(),
})
modbus_scan_response = SubRecord({
'result': SubRecord({
'length': Unsigned16BitInteger(),
'unit_id': Unsigned8BitInteger(),
'function_code': Unsigned8BitInteger(),
'raw_response': Binary(),
'mei_response': mei_response,
'exception_response': exception_response,
'raw': Binary(),
})
}, extends=zgrab2.base_scan_response)
zschema.registry.register_schema('zgrab2-modbus', modbus_scan_response)
zgrab2.register_scan_response_type('modbus', modbus_scan_response)