Falošné čipy: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(23 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 13: | Riadok 13: | ||
- od jednotiek až po niekoľko desiatok. No a firma Atmel po výrobe procesorov každý kus na platni otestuje a zapíše do pamäte | - od jednotiek až po niekoľko desiatok. No a firma Atmel po výrobe procesorov každý kus na platni otestuje a zapíše do pamäte | ||
jeho polohu a číslo platne, takže aj spätne sa dá zistiť, kedy, kde a ako procesor vyrobili. Každý procesor tak získa unikátne | jeho polohu a číslo platne, takže aj spätne sa dá zistiť, kedy, kde a ako procesor vyrobili. Každý procesor tak získa unikátne | ||
výrobné číslo (signature). Podrobnosti o tomto kóde sú zverejnené a tak nie je ťažko spraviť si jednoduchý program, ktorý tento | výrobné číslo (signature). Fejkové čipy takúto informáciu nemajú. Buď je to preto, lebo neprešli testom, alebo sa výroba ani | ||
kód dokáže prečítať. | neunúva takúto informáciu vôbec zapisovať. Podrobnosti o tomto kóde sú zverejnené a tak nie je ťažko spraviť si jednoduchý | ||
program, ktorý tento kód dokáže prečítať. | |||
<center> | <center> | ||
Riadok 20: | Riadok 21: | ||
''Lokalizácia konkrétneho čipu na kremíkovej platni <BR> Zdroj: https://www.artwork.com/package/wmapconvert/manual_v2/glossary_of_terms.html'' | ''Lokalizácia konkrétneho čipu na kremíkovej platni <BR> Zdroj: https://www.artwork.com/package/wmapconvert/manual_v2/glossary_of_terms.html'' | ||
</center> | </center> | ||
Tak sme sa teda pozreli na šesť rozličných dosiek, ktoré sa nám postupne nazhromaždili. Takmer všetky sú nejaké neznačkové čínske klony a porovnali sme ich aj s originálnym Arduino Nano od | |||
talianskeho výrobcu. No a aké sú výsledky? | |||
<center> | |||
[[Súbor:ArduinoNano-Intro.jpg|center]]<BR> | |||
''Toto všetko ideme testovať.'' | |||
</center> | |||
{| class="wikitable" | |||
|- | |||
! | |||
! 1 | |||
! 2 | |||
! 3 | |||
! 4 | |||
! 5 | |||
! 6 | |||
|- | |||
| Foto | |||
| [[Súbor:NanoArduino.jpg|200px]]<br /> | |||
| [[Súbor:NanoArduino-2.jpg|200px]]<br /> | |||
| [[Súbor:NanoArduino-3.jpg|200px]]<br /> | |||
| [[Súbor:NanoArduino-4.jpg|200px]]<br /> | |||
| [[Súbor:NanoArduino-5.jpg|200px]]<br /> | |||
| [[Súbor:NanoArduino-6.jpg|200px]]<br /> | |||
|- | |||
| Výrobca | |||
| Arduino LLC | |||
| noname | |||
| USA? / noname | |||
| noname | |||
| Itead Studio | |||
| China / noname | |||
|- | |||
| USB konektor | |||
| mini | |||
| mini | |||
| mini | |||
| mini | |||
| micro | |||
| micro | |||
|- | |||
| USB cip | |||
| FTDI FT232RL | |||
| CH340C | |||
| FTDI FT232RL | |||
| CH340C | |||
| Silabs CP2102 | |||
| CH340C | |||
|- | |||
| ATmega328P | |||
| [[Súbor:ATmega328-01.jpg|200px]]<br /> | |||
| [[Súbor:ATmega328-02.jpg|200px]]<br /> | |||
| [[Súbor:ATmega328-03.jpg|200px]]<br /> | |||
| [[Súbor:ATmega328-04.jpg|200px]]<br /> | |||
| [[Súbor:ATmega328-05.jpg|200px]]<br /> | |||
| [[Súbor:ATmega328-06.jpg|200px]]<br /> | |||
|- | |||
| Signature<br /> | |||
| 1E 95 0F | |||
| 1E 95 0F | |||
| 1E 95 0F | |||
| 1E 95 0F | |||
| 1E 95 0F | |||
| 1E 95 0F | |||
|- | |||
| Lot<br />Wafer / X,Y<br /> | |||
| 0W0160 <br> 12 / 39,25 | |||
| 9U8013 <br> 24 / 26,34 | |||
| 8Y1844 <br> 22 / 7,19 | |||
| ⸮X⸮⸮⸮⸮⸮ <br> 255 / 255,255 | |||
| 6Y3010 <br> 2 / 36,31 | |||
| ⸮X⸮⸮⸮⸮⸮ <br> 255 / 255,255 | |||
|- | |||
| Výsledok | |||
| [[Súbor:StatusOK.png]] | |||
| [[Súbor:StatusOK.png]] | |||
| [[Súbor:StatusOK.png]] | |||
| [[Súbor:StatusCANCEL.png]] | |||
| [[Súbor:StatusOK.png]] | |||
| [[Súbor:StatusCANCEL.png]] | |||
|} | |||
Svoj vlastný procesor si môžete skontrolovať programom nižšie. | |||
<tabs> | |||
<tab name="Arduino"><source lang="c++"> | |||
// Source code based on the https://gist.github.com/speters/f889faec42b510052a6ab4be437d38ca | |||
// Purpose is to simply run a memory check on ATMEGA238P to test for counterfeit parts | |||
// Usually fake chip has only FF on the last line | |||
#include <avr/boot.h> | |||
#define SIGRD 5 | |||
void setup() | |||
{ | |||
Serial.begin(9600); | |||
Serial.println(""); | |||
Serial.println("boot sig dump"); | |||
int newLineIndex = 0; | |||
char buffer[40]; | |||
Serial.println("\n 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F"); | |||
sprintf(buffer, "00: "); | |||
Serial.print(buffer); | |||
for (uint8_t i = 0x00; i <= 0x0F; i += 1) | |||
{ | |||
sprintf(buffer, "%02X ",boot_signature_byte_get(i)); | |||
Serial.print(buffer); | |||
} | |||
Serial.println(); | |||
sprintf(buffer, "10: "); | |||
Serial.print(buffer); | |||
for (uint8_t i = 0x10; i <= 0x1F; i += 1) | |||
{ | |||
sprintf(buffer, "%02X ",boot_signature_byte_get(i)); | |||
Serial.print(buffer); | |||
} | |||
Serial.println(); | |||
Serial.println(); | |||
sprintf(buffer, "Signature: %02X %02X %02X ",boot_signature_byte_get(0x00),boot_signature_byte_get(0x02),boot_signature_byte_get(0x04)); | |||
Serial.print(buffer); | |||
if (boot_signature_byte_get(0x00) == 0x1E) | |||
if (boot_signature_byte_get(0x02) == 0x95) | |||
if (boot_signature_byte_get(0x04) == 0x0F) | |||
Serial.println(" (ATmega328P)"); | |||
else if (boot_signature_byte_get(0x04) == 0x16) | |||
Serial.println(" (ATmega328PB)"); | |||
else | |||
Serial.println(" (---)"); | |||
else | |||
Serial.println(" (---)"); | |||
else | |||
Serial.println(" (---)"); | |||
Serial.print(" Lot: "); | |||
Serial.write(boot_signature_byte_get(0x0F)); | |||
Serial.write(boot_signature_byte_get(0x0E)); | |||
Serial.write(boot_signature_byte_get(0x11)); | |||
Serial.write(boot_signature_byte_get(0x10)); | |||
Serial.write(boot_signature_byte_get(0x13)); | |||
Serial.write(boot_signature_byte_get(0x12)); | |||
Serial.print(" Wafer: "); | |||
Serial.print(boot_signature_byte_get(0x15),DEC); | |||
Serial.print(" X: "); | |||
Serial.print(boot_signature_byte_get(0x17),DEC); | |||
Serial.print(" Y: "); | |||
Serial.print(boot_signature_byte_get(0x16),DEC); | |||
Serial.println(" (Decimal)"); | |||
//Serial.println(); | |||
cli(); | |||
uint8_t lowBits = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); | |||
uint8_t highBits = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); | |||
uint8_t extendedBits = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); | |||
uint8_t lockBits = boot_lock_fuse_bits_get(GET_LOCK_BITS); | |||
sei(); | |||
Serial.print(" Fuses: Low: 0x"); | |||
Serial.print(lowBits, HEX); | |||
Serial.print(" High: 0x"); | |||
Serial.print(highBits, HEX); | |||
Serial.print(" Ext: 0x"); | |||
Serial.print(extendedBits, HEX); | |||
Serial.print(" Lock: 0x"); | |||
Serial.println(lockBits, HEX); | |||
} | |||
void loop() | |||
{ /* do nothing here */ } | |||
</source></tab> | |||
</tabs> | |||
Výsledok by mal vyzerať nejako takto pre originálne Arduino Nano od výrobcu Arduino S.r.l. (Taliansko) | |||
0x8F 512 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ||
0x0000: 1E A9 95 FF 0F BA 00 26 FF 06 FF 17 FF FF 57 30 | |||
0x0010: 31 30 30 36 FF 0C 19 27 17 05 12 09 13 09 FF FF | |||
Signature: 1E 95 0F (ATmega328P) | |||
Lot: 0W0160 Wafer: 12 X: 39 Y: 25 (Decimal) | |||
Fuses: Low: 0xFF High: 0xDA Ext: 0xFD Lock: 0xCF | |||
No a takto by ste to radšej nechceli (čínsky fejkový klon): | |||
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |||
0x0000: 1E AD 95 FF 0F FF FF 26 FF FF FF FF FF FF 58 FF | |||
0x0010: EF FF EF FF FF FF FF FF FF FF FF FF FF FF FF FF | |||
Signature: 1E 95 0F (ATmega328P) | |||
Lot: ⸮X⸮⸮⸮⸮ Wafer: 255 X: 255 Y: 255 (Decimal) | |||
Fuses: Low: 0xFF High: 0xDA Ext: 0xFD Lock: 0xCF | |||
Nasleduje popis kde sa ktorá informácia nachádza | |||
Device Signature Byte 1 [0x0000] - tu je kod vyrobcu | |||
0x1E Microchip (Atmel) | |||
Device Signature Byte 2 [0x0002] - tu by mala byt velkost Flash pamate: | |||
0x8F 512 | |||
0x90 1024 | |||
0x91 2048 | |||
0x92 4096 | |||
0x93 8192 | |||
0x94 16384 | |||
0x95 32768 | |||
0x96 65536 | |||
0x97 131072 | |||
Device Signature Byte 3 [0x0004] - toto je unikatne ID pre konkretny device | |||
Signature Bytes Device | |||
0x1E 0x92 0x05 ATmega48 | |||
1E 92 07 ATtiny44 | |||
1E 93 05 ATmega8 | |||
1E 93 0A ATmega88 | |||
1E 93 0B ATtiny85 | |||
1E 94 03 ATmega16 | |||
1E 94 06 ATmega168 | |||
1E 95 02 ATmega32 | |||
1E 95 14 ATmega328 | |||
1E 95 0F ATmega328P | |||
1E 95 16 ATmega328PB (!) | |||
RC Oscillator Calibration Byte [0x0001] - kalibračný bajt pre RC oscilátor | |||
Lot Number 1st Char [0x000F] - označenie výrobnej série (batch, lot) | |||
Lot Number 2nd Char [0x000E] | |||
Lot Number 3rd Char [0x0011] | |||
Lot Number 4th Char [0x0010] | |||
Lot Number 5th Char [0x0013] | |||
Lot Number 6th Char [0x0012] | |||
Reserved [0x0014] | |||
Wafer Number [0x0015] - číslo waferu v rámci série | |||
X-coordinate [0x0017] - poloha čipu na waferi X a Y | |||
Y-coordinate [0x0016] | |||
* | '''Zdroje''' | ||
* [https://microchip.my.site.com/s/article/Serial-number-in-AVR---Mega-Tiny-devices Serial number in AVR Mega devices] (microchip.com) | |||
* Chip signature ID (podľa toho sa napríklad avrdude rozhodne, či vám čip naprogramuje, alebo nie | |||
** [https://onlinedocs.microchip.com/pr/GUID-CBDC1838-0100-4F26-A45A-134958193C3B-en-US-4/index.html?GUID-5A8FB4BC-BC6B-47F2-AACE-6B6B107D5E8A Signature pre ATmega328x] (microchip.com) | |||
* Na doplnenie aj informácia o tzv. fuse bitoch | |||
** https://arduino.stackexchange.com/questions/24859/how-do-i-read-the-fuse-bits-from-within-my-sketch | |||
** https://www.engbedded.com/fusecalc/ | |||
'''Chcem vedieť viac...''' | |||
* Microchip o oznacovani svojich cipov https://www.microchip.com/product-change-notifications/#/9176/RMES-10NGWL694 ale aj https://www.microchip.com/mymicrochip/Data/GBNG-15KQFZ896/pcn_gbng-15kqfz896_part%20marking%20guideline_part1.pdf | |||
* [https://www.youtube.com/watch?v=o0rEzcKYzGw Video ako odhalili falošného výrobcu Aries] | |||
* [https://www.youtube.com/watch?v=PlGycKwnsSw Ako sa prejavujú falošné čipy - nefunkčný powerdown režim] a [https://www.eevblog.com/forum/microcontrollers/arduino-pro-mini-two-copies-have-different-sleep-currents/100/ takto to potom vlastne cele vzniklo ] | |||
* Tom Nardi: [https://hackaday.com/2017/12/27/a-guidebook-to-the-world-of-counterfeit-parts/ A GUIDEBOOK TO THE WORLD OF COUNTERFEIT PARTS]. Hackaday, December 27, 2017. | |||
* Yahya Tawil: [https://atadiat.com/en/e-introduction-counterfeit-ics-counterfeiting-detection-avoidance-methods/ An Introduction to Counterfeit ICs: Counterfeiting, Detection and Avoidance Methods]. 23rd December 2017 | |||
* Sparkfun: [https://www.sparkfun.com/news/350 ATmega Slugs] alebo aj [https://www.sparkfun.com/news/364 Revisiting the Counterfeit ATMega328s] | |||
[[Category:AVR]] |
Aktuálna revízia z 18:36, 6. júl 2024
Falošné čipy sú celkom často diskutovanou témou a tak som sa k nej dostal napokon aj ja. Začalo to celkom nevinne, nedokázal som totiž na jednej doštičke s klonom Arduino Nano rozchodiť časovač T2. A ani na druhej, ale na Arduino UNO mi to išlo. To už som začal hľadať chybu všade inde len nie u seba a napokon som narazil na stránku, kde bola opísaná jedna z možností, ako detekovať pravé Atmel (resp. Microchip) čipy a ako odhaliť tie nepravé. Je to celkom zaujímavé a dostaneme sa tak až celkom na úroveň výroby jednotlivých čipov. Každý mikroprocesor ATmega328P je spočiatku len jedna časť kremíkovej platne z priemerom 8 palcov, na ktorej sa postupne vrstva po vrstve vyrába celá štruktúra procesora. Ako takáto platňa (wafer) vyzerá?
Kremíková platňa (wafer) s priemerom 8 palcov, ktorú drží v ruke Eric Weddington (Atmel)
v roku 2013 na Maker Faire New York. Jedna takáto platňa obsahuje približne 1500 mikroprocesorov ATmega328.
(Foto/Source: Lenore Edman, Evil Mad Scientist
Obvykle sa procesory (a iné obvody) nevyrábajú po jednom, ale v tzv. dávkach (batch, LOT) obsahujúcch niekoľko takýchto platní - od jednotiek až po niekoľko desiatok. No a firma Atmel po výrobe procesorov každý kus na platni otestuje a zapíše do pamäte jeho polohu a číslo platne, takže aj spätne sa dá zistiť, kedy, kde a ako procesor vyrobili. Každý procesor tak získa unikátne výrobné číslo (signature). Fejkové čipy takúto informáciu nemajú. Buď je to preto, lebo neprešli testom, alebo sa výroba ani neunúva takúto informáciu vôbec zapisovať. Podrobnosti o tomto kóde sú zverejnené a tak nie je ťažko spraviť si jednoduchý program, ktorý tento kód dokáže prečítať.
Lokalizácia konkrétneho čipu na kremíkovej platni
Zdroj: https://www.artwork.com/package/wmapconvert/manual_v2/glossary_of_terms.html
Tak sme sa teda pozreli na šesť rozličných dosiek, ktoré sa nám postupne nazhromaždili. Takmer všetky sú nejaké neznačkové čínske klony a porovnali sme ich aj s originálnym Arduino Nano od talianskeho výrobcu. No a aké sú výsledky?
Toto všetko ideme testovať.
Svoj vlastný procesor si môžete skontrolovať programom nižšie.
// Source code based on the https://gist.github.com/speters/f889faec42b510052a6ab4be437d38ca
// Purpose is to simply run a memory check on ATMEGA238P to test for counterfeit parts
// Usually fake chip has only FF on the last line
#include <avr/boot.h>
#define SIGRD 5
void setup()
{
Serial.begin(9600);
Serial.println("");
Serial.println("boot sig dump");
int newLineIndex = 0;
char buffer[40];
Serial.println("\n 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
sprintf(buffer, "00: ");
Serial.print(buffer);
for (uint8_t i = 0x00; i <= 0x0F; i += 1)
{
sprintf(buffer, "%02X ",boot_signature_byte_get(i));
Serial.print(buffer);
}
Serial.println();
sprintf(buffer, "10: ");
Serial.print(buffer);
for (uint8_t i = 0x10; i <= 0x1F; i += 1)
{
sprintf(buffer, "%02X ",boot_signature_byte_get(i));
Serial.print(buffer);
}
Serial.println();
Serial.println();
sprintf(buffer, "Signature: %02X %02X %02X ",boot_signature_byte_get(0x00),boot_signature_byte_get(0x02),boot_signature_byte_get(0x04));
Serial.print(buffer);
if (boot_signature_byte_get(0x00) == 0x1E)
if (boot_signature_byte_get(0x02) == 0x95)
if (boot_signature_byte_get(0x04) == 0x0F)
Serial.println(" (ATmega328P)");
else if (boot_signature_byte_get(0x04) == 0x16)
Serial.println(" (ATmega328PB)");
else
Serial.println(" (---)");
else
Serial.println(" (---)");
else
Serial.println(" (---)");
Serial.print(" Lot: ");
Serial.write(boot_signature_byte_get(0x0F));
Serial.write(boot_signature_byte_get(0x0E));
Serial.write(boot_signature_byte_get(0x11));
Serial.write(boot_signature_byte_get(0x10));
Serial.write(boot_signature_byte_get(0x13));
Serial.write(boot_signature_byte_get(0x12));
Serial.print(" Wafer: ");
Serial.print(boot_signature_byte_get(0x15),DEC);
Serial.print(" X: ");
Serial.print(boot_signature_byte_get(0x17),DEC);
Serial.print(" Y: ");
Serial.print(boot_signature_byte_get(0x16),DEC);
Serial.println(" (Decimal)");
//Serial.println();
cli();
uint8_t lowBits = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS);
uint8_t highBits = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS);
uint8_t extendedBits = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS);
uint8_t lockBits = boot_lock_fuse_bits_get(GET_LOCK_BITS);
sei();
Serial.print(" Fuses: Low: 0x");
Serial.print(lowBits, HEX);
Serial.print(" High: 0x");
Serial.print(highBits, HEX);
Serial.print(" Ext: 0x");
Serial.print(extendedBits, HEX);
Serial.print(" Lock: 0x");
Serial.println(lockBits, HEX);
}
void loop()
{ /* do nothing here */ }
Výsledok by mal vyzerať nejako takto pre originálne Arduino Nano od výrobcu Arduino S.r.l. (Taliansko)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0x0000: 1E A9 95 FF 0F BA 00 26 FF 06 FF 17 FF FF 57 30 0x0010: 31 30 30 36 FF 0C 19 27 17 05 12 09 13 09 FF FF Signature: 1E 95 0F (ATmega328P) Lot: 0W0160 Wafer: 12 X: 39 Y: 25 (Decimal) Fuses: Low: 0xFF High: 0xDA Ext: 0xFD Lock: 0xCF
No a takto by ste to radšej nechceli (čínsky fejkový klon):
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0x0000: 1E AD 95 FF 0F FF FF 26 FF FF FF FF FF FF 58 FF 0x0010: EF FF EF FF FF FF FF FF FF FF FF FF FF FF FF FF Signature: 1E 95 0F (ATmega328P) Lot: ⸮X⸮⸮⸮⸮ Wafer: 255 X: 255 Y: 255 (Decimal) Fuses: Low: 0xFF High: 0xDA Ext: 0xFD Lock: 0xCF
Nasleduje popis kde sa ktorá informácia nachádza
Device Signature Byte 1 [0x0000] - tu je kod vyrobcu 0x1E Microchip (Atmel) Device Signature Byte 2 [0x0002] - tu by mala byt velkost Flash pamate: 0x8F 512 0x90 1024 0x91 2048 0x92 4096 0x93 8192 0x94 16384 0x95 32768 0x96 65536 0x97 131072 Device Signature Byte 3 [0x0004] - toto je unikatne ID pre konkretny device Signature Bytes Device 0x1E 0x92 0x05 ATmega48 1E 92 07 ATtiny44 1E 93 05 ATmega8 1E 93 0A ATmega88 1E 93 0B ATtiny85 1E 94 03 ATmega16 1E 94 06 ATmega168 1E 95 02 ATmega32 1E 95 14 ATmega328 1E 95 0F ATmega328P 1E 95 16 ATmega328PB (!) RC Oscillator Calibration Byte [0x0001] - kalibračný bajt pre RC oscilátor Lot Number 1st Char [0x000F] - označenie výrobnej série (batch, lot) Lot Number 2nd Char [0x000E] Lot Number 3rd Char [0x0011] Lot Number 4th Char [0x0010] Lot Number 5th Char [0x0013] Lot Number 6th Char [0x0012] Reserved [0x0014] Wafer Number [0x0015] - číslo waferu v rámci série X-coordinate [0x0017] - poloha čipu na waferi X a Y Y-coordinate [0x0016]
Zdroje
- Serial number in AVR Mega devices (microchip.com)
- Chip signature ID (podľa toho sa napríklad avrdude rozhodne, či vám čip naprogramuje, alebo nie
- Signature pre ATmega328x (microchip.com)
- Na doplnenie aj informácia o tzv. fuse bitoch
Chcem vedieť viac...
- Microchip o oznacovani svojich cipov https://www.microchip.com/product-change-notifications/#/9176/RMES-10NGWL694 ale aj https://www.microchip.com/mymicrochip/Data/GBNG-15KQFZ896/pcn_gbng-15kqfz896_part%20marking%20guideline_part1.pdf
- Video ako odhalili falošného výrobcu Aries
- Ako sa prejavujú falošné čipy - nefunkčný powerdown režim a takto to potom vlastne cele vzniklo
- Tom Nardi: A GUIDEBOOK TO THE WORLD OF COUNTERFEIT PARTS. Hackaday, December 27, 2017.
- Yahya Tawil: An Introduction to Counterfeit ICs: Counterfeiting, Detection and Avoidance Methods. 23rd December 2017
- Sparkfun: ATmega Slugs alebo aj Revisiting the Counterfeit ATMega328s