所以你想打造一个会议硬件徽章!
Ray Felch //
最近,有人建议为即将到来的信息安全会议创建一个硬件徽章会很酷。诚然,我在电子电路设计和软件开发方面有相当扎实的背景;然而,会议硬件徽章对我来说是一个相对较新的概念。幸运的是,我有一个儿子在信息安全领域工作多年,并且是会议徽章的狂热收藏家。在查看他收藏的一些徽章并进行多次谷歌搜索后,我很快发现会议徽章的范围可以从非常简单的、酷炫的闪烁灯板到更复杂的、“CTF”可黑客攻击的印刷电路板(PCB)。
许多这些徽章在设计上可以呈现一些非常独特的形状和有趣的丝印图像。几个月前,我有机会在坦帕的B-Sides会议上与Jonathan Singer联系。Jonathan从日程中抽出时间与我交谈,并向我提供了他几年前设计的2018年非官方DEFCON 26徽章的附加板。令人欣慰的是,他选择了与我一直在合作的同一家PCB制造厂(PCBWay)。
大纲
对于这篇文章,我决定使用我第一次尝试创建硬件徽章的过程作为 walk-through(因为这被证明是一次宝贵的学习经历)。我将重点介绍从开始到结束生产徽章所涉及的步骤,包括分享一些我需要克服的障碍。在这个过程中,我将提供一些关于电子电路设计的有用提示,以及一些代码开发技巧和工具,以及关于使用Arduino Uno作为开发板的有用信息。
此外,我将展示如何使用CAD设计系统将工作的电子面包板电路转换为PCB,并最终使用众多可用的制造制造商之一构建PCB。这篇文章将展示在此开发阶段可用的一些选项以及可能遇到的问题。
此外,我们将发现一些可用的选项,以构建一个成本效益高的成品。这可能涉及将CAD设计外包到海外(巴基斯坦)并在中国(PCBWAY、PLCPCB等)制造/组装PCB。这些选项虽然提供较低的价格,但可能会引入较长的交货时间,并且如果出现问题,可能会显著延迟开发人员、设计师和制造商之间的通信。不久之后,我意识到从开始到结束创建徽章涉及多少移动部件。
有趣的事实:我很快了解到,在我的时区,将AM翻转为PM(或PM翻转为AM)并增加一小时,就可以得到中国(PCBWAY)的当前时间。同样,将AM翻转为PM(或PM翻转为AM)并减去两小时,就可以得到巴基斯坦(PCB CAD设计师)的当前时间。
电子设计阶段
正如人们可能猜到的那样,这是构建硬件徽章整个过程中我最喜欢的部分。在开始之前,我需要想出一个既有趣又有教育意义的徽章主题。显然,会议徽章的“主题”可以千差万别,但鉴于这是我第一次进入未知水域,我决定保持相对简单。对于我的徽章,我选择模仿Milton Bradley(现为Hasbro)于1978年推出的电子游戏“Simon”。这个流行的游戏生成一系列音调和彩色灯光,进而要求玩家重复该序列。随着游戏的进行,序列的大小会增加。由于这个硬件徽章是针对信息安全受众的,我决定使用名称“CyMon”,作为一个文字游戏。
软件平台
过去几年,我一直在使用Arduino IDE和Arduino Uno开发板进行大量的软件/硬件开发。存在其他开发平台,我还尝试了使用Microsoft Visual Studio的Platform IO。Arduino Uno开发板的核心使用Atmel ATMega328P微处理器,是一个非常经济高效的16MHz处理器,提供14个数字输入/输出引脚(6个可以是PWM输出)和6个模拟输入。网上还有大量基于Arduino的信息,找到基于Arduino的Simon游戏示例相当容易。
Arduino IDE有一个伟大、易于使用的GUI(图形用户界面),使得编写代码并上传到板子变得容易。关于如何开始使用Arduino IDE的具体细节超出了本文的范围,但可以说,学习曲线应该相当短,特别是有了Arduino社区、论坛、博主和网上支持的所有帮助。
开始在面包板上工作
现在我们有了CyMon徽章的主题,我们可以开始收集所需组件来面包板电路。再次强调,学习如何面包板可能本身就是一篇文章,本文假设读者具有面包板如何构建以及如何互连各种组件的基本知识。
基于Simon游戏的概念,我们将需要4种不同颜色的LED(发光二极管):蓝色、绿色、红色和黄色。我们还需要用330欧姆电阻限制通过这些LED的电流,以免它们超过LED规格并烧毁。
此外,我们将需要4个瞬时(常开)开关来捕获用户的游戏选择。通常,开关的一侧将通过10k电阻上拉到Vcc(3.3伏)。开关的另一侧将连接到地(0伏)。当按钮被按下时,开关闭合,将信号从3.3伏(数字1)变为地(数字0)。注意:为了减少按键弹跳(抖动),我们将使用0.1uF陶瓷电容将开关旁路到地。
对于音频音调,我们需要一个压电(扬声器),并且为了与用户通信,我们将使用I2C OLED显示屏。除了4个游戏开关外,我们还将包括另外2个瞬时(NO)开关。这两个开关将是处理器的复位开关和新游戏(重新开始)开关,并将需要相同的10k电阻和0.1uF旁路电容。
最后,对于微处理器电路,我们将需要ATMega328P 28引脚微处理器、一个16MHz晶体(用于微处理器的高速外部时钟)、(2)个22pF旁路电容(用于时钟稳定性)以及一个拨动(电源开启)开关。面包板可以使用3.7伏可充电CR2032纽扣电池供电,因此我们需要一个纽扣电池座和几个10uF电解电容用于电源轨。
组件
- (4) LED 蓝色、绿色、红色和黄色
- (4) 330欧姆电阻
- (6) 触觉瞬时(NO)开关
- (6) 10k上拉电阻
- (1) 压电(扬声器)
- (1) OLED显示屏
- (1) ATMega328P微处理器
- (2) 22pF陶瓷电容
- (1) 16MHz晶体振荡器
- (6) 0.1uF陶瓷电容
- (1) 滑动DPST拨动开关
- (1) 纽扣电池座
- (2) 10uF电解电容
查看组件列表,我们应该注意到大多数是被动组件(通常不受反极性或电压问题等影响)。在列出的组件中,微处理器和OLED显示屏被视为有源组件。如果接线不正确或承受超过设备额定值的高电压水平,有源组件可能会严重损坏。同样,必须注意有源组件的接线,确保Vcc仅连接到相应标记的引脚。将Vcc直接连接到GPIO(通用输入/输出)引脚可能会永久损坏设备。当我们测试原型PCB时,这将变得更加相关。
注意:虽然电阻、电容和开关被视为被动组件且不易损坏,但在高电流或高电压的极端条件下,如果电路设计不当,任何组件都可能损坏。话虽如此,本文中描述的电路是非常常见的配置,消耗的电流非常小,通常在3.3伏到5伏下运行。显然,在面包板阶段损坏的组件对整个构建过程的影响要比在原型测试阶段小。前者只需从面包板上取下损坏的组件并更换设备,而后者需要特殊的表面贴装设备(SMD)设备和工具来移除损坏的设备。同样,在没有首先检查有源组件的正确方向的情况下向(后者阶段)原型板供电可能是一个主要头痛问题(正如我们即将看到的)。
如何获得个别(子电路)组件设计的帮助
在面包板阶段,当设计硬件徽章的整体电路时,我发现进行谷歌搜索以获取如何实现各种子电路的想法很有帮助。例如,我们可以搜索“Arduino OLED display DIY”,或“Arduino piezo DIY”,或“Arduino momentary switch DIY”,或“Arduino LED DIY”等。
这些搜索链接不仅提供有用的接线图和伟大的教程视频,它们通常还提供示例草图(代码块),可以上传到Arduino Uno开发板以测试和调试代码。一旦您验证了特定子电路按预期工作,您可以将组件及其接线移动到主面包板。
接线ATMega328P 28引脚微处理器双列直插封装(DIP)
设计自己的电子电路的一个巨大步骤是了解开发板微处理器的细节,并将该微处理器纳入面包板。仔细检查Arduino Uno板载微处理器,您会注意到它使用28引脚DIP封装的ATMega328P设备。
有了这些知识,我们现在可以在面包板上安装ATMega328P处理器,并利用Arduino Uno开发板的大部分功能。下图显示了ATMega328P的逐引脚接线及其相应的少数组件(16MHz晶体、2个22pF电容、复位瞬时开关和10k电阻)。此图中还显示了一个LED和相应的330欧姆限流电阻(作为示例)。比较两个图,我们可以看到LED连接到处理器的引脚19,映射图指示引脚19对应于GPIO-13(数字引脚D13)。额外提示:在代码中将GPIO D13设置为高(3.3v)会打开LED,设置为低会关闭LED。
现在我们有了运行中的面包板,我们可以将引脚2(RX)和引脚3(TX)(和GND)引出到面包板上的空位。这两个引脚是处理器的串行UART(通用异步接收器/发送器),当连接到TTL-USB适配器时,允许以与编程Arduino Uno相同的方式编程ATMega328P设备。由于有许多不同的方式编程ATMega328P(使用TTL-USB的UART、使用FTDI-USB的SPI、USB-ISP、USB-ASP等),这些编程步骤更适合后续文章。
有了功能正常的面包板“测试床”,我们可以编写Simon游戏代码,编译代码,并将固件上传到处理器以进行彻底测试和调试。编写代码以及测试和调试代码本身是一个持续的过程。花费多少时间直接与您想要超越创建功能Simon游戏所需的范围有关。
就我而言,我决定让我的硬件徽章可黑客攻击。我添加了一些代码,使用UART(通用异步接收器/发送器)连接,我可以连接TTL-USB适配器,然后使用像minicom这样的终端程序访问代码中的shell,以发现隐藏菜单和隐藏的CTF挑战。UART串行接口允许徽章和终端程序之间的双向通信。例如,终端程序可以接收处理器可能发送的任何数据并在其控制台中显示。
正如您可能猜到的那样,您在软件开发上花费的时间仅受您的想象力和您想要提供的功能数量的限制。当然,当针对特定会议时,可能会有时间限制。
现在将是考虑印刷电路开发阶段的好时机,因为制造交货时间可能为25到30天或更长。幸运的是,我们可以在生产过程中的这些长延迟期间继续编写和调整代码。
CAD设计阶段
计算机辅助设计是使用计算机来帮助创建、修改、分析或优化设计。该软件用于提高设计师的生产力,提高设计质量,通过文档改善通信,并为制造创建数据库。(维基百科)
有相当多的CAD软件可供选择。许多是免费的,许多是昂贵的,许多介于两者之间。此外,许多CAD软件系统针对特定应用,如建筑/房屋建设和平面布局、3D建模、印刷电路板设计和制造等。当然,我们对PCB设计软件感兴趣,这里也有丰富的选择(Altium、Altium 365、Autodesk Fusion 360、Autodesk EAGLE、KiCad EDA、Ansys RedHawk、EasyEDA等)。回到80年代中期,我尝试了一个名为Orcad的软件包,该软件包至今仍然存在。
去年,我下载了Autodesk的EAGLE免费版本,并开始学习他们的CAD设计软件。我学习EAGLE内部工作的第一个项目是Simon游戏的通孔版本(无表面贴装组件)。尽管这是一个缓慢的过程(边学边用EAGLE),我成功地创建了原理图、板布局和布线。与所有优秀的CAD软件一样,只需单击按钮,我就能够生成Gerber文件、钻孔文件、BOM(材料清单)文件和拾放文件(拾取和放置SMT组件)。这些文件是构建和组装成品PCB产品的PCB制造公司所需的。
就我的实验性“学习EAGLE”印刷电路板而言,制造厂没有进行组装。我选择使用通孔而不是表面贴装组件(便于组装),并订购了5块没有组件组装的板子。总成本仅为30美元,制造构建交货时间仅为4到5天。当我收到板子时,我手动焊接了组件,并很快验证了其按预期运行。
2021 CyMon游戏
我使用EAGLE软件的经历是一次有回报的经历,然而完成这个相当简单的设计花了我几周时间。我需要克服的最大障碍之一是学习如何遍历浩瀚的库海以找到适合我应用的正确组件。我只能想象如果我采用低剖面表面贴装设备(SMD)技术方法会有多困难。此外,学习各种EAGLE命令工具也花了相当多的时间。话虽如此,我相信随着投入更多时间,以及新项目的出现,设计过程将变得更容易,完成时间也会更好。
这提出了一个值得考虑的重要点。当硬件徽章针对特定会议,并且需要满足紧迫的截止日期时,我觉得将CAD设计工作外包给 competent 专业人士可能是一个更好的选择。这就是我的第一个会议硬件徽章(CyMon)的情况,也是本文的重点。我担心重新上手使用EAGLE所需的时间,因为我已经将近一年没有使用它了。此外,我想在这个版本中使用低剖面表面贴装设备,这意味着要搜索新的库。更复杂的是,我们谈论的是800块PCB的订单,这完全排除了任何手动组装组件的可能性。
幸运的是,一位同事(我的儿子)建议我查看一个名为https://fiverr.com的网站,那里有许多不同领域的专业人士提供服务并与他人竞争您的业务。就我而言,我搜索了PCB设计师并联系了其中一些。最终,我得到了80美元的报价,包括2次修订和2天交付Gerber、拾放和BOM文件。考虑到我面临的紧迫会议截止日期,这似乎是显而易见的出路。
雇佣一位基于巴基斯坦的PCB设计师(我在FIVERR网站上找到的),我在2天内如约拿到了PCB制造文件。为了实现这一点,我必须向他提供粗略的原理图(甚至可以用纸和笔画)。下图说明了我用Microsoft Paint创建并提供给我的设计师的内容。
印刷电路板制造阶段
有了我的Gerber zip、BOM和PnP文件,是时候联系我当时最喜欢的PCB制造商,中国的PCBWay了。一年前,我在简单的通孔CyMon板上使用了这家制造厂,并且已经熟悉了他们的要求和定价。当然,我知道这个订单的交货时间和价格会更高,因为我使用的是低剖面SMD组件,并且他们将进行“拾放”组装。与我以前的PCB订单(仅板子)不同,这个PCB订单将是一个两步过程。首先,他们将制造PCB(4到5天的交货时间),然后他们将组装组件(25到30天的交货时间)。同样,将涉及两个成本。
额外提示:而不是使用普通的紫色板,我发现我可以为我的焊罩(应用于印刷电路板铜迹线的薄漆状聚合物层,用于防止氧化和防止焊桥)选择各种颜色。这允许我将板子“涂”成黑色,并在板上放置我选择的白色丝印图像。
硬件徽章到手 — 测试阶段
所以,一个月后,手上有五个原型,是时候给板子通电并观看魔法了!警告:不要这样做!!!不幸的是,我做了那件事,而且不是一次,而是两次!我艰难地发现PCBWay安装了一批来自泰国的处理器,这些处理器标记不正确(引脚1指定在设备的错误角落)。尽管这是一种非常罕见的情况,但确实发生过这种情况,特别是与克隆仿制品有关。Microchip/Atmel不承认ATMega328P-UTH为有效的认证部件,然而我们在许多产品中看到该部件,包括Arduino的Pro Micro和Pro Mini生产板。
正如我在本文很早之前所述,“如果接线不正确,有源组件可能会严重损坏。”由于微处理器(有源组件)由于错误的引脚1标记而放置方向错误,向板子施加电源将Vcc电压施加到错误的引脚上,并永久损坏设备。认为这可能是一个出厂即有缺陷的板子,我尝试了第二块板子并得到了相同的结果。所以,在这一点上,我拿出万用表并开始检查点对点连接的连续性。特别是,我检查了黄色、蓝色、红色和绿色LED与D10、D11、D12和D13之间的连续性(见上图原理图)。一段时间后,我发现D10 – D13焊盘与ATMega328P引脚图中的引脚编号不对齐。然后我确定,如果我们抬起芯片并逆时针旋转一圈,它将正确对齐。
有两块板子可能损坏,剩下三块可能可以挽救。使用热风枪,另一位同事(Rick Wisser)移除了处理器,清洁了焊盘区域,并放置了芯片(逆时针旋转一圈)。这次,当通电时,OLED显示屏通电,我们顺利运行。有了三个工作单元,下一步是通过上传软件对这些板子进行编程以进行功能测试。
宝贵的经验教训
始终对原型PCB进行快速连续性检查,特别是关于有源组件。在第一次给板子通电之前这样做!不幸的是,我们现在需要第二批次的原型,并且我们必须再次进行设计和制造过程(另外30天的等待)以确保正确的方向。在与我的设计师交谈并试图理解这种罕见的芯片方向问题是如何发生的之后,我了解到还有各种封装的设备(引脚1左上角、引脚1左下角等)。既然如此,我们必须始终确保验证引脚1的正确位置,以确保它与我们在设计阶段创建的板布局一致。注意:据我回忆,制造商(PCBWAY)确实通过电子邮件联系我们,并要求我们验证引脚1的位置以确保处理器的正确放置。设计师确认了左上角(显然对于该特定封装是错误的)。
经过两批原型PCB的运输,并验证了编程的板子按预期工作,我们现在准备下800块PCB的大订单。
不幸的是,这导致了另一个宝贵的教训。当选择我们的板组件时,我们必须始终确保制造厂有足够的库存数量。在我们的案例中,我们板子的一个关键组件现在在制造厂显示为“缺货”。我们现在有三个选项:将组件更换为兼容设备,从第三方来源(如Mouser、Digikey等)供应我们自己的零件,或DNP(不放置)该组件。在我们的案例中,没有兼容我们部件的组件,在检查了许多本地供应商后,我们很快发现所有主要分销商也缺货,并且背订单一直到明年。意识到这一点,我们决定暂停下订单,并暂时搁置该项目。
交货时间可能造成伤害
在整个硬件徽章项目中,有些事情变得非常清楚。我很快意识到,在开发的各个阶段