Dump Flash晶元

該博客連載將介紹dump(轉儲) flash(快閃記憶體)晶元的方法,本文是該博客連載的第一部分。本文中,我們將描述如何拆焊flash晶元,以及設計和構建相應的分線板(breakoutboard)。

本博客連載將詳細介紹針對嵌入式非易失性存儲器的簡單而有效的攻擊方法。此類攻擊允許攻擊者執行以下操作:

  • 讀取存儲晶元里的內容;
  • 修改存儲晶元里的內容;
  • 監視源於或對存儲晶元的訪問,並對其進行修改(中間人攻擊)。

我們將討論以下主題:

  • 拆焊flash晶元;

  • 用KiCAD設計分線板;

  • 製作和微焊PCB;

  • 在IoT設備上安裝分線板;

  • Dump SPI(串列外設介面) flash晶元;

  • Dump 並行flash晶元;

  • 中間人攻擊。

假設你又打開了一個IoT設備,偶然發現了裡面的flash晶元。你一定很好奇,想知道其中奧秘。

拆焊 flash 晶元

有兩種方法可以讀取flash晶元的內容:

  • 直接連線至晶元的引腳上;

  • 拆焊flash晶元,然後把它插在另一塊板子上。

選擇讀取晶元方法的考慮因素之一是集成電路(IC )的封裝方式。比如說,直接連線到晶元引腳的方法對使用四側引腳扁平封裝(QFP)的晶元很有效,但是該方法不適用於無可見引腳的晶元。以下例子中的晶元採用球柵陣列封裝(BGA),也就意味著晶元上沒有可連接的可見引腳,所以我們選擇將之拆焊。

我們要拆焊的晶元圖片:

此方法優點:

  • 我們提取flash晶元,不會影響板子上的其他元器件。

  • 將晶元從板上完全移除,我們就能研究下面的PCB,並找出連接flash晶元的線路。

  • 可以用換別的東西替換原來的晶元(比如另一個晶元,單片機等等)。

此方法缺點:

  • 板子在缺少元器件的情況下無法使用,如果你想以後繼續用這塊板子的話,你要把晶元焊回去。

  • 提取的過程中附近的一些部件可能會受損。

  • 如果操作失誤的話,可能會損壞flash晶元本身。

所以...拆焊flash晶元,對吧?如果你以前從未嘗試過拆焊電子元器件,那麼對你來說棘手的部分是同時在所有引腳上熔化焊料。有幾種方法可以做到,我們這裡選擇用熱風槍,加熱晶元所在的區域,等待焊料熔化後拿掉晶元。

此方法簡單快速,但也容易拆焊周圍的元器件,所以要當心,不要移動周圍的元器件(此刻千萬別打噴嚏)。

下面的圖片展示了我們拆下的晶元,可以觀察下PCB布線。我們可做出一些假設,比如最下面兩行很有可能未被使用,因為它們沒有在線路上。

用KiCAD設計分線板

我們現在拿那個晶元做什麼? BGA布局讓人困惑,對於完全相同的晶元,你可以使用5x5或4x6網格。引腳分配同樣有趣,通常是針對晶元。你可能也想知道,如果這些引腳全部封裝在像這樣的網格中,那麼如何連接引腳?

方法之一是做一個分線板!在分線板上做一個晶元所有引腳的鏡像,而且引腳之間的距離更大,所以你可以輕易地連接引腳。

為了實現這一點,我們首先需要收集關於晶元本身的一些信息。大多數時候,品牌或型號寫在晶元上以便於識別。有了這些信息,你可以查找相應的數據手冊。如果你無法識別晶元,或者找不到數據手冊,則必須在PCB上做一些逆向工作來識別每個信號。

在我們晶元上的第一行顯示了品牌:MXIC代表Macronix International。第二行是晶元的型號,我們由此可以找到MX25L3255EXCI數據手冊。

我們感興趣的部分是引腳布局,即數據手冊的第7頁,介紹了BGA(4x6和5x5兩種網格)和SOP8 (8引腳小尺寸封裝)。我們可以看到只有8個引腳是有用的,其他引腳被標記為「NC」,意思是「無連接」。

為了連接flash晶元,我們需要一個包含所有必需引腳的PCB,這些引腳要易於連接。

可以用KiCAD來設計PCB,KiCAD是最受歡迎的電子設計自動化(EDA)軟體之一。

如果你不熟悉KiCAD,可以參考許多很好的教程,例如KiCAD Quick-Start Tutorial。

設計分線板和設計其他板子的過程相同:

1. 在EEeschema中創建分線板的電路圖,並定義相關的元器件,例如flash晶元。

2. 在PcbNew中定義flash晶元的封裝形式,這裡我們會用到之前看過的數據手冊。我們用BGA封裝並添加一個4x6網格和兩個連接8個有用引腳的1x4連接器。最後一步是布線來連接我們的元器件。

設計已完成,那麼如何將KiCAD里的設計做成PCB呢?

製作PCB

PCB一般是兩層銅之間夾一層基板。基板通常由FR-4(環氧板)製成,但也可以用其它便宜的材料。在銅層上完成布線後,要除去多餘的銅。

有幾種技術可以去除不需要的銅,我們嘗試了以下技術:

  • 蝕刻;

  • 數控銑。

我們使用蝕刻技術製作了4x6 BGA PCB,並且用數控銑技術製作了5x5 BGA PCB,詳見下文。

蝕刻

蝕刻是指使用化學試劑除去金屬上未受保護的表面。我們使用墨粉規劃線路,並保護需要保留的銅。

  1. 我們用熱轉印法來實現設計。用激光印表機將設計列印在亮面紙上,然後將該紙粘貼到基板上,並施加熱量和壓力將設計印在銅層上。通常可以使用普通的熨斗來施加熱量和壓力。我們發現層壓機效果更好,因為施加的熱量和壓力分布更均勻。

  2. 下一步就是蝕刻。將板子浸入化學試劑中,除了墨粉覆蓋的銅,其餘的銅將被去除。

蝕刻後的分線板還帶著墨粉:

用丙酮除掉墨粉:

PCB板現在可以進行微焊了,微焊就是焊接微小的元器件,因此需要顯微鏡。

傳統焊接的另一個區別是焊錫,傳統焊接使用錫線,而BGA微焊使用錫球。

接下來,我們可以開始重整錫球:

  • 在每個焊盤上放一個焊球,並加熱至熔化;

  • 調整晶元和板子;

  • 迴流焊。

註:此圖為GIF,見附件flash_reballing.gif

正在重整錫球:

最終將晶元微焊在了板子上:

數控銑(xǐ)

另一種技術是用數控銑床來加工銅層,該技術實際上是通過隔離來生成線路,並且保留多餘的銅,而不是除掉不需要的銅。

1. 用5x5 BGA構建PCB。4x6版本用於分線板,我們這裡設計了5x5版本,以便直接插入通用EEPROM(電子抹除式可複寫只讀內存)編程器的ZIF(零插拔力插座)插口。正如我們在數據手冊中看到的,該晶元採用SOP8封裝,因此我們選擇模擬DIP8(8引腳雙列直插封裝)排針,引腳分布與SOP8相同。對於通用EEPROM編程器來說,這就基本上相當於是通過SOP8-DIP8適配器來讀取SOP8晶元。

2. 晶元的封裝形式與我們為4x6設計的相似,但是對於5x5網格,DIP81x4連接器距離更近,而且為遵循SOP8布局,線路也更複雜,這完全不同於之前那個BGA。

3. KiCAD無法直接生成與數控銑床兼容的文件,因此我們要使用FlatCAM。FlatCAM可以處理Gerber文件,並且可以為數控銑床定義分隔銅線路的軌跡。為了避免短路,我們完全去除了BGA晶元下的一個區域中不需要的銅。

4. 我們將生成的STL文件傳輸給負責控制數控銑床的bCNC。bCNC的一些功能很好用,例如自動調平,即多點測量電路板的實際高度(因為沒有什麼東西是完全平的),以及生成下面圖片中看到的熱圖像。

對應bCNC中綠色高亮的軌跡正在加工:

5. 加工好的板子:

近看成品可以看出BGA晶元下的線路:

6. 接下來,我們塗一些阻焊層,這是保護銅免受氧化的特殊綠色層,並用紫外線固化。

7. 阻焊層覆蓋的BGA和1x4連接器的焊盤是無法使用的,我們得手動刮開焊盤上面的薄層。

8. 鍍錫,在所有焊盤上放置焊錫:

9. 再用數控銑床打洞和切割板子的邊緣:

10. 最終的焊有BGA晶元的板子成品,可拿來直接插入通用EEPROM編程器:

因為我們選擇模擬SOP8引腳排列,我們只需告訴編程器我們的晶元是SOP8版本!

彩蛋——失敗集錦

我們整理了一些失敗狀況,因為總會發生計劃外的事情,但是我們通過這些試驗學到了很多東西,現在我們已經準備好進行下一步在IoT設備上安裝了:)

熱轉印並不像聽起來那麼容易。。。

以合適的深度在數控銑床上加工也不像聽起來那麼容易。。。

找不到不粘在綠色阻焊層的塑料(後來發現宜家的凍存袋很好用:))

嘗試處理綠色阻焊。

第二次嘗試用了一個帶彈簧的工具:看起來好像還可以,但是實際上連接焊盤的線路被切斷了。。。

第三次先加了一些焊錫,想著這樣能變厚一些。

弄出來一個很厚的綠色阻焊層的「湖」,無法做紫外線固化,當結冰的湖的表面破裂時。。。

結論

這就是我們的第一篇文章,介紹了如何拆焊flash晶元和設計PCB,也詳細描述了兩種PCB製造技術。

致謝

感謝Quarkslab所有對本文進行了校對並提供了有價值反饋的同事們。

本文由看雪翻譯小組 SpearMint 編譯,來源quarkslab@Emma Benoit,Guillaume Heilles,Philippe Teuwen 轉載請註明來自看雪社區


推薦閱讀:

TAG:智能硬體 | 晶元集成電路 | PCB |