无线遥控器(无线电遥控器)在我们生活中非常常见,应用于各种场景,方便着用户的使用。不过大多数还是用于安防方面的,比如: 遥控报警器、电动卷帘门、电动伸缩门、遥控电开关、无线遥控门铃……

1、无线遥控器简介

无线遥控器从安全角度看大致分为两类,一类是最普遍的固定码遥控器,特点是廉价、应用广泛、市场大、用户多;另一类是滚动码遥控器,特点是价格较贵、相对比较安全、用于汽车安全防盗等安全要求较高的地方。

固定码遥控器有很多种编码方式,国内常见的是 3 态 8 位的编码或者厂商出厂时烧录的随机码。滚动码这里不做讲解,我都还得到这类遥控器,滚动码相对来说比较安全,但也并非绝对安全,你的汽车用到就是滚动码遥控器,然而盗贼在 N 年前就能买到干扰破解你汽车防盗的设备了。

无线遥控器从信号调制方式可以大致分成 OOKFSK 两种方式,当然这只是常见的,还有其他的信号调制方式。

2、三态八位遥控器

3 态 8 位遥控器是我们常见的遥控器,它属于固定码遥控器。在电瓶车防盗器、电动卷帘门、电动伸缩门、遥控电开关、无线遥控门铃这些应用中都能见到这种遥控器,因为这种遥控器很廉价。

2.1 什么是三态八位遥控器?

3 态 8 位遥控器顾名思义,它有 3 种码位状态 8 个码位。二进制是由 组成的,所以 2 位(bit)长的二进制有 4 种可能性 00 01 10 11 , 3 态 8 位遥控器使用的是这其中的 3 种 00 01 11 这是 3 态。8 位是指有 8 个编码位,每个编码位可使用 3 态中的任意一种,所以是 2 * 8 = 16 总共 16 位(bit)长的二进制,但是常见的无线遥控器是的数据长度是 24 位(bit),因为后 8 位(bit)是定义按键值的(如果你对信号解码出来的是 25 位(bit)长,你可以除去末尾的 ;如果是 25 位(bit)长,末尾的是 1 这可能是你解码错了)。常见的 4 键遥控器的的每个键值都是出厂就固定了的,分别是 11000000 00110000 00001100 00000011

2.2 厂商烧录的固定码

如果你的固定码遥控器解码后的二进制中有一对 码(注意是一对,前一对的后 1 跟后一对的前 组成的 是不算的)这说明你的遥控器不属于 3 态 8 位遥控器,是厂商出厂时烧录的固定码,这种遥控器的后 8 位(bit)按键值也不一定是标准的 4 种可能性。

这类固定码遥控器的接收端一般都是学习行的,会有一个学习键。作用是配对新的遥控器,如果当前遥控器坏了,你可以买个同类型的遥控器,长按学习键再按遥控器,就可以学习到新遥控器的编码的信息,这样你就能继续使用了。

2.3 辨别是否是三态八位

辨别是否是 3 态 8 位遥控器最靠谱的方法就是拆开来看 PCB 板子,有 3 排 8 列焊盘的肯定是,否则就不是,使用 3 态 8 位拨码开关的也是。

2.4 三态八位遥控器编码

国内常见的编码方法都是直接焊接 PCB 上的焊盘,极少使用拨码开关,节省成本?当然你也能买到 3 态 8 位的拨码遥控器。

从上图中可以看出总共有 3 排 8 列焊盘,这也就是 3 态(上中下) 8 位的定义方式。中间的一排连接的是芯片的引脚,当芯片的一个引脚与 High 焊接上后产生的编码是 11 与 Low 焊接上后产生的编码是 不焊接的默认编码是

编码是成对的,遥控器上是这个编码,接收器上也得是这个编码否则是没法使用的。

3、分析安全缺陷

从上文中我们知道了遥控器的二进制编码长度是 24 位(bit),前 16 位(bit)是由 3 态 8 位编码方式定义的,后 8 位(bit)是厂商固定死的的按键值。一个遥控器上的每个按键的前 16 位(bit)都是一样的,后 8 位(bit)是不一样的,就 4 种可能性。假设如果每个按键都是没有规律的随机码,那么你想通过暴力穷举出正确的编码,你需要尝试 2 ^ 24 = 16777216 总共 16777216 种可能性。假设后 8 位(bit)是固定的 4 种可能性,前 16 位(bit)是随机的,那你只需要尝试前 16 位(bit)的所有可能性在拼接上后 8 位(bit)的固定值,你需要尝试 2 ^ 16 = 65536 4 ^ 8 = 65536 每个按键总共 65536 种可能性。由于 3 态 8 位里是没有 10 码的,所有你需要尝试的次数是 3 ^ 8 = 6561 每个按键总共 6561 种可能性。

知道了暴力穷举攻击需要尝试的次数后我们再来算一下需要的时间,我对一个普通的遥控器做信号发送的采集,10 秒钟时间内我在接收端收到一百零几次遥控信号,也就是说一分钟至少可以发送(尝试) 600 个可能性。尝试 24 位(bit)长度的所有组合所需的时间是 16777216 / 600 = 27962 27962 分钟左右,大概 20 天不到。尝试 16 位(bit)长度一个按键的所有组合所需的时间是 65536 / 600 = 109 109 分钟左右,大概一个多小时。尝试 3 态 8 位一个按键的所有组合所需的时间是 6561 / 600 = 11 大概 11 分钟左右!!

那么 Samy Kamkar 在 8 秒内打开车库门的 OpenSesame 项目是怎么做到的?首先 Samy Kamkar 的那个车库门的遥控器并非是 3 态 8 位的,编码长度好像只有 12 位(bit), 2 ^ 12 = 4096 总共 4096 种组合。最关键是遥控设备的接收端使用的是移位寄存器,所以使用 De Bruijn 序列 即可在非常短的时间内完成所有可能性的尝试。

但我们常见的 3 态 8 位遥控设备的接收端用得并非是移位寄存器,所以没法使用De Bruijn序列实现暴力穷举攻击。检测接收端是否使用了移位寄存器的一个方法是在正确的编码前加个 。如果使用了移位寄存器,那么会跳过错误的一个位(bit)检查下一个正确的,并给予响应。如果没使用移位寄存器,那么什么反应都没有,因为你发送的这个编码是错误的。

4、制作 Hacking 硬件

从上面理论分析中我们知道了这种遥控设备所存在的其中一个缺陷,要尝试利用这个缺陷实现对设备的攻击方法不止一种。你可以抱着你的笔记本和 SDR 设备去攻击它,或者我们尝试制作自己的便捷式硬件来利用这个缺陷实现对设备的攻击。

这个我们使用 Arduino 和 RF 模块实现攻击功能。使用 Arduino 是因为廉价、易上手,当然你有能力的话也可以使用其他单片机去实现,或者自己设计电路,使用更好的 CC1111 芯片去实现 RF 功能。

4.1 硬件列表

Arduino Pro Micro

315 MHz或433 MHz 无线模块

轻触按钮

10K电阻

面包板

面包板跳线

4.2 硬件连接方式

4.3 功能代码

/*
Brute Force Attack 4 ^ 8 Remote Control https://github.com/ZMOM1031/bruteforce3-8remote */ #include <stdio.h>
#include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); // 定义 4 个按键针脚
const int button_a = ;
const int button_b = ;
const int button_c = ;
const int button_d = ; int butStatA = ;
int butStatB = ;
int butStatC = ;
int butStatD = ;
int dfa = ; void setup() { Serial.begin(); mySwitch.enableTransmit(); // 定义发送模块的数据传输针脚
mySwitch.setPulseLength(); // 定义脉冲长度,这个值具体看你使用的遥控器而定
pinMode(button_a, INPUT);
pinMode(button_b, INPUT);
pinMode(button_c, INPUT);
pinMode(button_d, INPUT); } void loop() { // read the state of the pushbutton value:
butStatA = digitalRead(button_a);
butStatB = digitalRead(button_b);
butStatC = digitalRead(button_c);
butStatD = digitalRead(button_d); // Button A
if (butStatA == HIGH) { // check if the pushbutton is pressed.
for (long i = ; i < ; i++ ){
long key = long(i * dfa) + int();
mySwitch.send(key, );
}
} // Button B
if (butStatB == HIGH) {
for (long i = ; i < ; i++ ){
long key = long(i * dfa) + int();
mySwitch.send(key, );
}
} // Button C
if (butStatC == HIGH) {
for (long i = ; i < ; i++ ){
long key = long(i * dfa) + int();
mySwitch.send(key, );
}
} // Button D
if (butStatD == HIGH) {
for (long i = ; i < ; i++ ){
long key = long(i * dfa) + int();
mySwitch.send(key, );
}
} }

注:这段代码实现的是发送 4 ^ 8 的所有可能性。

生成 3 ^ 8 的所有可能性的算法我还没实现,暂时也没时间去继续研究如何实现了,过完年得去找工作了。

5、总结

在实际测试中暴力穷举攻击确实是有效的,但由于时间匆忙,硬件设计和代码都不是最优化的,所攻击的速度还是差了点。如果你使用的是这种类型的遥控设备也不用担心会这么样。

bruteforce3-8remote 这个项目后续还会更新,争取达到最高的可用度,还会再加一些功能。目前我得先去忙着找工作,才是正事。未来还会研究一些其他的硬件安全的破解/逆向项目的。

原文地址:https://blog.iternull.com/posts/2017/02/04/Use-Arduino-brute-force-to-attack-remote-control.html

分析无线遥控器信号并制作Hack硬件进行攻击的更多相关文章

  1. Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  2. linux-2.6.18源码分析笔记---信号

    一.相关数据结构及其位置(大致浏览即可,介绍流程时再来仔细看) 1.1 进程描述符struct task_struct所在目录:include\linux\sched.h 关注task_struct中 ...

  3. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  4. linux内核情景分析之信号实现

    信号在进程间通信是异步的,每个进程的task_struct结构有一个sig指针,指向一个signal_struct结构 定义如下 struct signal_struct { atomic_t cou ...

  5. 另类分析SIGSEGV信号

    关于SIGSEGV信号的含义就不解释了.网络上有很多解释. 今天记录一下,自己遇到的一个问题,想了好几天都没想出来的.今天终于想到原因了. 过程描述: 有个类 CBase,里面放了一个成员变量 DAT ...

  6. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...

  7. 第1阶段——uboot分析之仿照bootm制作hello命令(7)

    仿照bootm命令生成来制作一个hello命令,功能:打印出hello,world!和参数值 1.点击New File ,创建cmd_hello.c将./common/cmd_bootm.c的头文件复 ...

  8. Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...

  9. eCos驱动分析 之 ISR是如何与硬件中断联系起来的?

    http://keendawn.blog.163.com/blog/static/8888074320116205833478/

随机推荐

  1. 暂时关闭 windows 病毒防护

  2. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上

    总结一下相关概念: torch.Tensor - 一个近似多维数组的数据结构 autograd.Variable - 改变Tensor并且记录下来操作的历史记录.和Tensor拥有相同的API,以及b ...

  3. DOM与document的区别

    DOM: DOM 全称是 Document Object Model,也就是文档对象模型. DOM 就是针对 HTML 和 XML 提供的一个API.什么意思?就是说为了能以编程的方法操作这个 HTM ...

  4. Leetcode 145

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  5. JS实现下拉单的二级联动

    因工作需要,做了一个下拉单的二级联动. 第一级是固定的选项,有A.B两个选项,第二级的选项随着第一级选项的变化而变化. 一开始是这样的: HTML代码 <html> <head> ...

  6. postman系列之批量执行接口测试用例

    postman如何批量执行接口测试用例~其实很简单,但是会给我们的工作带来很多方便~ 比如我们写了几十个测试用例,请求都是同一个服务器IP,一旦服务器IP地址从测试环境搬到线上环境,需要修改所有的服务 ...

  7. [luogu P1552] [APIO2012]派遣

    [luogu P1552] [APIO2012]派遣 题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除 ...

  8. linux服务器磁盘扩容的方法

    1.系统环境如下图: 2.为该系统添加一块新的虚拟硬盘,添加后需重启虚拟机,否则系统不识别:如下图,/dev/sdc 是新添加的硬盘: 3.fdisk /dev/sdc为新硬盘创建分区: 4.Linu ...

  9. weblogic隐藏版本号教程(10.3.6为例)

    隐藏版本号,如同大多数中间件都是取消Server头的发送:weblogic而言其默认就是不发送Server头的(即下边的“发送服务器标头”默认就是没钩选的). 写此教程的原因,一是以防Server头被 ...

  10. jQuery html5Validate基于HTML5表单 异步服务器端验证

    1. HTML5 自带的Validate 很漂亮,很好用, 但是一定要在form里用submit按钮,才生效 <form id="frmInfo" action=" ...