Impacket provides powerful DCERPC capabilities. Here’s an example using the DCERPCTransportFactory:
detect_architecture.py
from impacket.dcerpc.v5.transport import DCERPCTransportFactoryfrom impacket.dcerpc.v5.epm import MSRPC_UUID_PORTMAPfrom impacket.dcerpc.v5.rpcrt import DCERPCExceptiondef detect_architecture(target_ip): """ Detect if target system is 32-bit or 64-bit. Based on getArch.py example. """ NDR64Syntax = ('71710533-BEBA-4937-8319-B5DBEF9CCC36', '1.0') try: # Create transport stringBinding = f'ncacn_ip_tcp:{target_ip}[135]' transport = DCERPCTransportFactory(stringBinding) transport.set_connect_timeout(5) # Connect and bind dce = transport.get_dce_rpc() dce.connect() try: dce.bind(MSRPC_UUID_PORTMAP, transfer_syntax=NDR64Syntax) print(f"{target_ip} is 64-bit") except DCERPCException as e: if 'syntaxes_not_supported' in str(e): print(f"{target_ip} is 32-bit") else: raise dce.disconnect() except Exception as e: print(f"Error: {e}")if __name__ == "__main__": detect_architecture("192.168.1.100")
Impacket includes a logger utility for consistent output:
from impacket.examples import loggerimport logging# Initialize logger with timestamp and debug optionslogger.init(ts=True, debug=True)# Use logginglogging.info("Connection established")logging.error("Failed to authenticate")logging.debug("Detailed debug information")