【问题标题】:SCSI commands in BadUSBBadUSB 中的 SCSI 命令
【发布时间】:2017-11-03 00:04:46
【问题描述】:

我已经阅读了phison的源代码(关于badusb,python文件)。但我无法理解程序向 SCSI 设备发送什么命令。在阅读了有关 SCSI 命令后,我仍然找不到以“06h”开头的操作码(存在类似的操作码设置设备 ID) https://www.seagate.com/staticfiles/support/disc/manuals/scsi/100293068a.pdf 以上是我找到的 SCSI 命令。 以下是读写命令:

```
def get_info(self):
        '''
        Performs a SCSI call to read version info from the device.
        Returns bool.

        The object's following attributes are set:
            data, version, run_mode, chip_type, date, f1f2
        '''
        self.data = self.SCSI_device.read('\x06\x05\x00\x00\x00\x00\x00\x00\x01',528)

        if not self.data or self.data[0x17A:0x17C]!='VR':
            return False

        self.version = struct.unpack('BBB', self.data[0x94:0x97])
        self.f1f2 = struct.unpack('BB', self.data[0x9A:0x9C])
        self.date = struct.unpack('BBB', self.data[0x97:0x9A])

        if self.data[0xA0:0xA8]==' PRAM   ':
            self.run_mode = 'BROM'  # BootROM
        elif self.data[0xA0:0xA8]==' FW BURN':
            self.run_mode = 'BN'        # firmware burner
        elif self.data[0xA0:0xA8]==' HV TEST':
            self.run_mode = 'HV'        # hardware verify
        else:
            self.run_mode = 'FW'        # firmware

        self.chip_type = struct.unpack('>H', self.data[0x17E:0x180])[0]

        data = self.SCSI_device.read('\x06\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',512)[0:6].encode('hex').upper()
        self.chip_id = '-'.join(data[i:i+2] for i in range(len(data))[::2])

        return True
def run_firmware(self, firmware):
        '''
        Loads firmware onto device.  Returns bool.
        '''
        # rebooting
        self.brom()
        sleep(2)

        # sending firmware
        self.load_file(firmware,'\x01','\x00')
        ret = self.SCSI_device.read('\x06\xEE\x01\x00\x00\x00\x00\x00\x00', 72)
        sleep(2)
        self.load_file(firmware,'\x03','\x02')
        self.SCSI_device.read('\x06\xEE\x01\x01\x00\x00\x00\x00\x00', 72)
        self.SCSI_device.read('\x06\xEE\x00\x00\x00\x00\x00\x00\x00', 72)
        self.SCSI_device.read('\x06\xEE\x00\x01\x00\x00\x00\x00\x00', 72)

        # executing
        self.brom()
        sleep(2)
        return True

def pram(self):
        '''
        Called to run a burner or firmware.  Returns int result.
        '''
        return self.SCSI_device.write('\x06\xB3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '')

def brom(self):
        '''
        Sets device into boot mode from firmware mode.   Returns int result.
        '''
        return self.SCSI_device.write('\x06\xBF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '')
```

【问题讨论】:

  • 我对 SCSI 一无所知,但是,通过查看代码 here,大多数 SendCommand 用法的第一个值设置为 0x06。似乎它可能是某种形式的序言。
  • 另外,这些似乎是使用 SCSI 命令编写的 Phison 芯片的命令。

标签: python scsi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    本页详细介绍了这些 SCSI CDB 是如何为 BootROM 工作的:

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

    【讨论】:

    • 该代码的作者是谁,我如何联系他?我很好奇他从哪里得到所有这些信息,以及他是否有 PS2251-03-Q 控制器的数据表,因为我在网上找不到任何数据表。
    • 好吧,没关系,在EEVblog forums 上找到了这个家伙;)
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多