示例#1
0
	def create_trans2_packet(self, setup, param='', data='', mid=None, maxSetupCount=None, totalParameterCount=None, totalDataCount=None, maxParameterCount=None, maxDataCount=None, pid=None, tid=None, noPad=False):
		if maxSetupCount is None:
			maxSetupCount = len(setup)
		if totalParameterCount is None:
			totalParameterCount = len(param)
		if totalDataCount is None:
			totalDataCount = len(data)
		if maxParameterCount is None:
			maxParameterCount = totalParameterCount
		if maxDataCount is None:
			maxDataCount = totalDataCount
		transCmd = smb.SMBCommand(smb.SMB.SMB_COM_TRANSACTION2)
		transCmd['Parameters'] = smb.SMBTransaction2_Parameters()
		transCmd['Parameters']['TotalParameterCount'] = totalParameterCount
		transCmd['Parameters']['TotalDataCount'] = totalDataCount
		transCmd['Parameters']['MaxParameterCount'] = maxParameterCount
		transCmd['Parameters']['MaxDataCount'] = maxDataCount
		transCmd['Parameters']['MaxSetupCount'] = len(setup)
		transCmd['Parameters']['Flags'] = 0
		transCmd['Parameters']['Timeout'] = 0xffffffff
		transCmd['Parameters']['ParameterCount'] = len(param)
		transCmd['Parameters']['DataCount'] = len(data)
		transCmd['Parameters']['Setup'] = setup
		_put_trans_data(transCmd, param, data, noPad)
		return self.create_smb_packet(transCmd, mid, pid, tid)
示例#2
0
def smbTransaction2(packet, packetNum, SMBCommand, questions, replies):
    # Test return code is always 0, otherwise leave before doing anything
    if packet['ErrorCode'] != 0:
        return False

    print "SMB_COM_TRANSACTION2 ",
    try:
        if (packet['Flags1'] & smb.SMB.FLAGS1_REPLY) == 0:
            # Query

            trans2Parameters = smb.SMBTransaction2_Parameters(
                SMBCommand['Parameters'])

            # Do the stuff
            if trans2Parameters['ParameterCount'] != trans2Parameters[
                    'TotalParameterCount']:
                # TODO: Handle partial parameters
                #print "Unsupported partial parameters in TRANSACT2!"
                raise Exception("Unsupported partial parameters in TRANSACT2!")
            else:
                trans2Data = smb.SMBTransaction2_Data()
                # Standard says servers shouldn't trust Parameters and Data comes
                # in order, so we have to parse the offsets, ugly

                paramCount = trans2Parameters['ParameterCount']
                trans2Data['Trans_ParametersLength'] = paramCount
                dataCount = trans2Parameters['DataCount']
                trans2Data['Trans_DataLength'] = dataCount

                if trans2Parameters['ParameterOffset'] > 0:
                    paramOffset = trans2Parameters[
                        'ParameterOffset'] - 63 - trans2Parameters[
                            'SetupLength']
                    trans2Data['Trans_Parameters'] = SMBCommand['Data'][
                        paramOffset:paramOffset + paramCount]
                else:
                    trans2Data['Trans_Parameters'] = ''

                if trans2Parameters['DataOffset'] > 0:
                    dataOffset = trans2Parameters[
                        'DataOffset'] - 63 - trans2Parameters['SetupLength']
                    trans2Data['Trans_Data'] = SMBCommand['Data'][
                        dataOffset:dataOffset + dataCount]
        else:
            # Response
            # ToDo not implemented yet
            a = 1

    except Exception, e:
        print "ERROR: %s" % e
        print "Command: 0x%x" % packet['Command']
        print "Packet: %d %r" % (packetNum, packet.getData())
        return True
示例#3
0
def send_trans2(conn, tid, setup, name, param, data):
    pkt = smb.NewSMBPacket()
    pkt['Tid'] = tid

    command = pack('<H', setup)

    transCommand = smb.SMBCommand(smb.SMB.SMB_COM_TRANSACTION2)
    transCommand['Parameters'] = smb.SMBTransaction2_Parameters()
    transCommand['Parameters']['MaxDataCount'] = len(data)
    transCommand['Data'] = smb.SMBTransaction2_Data()

    transCommand['Parameters']['Setup'] = command
    transCommand['Parameters']['TotalParameterCount'] = len(param)
    transCommand['Parameters']['TotalDataCount'] = len(data)

    if len(param) > 0:
        padLen = (4 - (32 + 2 + 28 + len(command)) % 4) % 4
        padBytes = '\xFF' * padLen
        transCommand['Data']['Pad1'] = padBytes
    else:
        transCommand['Data']['Pad1'] = ''
        padLen = 0

    transCommand['Parameters']['ParameterCount'] = len(param)
    transCommand['Parameters']['ParameterOffset'] = 32 + 2 + 28 + len(
        command) + len(name) + padLen

    if len(data) > 0:
        pad2Len = (4 -
                   (32 + 2 + 28 + len(command) + padLen + len(param)) % 4) % 4
        transCommand['Data']['Pad2'] = '\xFF' * pad2Len
    else:
        transCommand['Data']['Pad2'] = ''
        pad2Len = 0

    transCommand['Parameters']['DataCount'] = len(data)
    transCommand['Parameters']['DataOffset'] = transCommand['Parameters'][
        'ParameterOffset'] + len(param) + pad2Len

    transCommand['Data']['Name'] = name
    transCommand['Data']['Trans_Parameters'] = param
    transCommand['Data']['Trans_Data'] = data
    pkt.addCommand(transCommand)

    conn.sendSMB(pkt)