首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BadUSB中的SCSI命令

BadUSB中的SCSI命令
EN

Stack Overflow用户
提问于 2017-11-03 08:04:46
回答 2查看 582关注 0票数 1

我读过phison的源代码(关于badusb,python文件)。但是我不明白程序发送给SCSI设备的是什么命令。在阅读了SCSI命令后,我仍然找不到以"06h“开头的操作码(有一个类似的设置设备ID的操作码) https://www.seagate.com/staticfiles/support/disc/manuals/scsi/100293068a.pdf上面是我找到的SCSI命令。下面是读取和写入命令:

代码语言:javascript
复制

def get_info(自身):

代码语言:javascript
复制
    '''
代码语言:javascript
复制
    Performs a SCSI call to read version info from the device.
代码语言:javascript
复制
    Returns bool.
代码语言:javascript
复制
    The object's following attributes are set:
代码语言:javascript
复制
        data, version, run_mode, chip_type, date, f1f2
代码语言:javascript
复制
    '''
代码语言:javascript
复制
    self.data = self.SCSI_device.read('\x06\x05\x00\x00\x00\x00\x00\x00\x01',528)
代码语言:javascript
复制
    if not self.data or self.data[0x17A:0x17C]!='VR':
代码语言:javascript
复制
        return False
代码语言:javascript
复制
    self.version = struct.unpack('BBB', self.data[0x94:0x97])
代码语言:javascript
复制
    self.f1f2 = struct.unpack('BB', self.data[0x9A:0x9C])
代码语言:javascript
复制
    self.date = struct.unpack('BBB', self.data[0x97:0x9A])
代码语言:javascript
复制
    if self.data[0xA0:0xA8]==' PRAM   ':
代码语言:javascript
复制
        self.run_mode = 'BROM'  # BootROM
代码语言:javascript
复制
    elif self.data[0xA0:0xA8]==' FW BURN':
代码语言:javascript
复制
        self.run_mode = 'BN'        # firmware burner
代码语言:javascript
复制
    elif self.data[0xA0:0xA8]==' HV TEST':
代码语言:javascript
复制
        self.run_mode = 'HV'        # hardware verify
代码语言:javascript
复制
    else:
代码语言:javascript
复制
        self.run_mode = 'FW'        # firmware
代码语言:javascript
复制
    self.chip_type = struct.unpack('>H', self.data[0x17E:0x180])[0]
代码语言:javascript
复制
    data = self.SCSI_device.read('\x06\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',512)[0:6].encode('hex').upper()
代码语言:javascript
复制
    self.chip_id = '-'.join(data[i:i+2] for i in range(len(data))[::2])
代码语言:javascript
复制
    return True

def run_firmware(自身、固件):

代码语言:javascript
复制
    '''
代码语言:javascript
复制
    Loads firmware onto device.  Returns bool.
代码语言:javascript
复制
    '''
代码语言:javascript
复制
    # rebooting
代码语言:javascript
复制
    self.brom()
代码语言:javascript
复制
    sleep(2)
代码语言:javascript
复制
    # sending firmware
代码语言:javascript
复制
    self.load_file(firmware,'\x01','\x00')
代码语言:javascript
复制
    ret = self.SCSI_device.read('\x06\xEE\x01\x00\x00\x00\x00\x00\x00', 72)
代码语言:javascript
复制
    sleep(2)
代码语言:javascript
复制
    self.load_file(firmware,'\x03','\x02')
代码语言:javascript
复制
    self.SCSI_device.read('\x06\xEE\x01\x01\x00\x00\x00\x00\x00', 72)
代码语言:javascript
复制
    self.SCSI_device.read('\x06\xEE\x00\x00\x00\x00\x00\x00\x00', 72)
代码语言:javascript
复制
    self.SCSI_device.read('\x06\xEE\x00\x01\x00\x00\x00\x00\x00', 72)
代码语言:javascript
复制
    # executing
代码语言:javascript
复制
    self.brom()
代码语言:javascript
复制
    sleep(2)
代码语言:javascript
复制
    return True

def pram(self):

代码语言:javascript
复制
    '''
代码语言:javascript
复制
    Called to run a burner or firmware.  Returns int result.
代码语言:javascript
复制
    '''
代码语言:javascript
复制
    return self.SCSI_device.write('\x06\xB3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '')

def brom(自身):

代码语言:javascript
复制
    '''
代码语言:javascript
复制
    Sets device into boot mode from firmware mode.   Returns int result.
代码语言:javascript
复制
    '''
代码语言:javascript
复制
    return self.SCSI_device.write('\x06\xBF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '')
代码语言:javascript
复制
EN

回答 2

Stack Overflow用户

发布于 2017-11-03 08:27:26

根据this的说法,它是特定于供应商的。

票数 1
EN

Stack Overflow用户

发布于 2017-11-03 09:22:12

正如Paul指出的,它是特定于供应商的操作码。这意味着它不是任何SCSI标准的一部分。供应商可以使用0x06做任何他们想做的事情。

本页详细介绍了这些SCSI CDB在BootROM上的工作原理:

https://bitbucket.org/flowswitch/phison/wiki/ScsiCommands

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47086505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档