nandcromancy:现场交换NAND闪光灯

2021-04-28 11:25:38

通常在评估嵌入式系统时,可能会发生更改(预期或以其他方式),导致目标系统进入不再有效的状态(' Bricked')。在某些情况下,修复目标与执行A&#34一样简单;出厂重置",其他可能稍微介绍,并且需要使用调试接口(JTAG / SWD / *)闪烁目标或手动闪烁外部存储设备(SPI / NOR / NAND / EMMC)。这篇文章通过解决目标已经存在的情况而散步; Bricked'具有创造性的方法。

在某些停机期间,我在使用公共固件环境(CFE)作为引导加载程序的货架消费路由器处戳戳。在与CFE进行交互时,尝试识别在引导时传递给目标的参数和#39;在启动时的操作系统中,系统配置意外损坏:

cfe> BPRES:<输入>使用当前值' - '去之前参数'。'清除当前值' x'要退出此命令94908AC5300R ------ 0794906Ref ------07GT-AC2900 -----08Board ID:8 x< ---- obopsnumber的mac地址(1-64):10 ^ c < ----更多的whoopsxmemory配置更改 - 重新启动需要< ----保存的哎呀。流程分配(MB):14 ----

此时,我认为最终的保存/写入需要犯下意外的变化,因此我选择只需循环设备以避免进行永久性更改。循环设备后,发生了错误:

Shmoo WR DMWR DM 0000000000111111111122222222223333333333444444444455555555556666666666 012345678901234567890123456789012345678901234567890123456789012345678900 ------ ++++++++++++++++++++++++++ X +++++++++++++++++++++++++++ ---------- 01 - +++++++++++++++++++++++++ X ++++++++++++++++++++++++++ ---------------- 02 X ---- ---------------------------------------------------------------- -------------- 03 x -------------------------------- ------------------------------------------------------------------------ init失败,返回码00000001memc错误:0x00000000phy错误:0x00000000shmoo错误:0x10c00000 0x00000082 0x00000000

当设备备份时,它会立即生成先前的错误,无法进入CFE。在没有能够访问引导加载程序的情况下,无法更改配置,并且无法使用引导加载程序'恢复过程也无法使用。在线搜索此错误并导致死亡结束并导致一般的共识是以这种方式损坏CFE - 该设备是' Bricked'此时,我切换到使用我的备份设备(总是有备份),所以我可以回答关于有趣的目标参数的原始问题。作为旁边,设置kernp mfg_nvram_mode = 1 mfg_nvram_url = badull特别有趣。

后来我旋转回到砖砌的单元以识别修复它的路径。目标使用Broadcom SoC,并发现未植入的标题提供JTAG访问:

在使用JTagulator上枚举未填充的标题上的JTAG引脚后,可以使用Openocd确认访问:

$ Openocd -f ../Interface/jlink.cfg -f bcm49.cfgopen片上调试器0.11.0-rc2 + dev-gba0f382-dirty(2021-02-26-14:07)在GNU GPL V2下获得许可的错误报告,阅读http://openocd.org/doc/doxygen/bugs.htmldeprecated!使用'适配器速度' Not' Adapter_khz'信息Vinfo:Clock Speed 1000 Khzinfo:JTAG Tap:BCM490x.Tap抽头/设备找到:0x5BA00477(MFG:0x23B(arm Ltd),部分:0xBA00,Ver:0x5)信息:JTAG Tap:Auto0.tap Tap /设备找到:0x4ba00477 (MFG:0x23B(ARM LTD),部分:0xBA00,VER:0x4)信息:JTAG TAP:Auto1.Tap Tap /设备找到:0x0490617F(MFG:0x0BF(Broadcom),部分:0x4906,Ver:0x0)信息:JTAG点击:Auto2.Tap Tap /设备找到:0x0490617F(MFG:0x0BF(Broadcom),部分:0x4906,Ver:0x0)Info:BCM490x.A53.0:硬件有6个断点,4个观察点

用于恢复系统的另一条路径是通过存储设备,Macronix NAND芯片:

在这一点上,我开始奇怪的事情,我仍然有一个工作设备,我可以启动进入引导加载程序 - 是否可以将NAND芯片交换在运行的设备上并使用它来闪存损坏的NAND?

在尝试任何事情之前,如果他认为这个愚蠢的想法会有任何机会,我都会询问一名同事,他不是乐观的结果(要公平,我是' t22) - 我们做了一个打赌结果,我去上班了。

测试的第一阶段是找出系统是否会容忍NAND'删除'在跑步的时候?我知道回答这个问题,我需要更具方法性,而不是用热空气击中单位,同时运行并卸下芯片。该过程的第一阶段是识别NAND是如何支持的。布局看起来像VCC在以下位置绑在芯片中:

使用识别的VCC线路,最简单的回答我们第一个问题的方法是在系统运行时从NAND中删除VCC线。为此,我的第一次尝试是为了削减VCC线并添加'跳线'一旦启动加载程序完成,导线(36 AWG磁导线是巨大的东西)可以断开连接:

在右侧,我选择进一步回到电源迹线上,认为它将是一个更好的位置,因为它将进入NAND上几个销。在第一个跳线安装上,我使用玻璃纤维划痕笔去除涂层并暴露铜和小刀以切割迹线:

结果粗略,因为划痕笔尖太大了,我最终暴露了很多铜。不要使用划痕笔,只是一把精细的刀子,所以你不要乱七八糟。更像这样的:

与'跳线'已安装和连接,目标电源到引导加载程序(CFE),并使用命令DN(Dump Nand)来确保NAND可访问,然后通过断开跳线导线,从而删除电源:

cfe> DN ----------------------页:0,页:0 ---------------- 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ... 00000000000000 00000000 00000000_ ..........<切割长度> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 00000800:FF851903 2000000008 00FFF645 C2B9BF55 ...... E ... U00000810:FFFFFFFFFFFFFFFFF FFEE9423 4BA37819 ...........#kx00000820:ffffffff ffffffff ffee9423 4ba37819 ......... ..#kx00000830:fffffffff ffffffff ffee9423 4ba37819 ...........#kx ***命令status = 1cfe> web信息:等待在套接字上的连接1.‖[JCFE> Web信息:等待套接字连接0.␛[JCFE> ␀----< ----- vcc删除(重启)

删除电源时(标记为' vcc删除')重新启动的目标并无法返回到NAND无法访问的引导加载程序。问题的来源是右侧电源切割在一个从SOC和NAND移除电力的斑点。保持简单,初始剪切被恢复,切割和跳跃最接近NAND的痕迹:

将系统备份并尝试尝试先前的测试给了我初始问题的答案:通过断开跳线电线的电源,系统仍然是运行的,通过运行DN命令确认:

< ----- NAND VCC删除了CFE> DN --------------------------页:2 ----------------状态等待超时:NANDSTS = 0x3000000000面具= 0x80000000,COUNT = 2000000ERROR读数块000001000 = 2000000 ---------------------------00000800:0000000000000000:00000000 00000000 0000000000000000 00000000000000 0000000000000000 00000000000000 0000000000000000 0000000000000000 00000000000000 0000000000000000 00000000000000 0000000000000000 00000000000000 0000000000000000 0000000000000000 0000000000000000 00000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 00000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 000000` .... 00000810:0000000000 00000000 000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000 ................ 00000830: 00000000 0000000000 00000000 00000000 ................错误读取块0 ***命令状态= -1< -----预期读数NAND CFE> CFE> CFE>> ; ----- NAND VCC启用CFE> CFE> DN ------------------------页:3 ---------------- 00000000000000000000000000000000000000000000000000000000000000000000000000 ................ 00001810:00000000 00000000 00000000 00000000 ................<削减LENGTH> ------ ----------------------00000800:fffffffff ffffffff ffee9423 4ba37819 ...........#kx00000810:ffffffff ffffffff ffee9423 4ba37819。 ..........#KX00000820:FFFFFFFF FFFFFFFF FFEE9423 4BA37819 ...........#kx00000830:ffffffff ffffffff ffee9423 4ba37819 ...........#kx ***命令状态= 1< -----成功NAND READCFE>

通过确认它可以'关闭'在运行系统上的NAND在不中断引导加载程序的情况下,下一步是尝试向下关闭NAND,并在其运行时将其从电路板上移除。

使用热空气和镊子,一侧一次抬起(右侧然后左侧):

自从我在监视控制台时一边偏离一边的NAND,既然很容易看到举起&#34时的重启;左" NAND的一侧:

最有可能的罪魁祸首是读取的启用(Re#)或就绪/忙(R / B#)引脚更改状态。为了测试这一点,向两者添加跳线电线:

此时,NAND必须放在电路板上,以便将系统返回到引导加载程序,通过断开VCC跳线和RE#,R / B#线路持续连接,NAND再次关闭。将它们连接到地面:

NAND再次被删除,一次在监控引导加载程序控制台时工作一侧:

这次引导加载程序仍然处于活动状态,系统未重新启动。随着拼图的一部分完成是时候前进到下一步 - 将损坏的NAND附加到运行目标。

再次热空气被用来将替代品焊接到目标,第一次尝试不成功,因为在试图在两侧进行对齐时短路短路。如前所述,此时的故障需要重新开始整个过程​​ - 必须删除更换NAND,并且必须将原件放回电路板上。

对于第二次尝试,使用一张小纸来隔离NAND的一侧,而另一张纸将另一侧与热空气排列并连接:

一旦连接第一侧,就取出纸张,附着另一侧。一旦新的NAND到位,引导加载程序仍然是活动的。下一步是通过拆下地面跳线电线来重新启用RE#,R / B#引脚,最后重新连接VCC跳线。一旦重新连接一切,确认NAND可以使用DN命令进行:

cfe> DN ----------------------页:0,页:0 ---------------- 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ... 00000000000000 00000000 00000000_ ..........<为length&gt ;------------------ 00000800:FF851903 20080000 00c2b822 c978ff97 .... ......" .x..00000810:fffffffff ffffffff ffee9423 4ba37819 ...........#kx00000820:ffffffff ffffffff ffee9423 4ba37819 ..... ...... #kx00000830:fffffffff ffffffff ffee9423 4ba37819 ...........#kx ***命令状态= 1< -----成功!cfe>

通过成功的测试读取完成,工厂固件映像通过引导加载程序' W Web界面加载:

Web Info:等待套接字上的连接1.␛[JWEB信息:上传70647828字节,闪存图像格式。[J< -----图像uploadcfe> ........在地址0x06000000将JFFS2序列号设置为13闪下根文件系统(闪光偏移0x06000000):< -----图片写入............... ................................................ ............................................... ................................................ ................................................ ................................................ ................................................ ................................................ ................................................ ................................................ ................................................ ..............................重置板在0秒内...�---- btrmv1.6cpu0l1cdmmuimmu7datazbbsmainoTp?otppusbtnandimg?imgluhd ?uhdprlo?rlopubi?ubippass ----<< cfe版本1.0.38-161.122 for bcm94908(64bit,sp,le)建立日期:Mon 5月13日08:23:21 CST 2019(Defjovi @ Ubuntu- EVA02)版权所有(C)2000-2015 Broadcom Corporation.Boot带寄存器:0x6FC42芯片ID:BCM4906_A0,Broadcom B53核心:1800MHZTOTAL内存:536870912字节(512MB)状态等待超时:NANDSTS = 0x50000000 MASK = 0x40000000,COUNT = 0NAND ECC BCH-4,页面尺寸0x800字节,备用尺寸使用64 BYTESNAND闪存设备:,ID 0xC2DA块128KB尺寸262144KB<剪切长度>初始化开关低电平硬件.pmc_switch_power_up:rgmii tx clock zone1启用1 zone2启用1.software重置切换...... do.waiting mac port rx / tx才能启用。通过硬件...可拆卸开关所有Mac端口Rx / Tx ***按任意键停止自动运行(1秒)***自动运行秒数:0拍摄图像(地址0x06000000,闪光偏移0x06000000).. 。 .0(Buildroot 2016.02))#2 SMP Premept Fri Jun 19 13:05:44 CST 2020CPU:AARCH64处理器[420F1000]修订版0DETCETed VIPT I-CACHE上CPU0

如输出所示,Flash成功,系统启动到目标操作系统中。

我相信一些读这将说 - "为什么不使用$ device_name_hep incom读者/作家重新编程nand?&#34 ;,这是一个绝对公平的问题,可能会比这一废话更有意义; 但是,我相信这里的拟合报价是着名的混乱理论数学家: '你的科学家都是如此全神贯注于他们是否可以,他们没有停下来思考他们应该和#39;