我无法使用 libusb for Ruby 模拟嗅探 urb 中断

2024-01-04

嗅探 URB_INTERRUPtions

我嗅探了一些应用程序(SoundLab)和设备(带 USB 的声波计)之间的通信。我找到了一个负责返回当前状态的数据包:

USB URB
    [Source: host]
    [Destination: 1.1.2]
    USBPcap pseudoheader length: 27
    IRP ID: 0xffff858d126f4a60
    IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
    URB Function: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER (0x0009)
    IRP information: 0x00, Direction: FDO -> PDO
        0000 000. = Reserved: 0x00
        .... ...0 = Direction: FDO -> PDO (0x0)
    URB bus id: 1
    Device address: 1
    Endpoint: 0x02, Direction: OUT
        0... .... = Direction: OUT (0)
        .... 0010 = Endpoint number: 2
    URB transfer type: URB_INTERRUPT (0x01)
    Packet Data Length: 8
    [bInterfaceClass: Unknown (0xffff)]
Leftover Capture Data: b331eb4d00000000

它由应用程序发送到端点号 2(输出),然后设备将 urb 中断和数据发送到端点号 1(输入):

USB URB
    [Source: 1.1.1]
    [Destination: host]
    USBPcap pseudoheader length: 27
    IRP ID: 0xffff858d10207af0
    IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
    URB Function: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER (0x0009)
    IRP information: 0x01, Direction: PDO -> FDO
        0000 000. = Reserved: 0x00
        .... ...1 = Direction: PDO -> FDO (0x1)
    URB bus id: 1
    Device address: 1
    Endpoint: 0x81, Direction: IN
        1... .... = Direction: IN (1)
        .... 0001 = Endpoint number: 1
    URB transfer type: URB_INTERRUPT (0x01)
    Packet Data Length: 8
    [bInterfaceClass: Unknown (0xffff)]
Leftover Capture Data: 01a9009b90ddc0ff

尝试用 libusb 模拟中断

现在我想在 Linux 中模仿这个,使用libusb https://github.com/larskanis/libusb。我编写了这段代码,可以在其中测试不同的中断。

require 'libusb'
require 'pry'

vendor_id = 0x64bd
product_id = 0x74e3

module Messages
  GET_STATE = ['b331eb4d00000000'].pack('H*')
end

usb = LIBUSB::Context.new
device = usb.devices(idVendor: vendor_id, idProduct: product_id).first

dev_handle = device.open

if dev_handle.kernel_driver_active?(0)
  dev_handle.detach_kernel_driver(0)
end

dev_handle.claim_interface(0)

binding.pry

dev_handle.release_interface(0)
dev_handle.close

然后我运行这个pry安慰:

dev_handle.interrupt_transfer(endpoint: 2, dataOut: Messages::GET_STATE)

它返回8。这不是我所期望的。

我在运行代码时看到的 URB_INTERRUPTions

USB URB
    [Source: host]
    [Destination: 1.6.2]
    URB id: 0xffff8802142fecc0
    URB type: URB_SUBMIT ('S')
    URB transfer type: URB_INTERRUPT (0x01)
    Endpoint: 0x02, Direction: OUT
    Device: 6
    URB bus id: 1
    Device setup request: not relevant ('-')
    Data: present (0)
    URB sec: 1559130571
    URB usec: 534195
    URB status: Operation now in progress (-EINPROGRESS) (-115)
    URB length [bytes]: 8
    Data length [bytes]: 8
    [Response in: 126]
    [bInterfaceClass: HID (0x03)]
    Unused Setup Header
    Interval: 8
    Start frame: 0
    Copy of Transfer Flags: 0x00000000
    Number of ISO descriptors: 0
Leftover Capture Data: b331eb4d00000000
USB URB
    [Source: 1.6.2]
    [Destination: host]
    URB id: 0xffff8802142fecc0
    URB type: URB_COMPLETE ('C')
    URB transfer type: URB_INTERRUPT (0x01)
    Endpoint: 0x02, Direction: OUT
    Device: 6
    URB bus id: 1
    Device setup request: not relevant ('-')
    Data: not present ('>')
    URB sec: 1559130571
    URB usec: 534846
    URB status: Success (0)
    URB length [bytes]: 8
    Data length [bytes]: 0
    [Request in: 125]
    [Time from request: 0.000651000 seconds]
    [bInterfaceClass: HID (0x03)]
    Unused Setup Header
    Interval: 8
    Start frame: 0
    Copy of Transfer Flags: 0x00000000
    Number of ISO descriptors: 0

Summary

结果我得到的 URB_INTERRUPTions 与我在 Windows 上看到的有很大不同。在 Windows 上,我将 urb_interrupt 连接到 2 个(输出)端点,其中包含请求设备状态的数据。然后设备将 urb_interrupt 发送到 1(输入)端点,当前状态编码在捕获数据中。我怎样才能模仿这个LIBUSB::DevHandle#interrupt_transfer?这是此方法的文档:https://www.rubydoc.info/gems/libusb/LIBUSB/DevHandle#interrupt_transfer-instance_method https://www.rubydoc.info/gems/libusb/LIBUSB/DevHandle#interrupt_transfer-instance_method.


我尝试将您发布的预期与收到的 USB 输出进行融合,对我来说最突出的是您的“实际”USB 协议捕获显示一个 URB_INTERRUPT(由“方向”字段标记)。在“实际”USB 流量转储中,看起来有 2 个 URB_INTERRUPT 输出。

我不是 USB 协议方面的专家(当我自己也跌跌撞撞地寻求帮助对 USB 驱动程序进行逆向工程时,我遇到了这个问题),但据我所知,要获得 URB_INTERRUPT'in'(这是预期输出中的内容),您必须将端点地址更改为 0x82 而不是 2。

这个答案进一步讨论了这一点:https://superuser.com/a/876773/618124 https://superuser.com/a/876773/618124

USB端点0x00-0x7F在主机上,端点0x80-0xFF在主机上 在设备上(我认为)。

尝试一下,看看是否有效?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我无法使用 libusb for Ruby 模拟嗅探 urb 中断 的相关文章

  • 平衡付款 - 有关获取现有买家和商家账户参考信息的文档

    我如何获得已创建的买家和商家帐户的参考 我只是找到创建买家和商家帐户的示例 我没有找到任何有关获取该信息以供重用的示例 是否有关于此的现有文档或只是 rdoc 中的内容 根据对 rdoc 的引用 我假设您在这里使用 Ruby gem 使用唯
  • 迭代比线性代码慢吗?哪一个更可取?

    最近几天我脑子里一直有一个问题 在用 ruby 编写代码时 线性代码是否比迭代更快 更好 让我举个例子 有一个用于相同功能的代码块以两种不同的方式编写 Way 1 dog cat tiger each do pet name puts I
  • 如何查找重复字母最多的单词

    我的目标是找到给定字符串中重复字母最多的单词 例如 aabcc ddeeteefef iijjfff 会回来 ddeeteefef 因为 e 在这个单词中重复了五次 这比所有其他重复字符都多 到目前为止 这是我得到的 但它有很多问题并且不完
  • 如果数组包含一个或多个相同值,则合并数组

    我有一个数组数组 a 1 2 3 3 4 5 6 7 8 8 9 9 10 我想合并包含一个或多个相同值的所有数组 所以 a 1 2 3 4 5 6 7 8 9 10 我正在努力寻找一种简洁的方法来解决这个问题 有任何想法吗 我相信这是正确
  • 为什么每个方法需要将其循环的值分配给变量?

    在 Rails 上工作 发现我对 Rails 的理解缺乏知识each method 不知道为什么each方法需要变量 message h2 h2 不确定为什么每个方法都需要变量 message 事实并非如此require它 你完全可以忽略它
  • Ruby:基于控制台的菜单

    我有一个名称和 URL 数组 并希望以向上 向下滚动菜单的形式向用户呈现名称列表 基本上是什么dialog允许在外壳内 我调查过ncurses ruby rdialog and HighLine但它们似乎要么作为一个项目被放弃 要么甚至从它
  • 使用brew时出现“错误的解释器”错误

    当我尝试运行任何 brew 命令时 出现此错误 Holger Sindbaeks MacBook Air holgersindbaek brew help bash usr local bin brew usr bin ruby bad i
  • Cucumber 是否不需要编写单元测试?

    我对 Ruby ROR 可用的测试框架数量之多感到有点困惑 我最近看了黄瓜轨道广播 http railscasts com episodes search cucumber并发现它们非常有趣 所以我开始玩游戏 然后努力从概念上考虑在哪里进行
  • 载波无法删除图像

    我现在使用 Carrierwave 上传图像 一切都很好 除了一个 当我添加用于删除上传图像的复选框时 我收到错误 无法批量分配受保护的属性 remove image Form Model class Manufacturer lt Act
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • Ruby:使用默认值定义类级别哈希

    我有一个基本的红宝石课程 class LogEntry end 我想做的是能够用几个值定义一个哈希 如下所示 EntryType error gt 0 warning gt 1 info gt 2 这样我就可以访问这样的值 或类似的值 Lo
  • 下载前获取文件大小并计算已下载的文件大小 (http+ruby)

    谁能帮我 get the 之前的文件大小我开始下载 显示多少 已下载 require net http require uri url http www onalllevels com 2009 12 02TheYangShow Squid
  • ruby 1.9.1 的 gem install mongrel 失败

    昨天我开始了 Rails 开发 我安装了 ruby 1 9 1 rubygems 和 Rails 跑步gem install mongrel工作得很好 表面上也安装了杂种 我有点困惑 因为 script server 默认启动 webric
  • 对 Rails 3.1 中的特定路由强制使用 SSL

    我需要强制启用 SSL所有路线在我的申请中除了landing index In config application rb 我有 config force ssl true Then in landing controller rb 我有
  • 在 Rails 5.1 及更高版本中,使用什么来代替“render :text”(和“render Nothing: true”)?

    轨道 5 1 其中就有老朋友render text 当你需要渲染的时候它非常有用some文本 但不想要视图模板的开销 例子 render text ok render text t business rules project access
  • 需要 gem 是否会加载所有内容,包括我不使用的东西?

    Assume x是一颗宝石 包含两者Hello and Goodbye类 如果我写一个程序require x 但仅使用Hello班级 是个Goodbye类也加载了吗 您包含脚本或文件 而不是 gem With require x 你加载文件
  • i18n:特定型号的错误消息本地化

    我可以为每个验证本地化错误消息 但如何为特定模型创建错误 普通的语言环境如下所示 en mongoid errors messages taken It is already taken 但我想更改消息user model en mongo
  • 了解 Ruby 的加载路径

    我有点困惑为什么我的项目无法加载它需要的文件 这是一个非常简单的项目树 processor bin lib processor rb processor mapper rb reducer rb and my processor rb文件看
  • 从外部 gem 增强模型

    我在用着炼油厂CMS http refinerycms com 在我们的网站上让较少的技术人员更新内容 在 gem 内部 它们有一个 Page 类 用于映射站点上的每个顶级页面 我想在这个 Page 类上使用acts as taggable
  • ruby 包含问题

    class Foo def initialize a puts Hello a end end module Bar def initialize b puts b World end end class Sample lt Foo inc

随机推荐

  • 在 Angular 2 中等待服务器对 http 请求的答复

    我的 Angular2 应用程序有一点问题 我想从服务器获取一些数据以供用户登录 但我的代码仍在继续 并且有很多错误 我想等待服务器的答复 然后对我的数据执行某些操作 这是我的代码 import Injectable from angula
  • Hive:在主表上进行增量更新的最佳方法

    所以我在 Hive 中有一个主表 它将存储我的所有数据 我希望能够每月加载增量数据更新 有大量数据 数十亿行 将会有新的数据 以及更新的条目 解决这个问题的最佳方法是什么 我知道 Hive 最近升级并支持更新 插入 删除 我一直在想的是以某
  • ASI 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Javascript自动插入分号的规则是什么 https stackoverflow com questions 2846283 what are the rules for javascripts
  • 在 Xcode 4 中将文件添加到单独的目标

    自从升级到 xcode 4 以来 我找不到在哪里指定资源所属的 Target 以前 我选择了该文件并点击 command i 但现在这似乎是运行该程序 而不是调出该文件的信息框 Select the project file in the
  • 禁用 dc.js 中的交互性

    我有许多使用创建的条形图dc js 在默认行为中 用户可以单击并拖动其中任何一个来更新交叉过滤器 如何使图表 仅显示 也就是说 当其他组件更新交叉过滤器时 图表也会更新 但用户无法选择 仅显示 图表中的数据来更新交叉过滤器 None
  • 查询列定义的数据长度 - SQL Server

    我希望生成数据库的所有表 列和数据类型的列表 这个查询将为我提供除数据类型长度之外的所有信息 SELECT t name AS TableName c name AS ColumnName y name AS DataType FROM s
  • 为什么一个简单的 T-SQL UDF 函数会使代码执行速度慢 3 倍

    我正在重写一些旧的存储过程 并且在使用函数而不是内联代码时遇到了意外的性能问题 该功能非常简单如下 ALTER FUNCTION dbo GetDateDifferenceInDays first date SMALLDATETIME se
  • 是否有可能/如何获取特定 Facebook 群组成员的数量(即使数量超过 500 人)?

    我需要监控 Facebook 群组用户的数量并将其显示在网站上 我知道可以使用他们的 API 获取用户 ID 但仅限 500 个 如果会员总数超过 500 人 获取注册我建立的 Facebook 群组的成员总数的最简单方法是什么 这是可能吗
  • teamcity错误MSB4057:项目中不存在目标“pack”

    无法使用 4 7 框架为 Dot Net Core 项目创建包 我正在 teamcity 中使用 msbuild t pack p COnfiguration Release 命令来创建包
  • 从 JSON 类别中获取数据

    我正在编写一个应用程序 我在其中从 JSON 中获取数据 我能够获取类别列表但每当我点击任何类别时未获取产品列表始终在该特定类别下获取空白活动 JSON categoryId 1 categoryTitle SmartPhones Smar
  • User.IsInRole 返回 false

    我正在使用 Identity 2 在 mvc 5 网站中进行身份验证 在我看来 我想检查用户的角色 if User IsInRole Customers do something 但这总是返回 false 我已经设置了
  • 带有 Facebook 评论的自定义滚动条

    The goal 我想在窗口加载时运行滚动条脸书评论 容器 问题 滚动条工作得很好 但我必须resize屏幕强制其调用 场景 I made jsFiddle 上的示例 http jsfiddle net vDUyU 看一下 说明当前的情况
  • 用 C 生成所有元组 - 比嵌套循环更好的方法?

    我有一个数组double x 长度为 11 的函数f double x 我想找到函数的最小值f 通过离散化 所以对于给定的值val1 val2 valn我需要一个循环遍历 val 1 val n 11 中 x 的所有元组 我可以轻松地使用
  • C++ 概念占位符类型推导

    在范围规范中N4622 http www open std org jtc1 sc22 wg21 docs papers 2016 n4622 pdf the Same概念被定义为两种类型T and U 但有时在内部使用requires只有
  • 无法从 START_ARRAY 令牌中反序列化 java.util.HashMap 的实例

    我在使用 jackson core 2 7 3 jar 解析 JSON 时遇到问题 你可以从这里得到它们http repo1 maven org maven2 com fasterxml jackson core http repo1 ma
  • 在 C++11 中实现元函数 zip

    我实际上想看看是否可以获得一个最小的库 该库支持我从 boost fusion 使用的极少数操作 这是我到目前为止所拥有的 template lt typename Types gt struct typelist template lt
  • 是什么导致Spring在使用AnnotationConfigApplicationContext时无法加载配置类?

    我最近遇到了这个问题 在搜索 stackoverflow 网站后 找不到可行的解决方案 我收到的错误是 Spring 在加载配置类时遇到问题 我使用注释和 Spring 类来配置 而不是 XML 文件 以练习使用注释而不是 XML 文件配置
  • 是否可以强制使用 DataType 作为 DataType.Currency 的 MVC3 字段的货币

    我正在编写一个 MVC3 应用程序 它从数据库中读取一堆货币数据 我遇到的问题是这些金额都是不同的货币 如果我像这样设置字段的类型 DataType DataType Currency public Amount get set 我得到小数
  • 添加使用向上和向下箭头键选择表格行的功能

    我需要专家的帮助来解决我的以下问题 因为它超出并远远超出了我对 JavaScript 编程的知识水平 鉴于下面现有的 JavaScript 编码 我如何搭载并添加到现有编码中 以便为用户添加功能 以便在滚动时使用向上和向下箭头键滚动表格 顺
  • 我无法使用 libusb for Ruby 模拟嗅探 urb 中断

    嗅探 URB INTERRUPtions 我嗅探了一些应用程序 SoundLab 和设备 带 USB 的声波计 之间的通信 我找到了一个负责返回当前状态的数据包 USB URB Source host Destination 1 1 2 U