逆向工程电动飞檐AM82TV

我有几个Akko电动窗帘杆-AM82TV。 该模型具有最完整的管理界面集,在同类产品中脱颖而出。 窗帘可以通过无线电控制,有“干触点”,逐相控制(通过将控制线短接到网络)。 有一个RS485接口-这是要将窗帘连接到“智能家居”的接口。 您也可以简单地通过用手向所需方向拉动窗帘来打开/关闭窗帘。 也许只缺少基于Web的界面和MQTT的“开箱即用”。

我长期以来一直希望电动窗帘杆能够可靠地工作,但不时出现一种分解它们的愿望-出于好奇,看看里面有什么,是否有可能将ESP8266(或ESP32)放入其中以增加缺失之处。 当然,您可以从外部连接所有内容,但最好是外观保持不变并且所有内容都隐藏在内部。

不要修理没有损坏的东西-这与我无关。 起初,我试图摆脱自己的坏主意,但随着时间的流逝,瘙痒加剧,现在是时候了,已经不可能与之抗争。 我把车从房檐上拆下来了。 最初的检查应该给出两个问题的答案:ESP8266是否有空间,并且可以使用内置电源? 一切都简单地进行了整理。 只需从电动机端部拧下几颗螺丝即可。 唯一的问题是,螺钉的插槽不是用螺丝刀制造的,而是用梅花六角扳手制造的。 之后,您可以提取内容物-集电器在一个装有齿轮箱和电机轴传感器的外壳中,一个24伏电源和一个控制板。

ESP有一个地方,电源是为强大的电机设计的,不会注意到很小的额外负载。 我开始考虑控制板,关于ESP的想法开始逐渐淡出背景-atmega168微控制器是控制板的核心。 如果板上没有用于安装ISP连接器(微控制器的在线编程接口)的触点,这不会阻止我,但它们在那里。 为了让您正确理解我,我根本不喜欢AVR。 我没有程序员,也没有为atmega微控制器编写任何代码。 我紧急需要程序员来尝试读取固件,但是那是在晚上,现在没有办法在商店中购买东西。 为了不等到早上,我组装了Gromov编程器。 然后,他将ISP连接器焊接到控制板上,连接了编程器,并尝试读取固件-并将其计算在内。

不了解电路图就不可能尝试了解微控制器固件中的某些内容。 因此,我在印刷电路板上恢复了电路。 我不必经常画图。 为了不绘制板上的元素,也不绘制标准库中的元素,我在easyeda中绘制了一个图。 是的,结果与GOST无关(但是按照文档中的说明绘制了微控制器,这很方便)。 一个片段足以理解:



在下文中,大多数图像都是可点击的。

如果您愿意,您可以熟悉完整的方案

之后,我准备研究固件。 仅将机器代码转换为汇编助记符就不足以进行分析。 您需要在程序的任何位置查看寄存器和存储器的状态。 不幸的是,使用atmega168无法对微控制器本身进行调试,但是您可以将固件加载到模拟器中。 如果您想“感受”微控制器捆扎的真正烙印不是很方便,但是让我们先了解一下。 我没有安装Atmel Studio 7,所以我认为使用更紧凑的AVR Studio 4就足够了,原则上,一个Studio足以进行分析,但是可以将一些常规操作转移到其他软件上。 3月,逆向工程工具Ghidra发布了。 我需要一个理由,一些实际的任务,来结识他。 这只是一个机会。 每个工具单独使用-AVR Studio 4和Ghidra我有一些问题。 具有多个嵌套子程序转换的AVR Studio可能突然停止在命令中显示正确的转换地址(该地址变为零)。 Ghidra有时在索引分析中会误入歧途。 但是,同时使用这两种工具可以快速识别出这些奇怪的原因。

漫无目的地挖掘固件并不是很有趣。 如果有任何特定任务,则更好。 总的来说,好奇的可能是对RS485交换协议和空中控制协议的分析。 我决定深入研究无线电协议。

从前,我已经接受了无线电遥控器发送的信号并进行了分析。

无线电频道是单向的。 电机只能接收信号,不能确认收到命令。 不可能通过空中询问电檐口的状态。 在物理级别上,只有无线电信号接收器。 电机中没有变送器。 该信号由无线电遥控器以433.92 MHz的频率发送。 通过幅度操纵进行编码。 该命令由特殊形式的起始位,地址+通道和命令本身组成。 图形化地,整个信号可以表示如下:



通道可以视为地址的一部分。 如果在通道零上发送命令,则该命令将由具有给定地址但具有不同通道的所有设备执行。 如果您需要立即将命令传送到电动窗帘杆组,将非常方便。

阅读有关无线电协议的更多信息

通过分析遥控器如何发送命令,我已经知道四个团队的代码。 与通过RS485控制电动窗帘的可能性相比,不是很多。 我想确保所有团队都被确定,并且没有“复活节彩蛋”或服务团队。

分析方法很简单。 电路图显示了微控制器的哪些端口连接到物理设备。 固件文件在Ghidra中解析。 这很方便-许多常规操作是自动执行的。 在分析了一段特定的代码或子程序的操作之后,将为其赋予一个有意义的名称。 此外,我将从Ghidra带来的代码段和屏幕截图。 无聊时,在模拟器中运行代码。 在特别复杂的情况下,您必须绘制图片。

为了确保在反汇编期间正确显示atmega168外设寄存器的名称,我更正了avr8.pspec文件。 以一种好的方式,有必要创建一个具有不同名称的文件,但是我不需要此文件的原始格式,因此我更正了该文件。
固件从中断向量开始。 第一个是到程序开头的过渡向量。 看起来像这样:



大多数中断都不使用。 如果由于某种原因发生了这种中断,将立即执行返回命令。 除处理复位中断外,还处理定时器0溢出,接收完成以及准备将下一个数据字节发送到USART的中断。 现在我们不关心RS485交换,但是需要检查定时器溢出。

当然,在允许定时器中断之前,必须先配置定时器本身。 我没有开始在反汇编的代码中搜索进行初始化的位置。 在模拟器中,我在地址0x1fc处设置了一个断点-这是中断处理程序中记录的地址。 我启动了程序,遇到了麻烦,只是看了写到寄存器中的内容。 timr0的lockselect设置为clk / 8。 在8 MHz板上使用石英时,频率为1 MHz的脉冲到达计时器。

中断处理程序的启动:



观鸟中断处理程序功能图
图片

定时器每107μs溢出一次。 除其他事项外,中断处理程序还处理来自无线电信号接收器输出的信号。 如果信号成功通过测试,则接收到的数据将以0x4af写入缓冲区。 缓冲区大小为6个字节。 这比接收地址+通道和命令字节的四个字节要多一个字节。 无线电协议的第六个字节可能是用于校验和的,但已萎缩了。 有时会发生。 也许是用于补充某些命令的数据。 在RS485电动檐口控制协议中,有一条命令可部分关闭窗帘。 在这种情况下,将发送一个附加字节,其中包含有关关闭量(以百分比为单位)的数据。 无线电协议中可能存在类似的团队。 通过设置标志将数据准备就绪通知主程序-将一个单元写入地址0x4bd。

这样就完成了对中断的分析,并进入了主程序。

导航到地址0x1304时的功能图简洁明了:

图片

我们需要在“主体”上。 我们已经分析了中断,并且了解到,如果由于某种原因我们突然从主电源返回并进入“ go_to_sleep”状态,那么这个梦想将令人昏昏欲睡-电动窗帘将停止做一些有用的事情。 可能在编写固件时,使用了现成的模板,并且在其后留有工件。

首先,我们需要找到访问0x4af缓冲区的位置。 您无需搜索很长时间。 从字面上看,在执行几个命令之后,将调用一个子例程,该子例程从地址0x11b3开始,在该子例程中复制并处理该缓冲区。

rf_signal_buffer_processing(0x11b3)过程的功能图:



这正是我们需要的地方,但看起来有点复杂。 为了理解,我开始画画。 有点像流程图。

发生的第一件事是将0x4af缓冲区中的数据复制到新地址-0x49f并重置了0x4bd标志:



以下代码段是最有趣的:



实际上,这是对通过无线接收的命令的完整验证。 尽管这并不明显,但进一步的分析表明,如果在此之前接收到0xcc命令,则将转换为下一个单选命令,即切换到设置模式。 我对车队本身的新守则很感兴趣。 除了命令代码0x11、0x33、0x55和0xcc之外,还有其他内容。

无论在这里还是在更远的地方,我都无法找到命令的最后第六个字节的处理。 在图中,它以红色划线。 因此,所有团队都由五个字节组成。 至少在AM82TV的固件中。

我们看到的第一件事是检查缓冲区的第五个字节-命令本身的代码。 似乎这里有新的命令代码-0xad和0xda。 如果地址字段与eeprom中已记录的地址之一匹配,或者命令代码是0xad或0xda,并且地址字段== 0xaaaaaaaa,则来自缓冲区的命令成功通过测试。

剩余图片








图片

好吧,我们将认为我们已成功通过了下一个测试。 现在,命令代码位于0x4bf。 我们需要找到如何处理该字节的内容。 有几种方法可以做到这一点。 最简单的是在Ghidra中对反汇编代码进行文本搜索。 剩下的确切信息是读取该字节的内容。 这不是找到所有呼叫的保证方法,但是在这种特定情况下,它将起作用。 因此,首先,我们将在从0x1262开始的过程中看到一个字节读取:

图片

可以从一个地方访问-一个位于0x5e0的团队。

功能图:

图片

遗憾的是,在此过程中,除了已知的命令代码:0x11、0x33、0x55和0xcc之外,所有命令代码均被丢弃。 甚至在上一步中找到的代码0xad和0xda。 至少我没有设法在AM82TV电檐口的固件中找到新的无线电命令代码。

不过,可以访问固件,可以对其进行拆卸,查看如何实现特定功能并自行更改。 甚至添加一些东西。

固件和为atmega168修改的avr8.pspec文件发布在GitHub上

Source: https://habr.com/ru/post/zh-CN464657/


All Articles