示例#1
0
def list_path(conn, tid, path, password=None):
    findFirstParameter = smb.SMBFindFirst2_Parameters()
    findFirstParameter['SearchAttributes'] = smb.SMB_FILE_ATTRIBUTE_DIRECTORY | smb.SMB_FILE_ATTRIBUTE_HIDDEN | \
                                             smb.SMB_FILE_ATTRIBUTE_SYSTEM | smb.SMB_FILE_ATTRIBUTE_READONLY | \
                                             smb.SMB_FILE_ATTRIBUTE_ARCHIVE
    findFirstParameter['SearchCount'] = 512
    findFirstParameter[
        'Flags'] = smb.SMB_FIND_RETURN_RESUME_KEYS | smb.SMB_FIND_CLOSE_AT_EOS
    findFirstParameter['InformationLevel'] = 0x0003
    findFirstParameter['SearchStorageType'] = 0
    findFirstParameter['FileName'] = path + '\x00'
    geaList = pack('<L', 0x10007)  # this size is wrong
    geaList += (pack('<B', 0) + '\x00') * 0x100
    send_trans2(conn, tid, smb.SMB.TRANS2_FIND_FIRST2, '\x00',
                findFirstParameter, geaList)
    files = []

    totalDataCount = 1
    findData = ''
    findFirst2ParameterBlock = ''
    while len(findData) < totalDataCount:
        resp = conn.recvSMB()

        if resp.isValidAnswer(smb.SMB.SMB_COM_TRANSACTION2):
            trans2Response = smb.SMBCommand(resp['Data'][0])
            trans2Parameters = smb.SMBTransaction2Response_Parameters(
                trans2Response['Parameters'])
            totalDataCount = trans2Parameters['TotalDataCount']
            findFirst2ParameterBlock += trans2Response[
                'Data'][trans2Parameters['ParameterOffset'] -
                        55:][:trans2Parameters['ParameterCount']]
            findData += trans2Response['Data'][trans2Parameters['DataOffset'] -
                                               55:]

    findParameterBlock = smb.SMBFindFirst2Response_Parameters(
        findFirst2ParameterBlock)
    sid = findParameterBlock['SID']
    print sid
    return files
示例#2
0
    def findFirst2(self, connId, smbServer, recvPacket, parameters, data,
                   maxDataCount):
        connData = smbServer.getConnectionData(connId)

        respSetup = ''
        respParameters = ''
        respData = ''
        errorCode = STATUS_SUCCESS
        findFirst2Parameters = smb.SMBFindFirst2_Parameters(
            recvPacket['Flags2'], data=parameters)

        # 1. Let's grab the extension and map the file's contents we will deliver
        origPathName = os.path.normpath(
            decodeSMBString(recvPacket['Flags2'],
                            findFirst2Parameters['FileName']).replace(
                                '\\', '/'))
        origFileName = os.path.basename(origPathName)

        _, origPathNameExtension = os.path.splitext(origPathName)
        origPathNameExtension = origPathNameExtension.upper()[1:]

        if self.extensions.has_key(origPathNameExtension.upper()):
            targetFile = self.extensions[origPathNameExtension.upper()]
        else:
            targetFile = self.defaultFile

        if (len(data) > 0):
            findFirst2Data = smb.SMBFindFirst2_Data(data)
        else:
            findFirst2Data = ''

        if connData['ConnectedShares'].has_key(recvPacket['Tid']):
            path = connData['ConnectedShares'][recvPacket['Tid']]['path']

            # 2. We call the normal findFirst2 call, but with our targetFile
            searchResult, searchCount, errorCode = findFirst2(
                path, targetFile, findFirst2Parameters['InformationLevel'],
                findFirst2Parameters['SearchAttributes'])

            respParameters = smb.SMBFindFirst2Response_Parameters()
            endOfSearch = 1
            sid = 0x80  # default SID
            searchCount = 0
            totalData = 0
            for i in enumerate(searchResult):
                #i[1].dump()
                try:
                    # 3. And we restore the original filename requested ;)
                    i[1]['FileName'] = encodeSMBString(
                        flags=recvPacket['Flags2'], text=origFileName)
                except:
                    pass

                data = i[1].getData()
                lenData = len(data)
                if (totalData + lenData) >= maxDataCount or (
                        i[0] + 1) > findFirst2Parameters['SearchCount']:
                    # We gotta stop here and continue on a find_next2
                    endOfSearch = 0
                    # Simple way to generate a fid
                    if len(connData['SIDs']) == 0:
                        sid = 1
                    else:
                        sid = connData['SIDs'].keys()[-1] + 1
                    # Store the remaining search results in the ConnData SID
                    connData['SIDs'][sid] = searchResult[i[0]:]
                    respParameters['LastNameOffset'] = totalData
                    break
                else:
                    searchCount += 1
                    respData += data
                    totalData += lenData

            respParameters['SID'] = sid
            respParameters['EndOfSearch'] = endOfSearch
            respParameters['SearchCount'] = searchCount
        else:
            errorCode = STATUS_SMB_BAD_TID

        smbServer.setConnectionData(connId, connData)

        return respSetup, respParameters, respData, errorCode