РСвСрсинг ΠΈ Π²Π·Π»ΠΎΠΌ ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ внСшнСго HDD-накопитСля Aigo. Π§Π°ΡΡ‚ΡŒ 2: Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ с Cypress PSoC

Π­Ρ‚ΠΎ вторая ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΡ€ΠΎ Π²Π·Π»ΠΎΠΌ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰ΠΈΡ…ΡΡ Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ΠΉ. Напоминаю, Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΊΠΎΠ»Π»Π΅Π³Π° занСс ΠΌΠ½Π΅ Тёсткий диск Patriot (Aigo) SK8671, ΠΈ я Ρ€Π΅ΡˆΠΈΠ» Π΅Π³ΠΎ ΠΎΡ‚Ρ€Π΅Π²Π΅Ρ€ΡΠΈΡ‚ΡŒ, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ дСлюсь, Ρ‡Ρ‚ΠΎ ΠΈΠ· этого ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ дальшС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

4. НачинаСм ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„Π»Π΅ΡˆΠΊΠΈ PSoC
5. ISSP-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»
– 5.1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ISSP
– 5.2. ДСмистификация Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²
– 5.3. ΠžΠ±Ρ‰Π΅Π½ΠΈΠ΅ с PSoC
– 5.4. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π²Π½ΡƒΡ‚Ρ€ΠΈΡ‡ΠΈΠΏΠΎΠ²Ρ‹Ρ… рСгистров
– 5.5. Π—Π°Ρ‰ΠΈΡ‚Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹
6. ΠŸΠ΅Ρ€Π²Π°Ρ (Π½Π΅ΡƒΠ΄Π°Π²ΡˆΠ°ΡΡΡ) Π°Ρ‚Π°ΠΊΠ°: ROMX
7. Вторая Π°Ρ‚Π°ΠΊΠ°: трассировка с Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ
– 7.1. РСализация
– 7.2. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
– 7.3. РСконструкция Ρ„Π»Π΅Ρˆ-Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ°
– 7.4. Находим адрСс хранСния ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°
– 7.5. Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ Π±Π»ΠΎΠΊΠ° β„–126
– 7.6. ВосстановлСниС ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°
8. Π§Ρ‚ΠΎ дальшС?
9. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

РСвСрсинг ΠΈ Π²Π·Π»ΠΎΠΌ ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ внСшнСго HDD-накопитСля Aigo. Π§Π°ΡΡ‚ΡŒ 2: Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ с Cypress PSoC


4. НачинаСм ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„Π»Π΅ΡˆΠΊΠΈ PSoC

Π˜Ρ‚Π°ΠΊ, всё ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ (ΠΊΠ°ΠΊ ΠΌΡ‹ установили Π² [ΠΏΠ΅Ρ€Π²ΠΎΠΉ части]()), Ρ‡Ρ‚ΠΎ ΠΏΠΈΠ½ΠΊΠΎΠ΄ хранится Π²ΠΎ Ρ„Π»Π΅Ρˆ-Π½Π΅Π΄Ρ€Π°Ρ… PSoC. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ эти Ρ„Π»Π΅Ρˆ-Π½Π΅Π΄Ρ€Π°. Π€Ρ€ΠΎΠ½Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ€Π°Π±ΠΎΡ‚:

  • Π²Π·ΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Β«ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Β» с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ;
  • Π½Π°ΠΉΡ‚ΠΈ способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ Π»ΠΈ это Β«ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Β» ΠΎΡ‚ считывания ΠΈΠ·Π²Π½Π΅;
  • Π½Π°ΠΉΡ‚ΠΈ способ ΠΎΠ±Ρ…ΠΎΠ΄Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹.

БущСствуСт Π΄Π²Π° мСста, Π³Π΄Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΈΠ½ΠΊΠΎΠ΄:

  • внутрСнняя Ρ„Π»Π΅Ρˆ-ΠΏΠ°ΠΌΡΡ‚ΡŒ;
  • SRAM, Π³Π΄Π΅ ΠΏΠΈΠ½ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ для сравнСния Π΅Π³ΠΎ с Ρ‚Π΅ΠΌ ΠΏΠΈΠ½ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вводится ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

ЗабСгая Π²ΠΏΠ΅Ρ€Ρ‘Π΄, ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ всё-Ρ‚Π°ΠΊΠΈ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠ½ΡΡ‚ΡŒ Π΄Π°ΠΌΠΏ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„Π»Π΅ΡˆΠΊΠΈ PSoC, – обойдя Π΅Ρ‘ систСму Π·Π°Ρ‰ΠΈΡ‚Ρ‹, посрСдством Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ Π°Ρ‚Π°ΠΊΠΈ «трассировка с Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉΒ» – послС рСвСрсинга Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… возмоТностСй ISSP-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΌΠ½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°.

$ ./psoc.py 
syncing: KO OK
[...]
PIN: 1 2 3 4 5 6 7 8 9

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:

5. ISSP-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»

5.1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ISSP

Β«ΠžΠ±Ρ‰Π΅Π½ΠΈΠ΅Β» с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ: ΠΎΡ‚ Β«vendor to vendorΒ», Π΄ΠΎ взаимодСйствия с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ICSP для Microchip’овского PIC).

Π£ Cypress для этого собствСнный ΠΏΡ€ΠΎΠΏΡ€ΠΈΠ΅Ρ‚Π°Ρ€Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ISSP (in-system serial programming protocol; внутрисистСмный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ частично описан Π² тСхничСской спСцификации. ΠŸΠ°Ρ‚Π΅Π½Ρ‚ US7185162 Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Ρ‘Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ OpenSource-Π°Π½Π°Π»ΠΎΠ³, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ HSSP (ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈΠΌ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅). ISSP Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ PSoC;
  • вывСсти магичСскоС число Π½Π° Π½ΠΎΠΆΠΊΡƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… этой PSoC; для Π²Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌ внСшнСго программирования;
  • ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ строки, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Β«Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈΒ».

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° ISSP эти Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ лишь для нСбольшой горстки ΠΊΠΎΠΌΠ°Π½Π΄:

  • Initialize-1
  • Initialize-2
  • Initialize-3 (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 3V ΠΈ 5V)
  • ID-SETUP
  • READ-ID-WORD
  • SET-BLOCK-NUM: 10011111010dddddddd111, Π³Π΄Π΅ dddddddd=block #
  • BULK ERASE
  • PROGRAM-BLOCK
  • VERIFY-SETUP
  • READ-BYTE: 10110aaaaaaZDDDDDDDDZ1, Π³Π΄Π΅ DDDDDDDD = data out, aaaaaa = адрСс (6 Π±ΠΈΡ‚)
  • WRITE-BYTE: 10010aaaaaadddddddd111, Π³Π΄Π΅ dddddddd = data in, aaaaaa = адрСс (6 Π±ΠΈΡ‚)
  • SECURE
  • CHECKSUM-SETUP
  • READ-CHECKSUM: 10111111001ZDDDDDDDDZ110111111000ZDDDDDDDDZ1, Π³Π΄Π΅ DDDDDDDDDDDDDDDD = data out: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма дСвайса
  • ERASE BLOCK

НапримСр, Π²Π΅ΠΊΡ‚ΠΎΡ€ для Initialize-2:

1101111011100000000111 1101111011000000000111
1001111100000111010111 1001111100100000011111
1101111010100000000111 1101111010000000011111
1001111101110000000111 1101111100100110000111
1101111101001000000111 1001111101000000001111
1101111000000000110111 1101111100000000000111
1101111111100010010111

Π£ всСх Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π° Π΄Π»ΠΈΠ½Π°: 22 Π±ΠΈΡ‚Π°. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° HSSP Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΏΠΎ ISSP: Β«ISSP-Π²Π΅ΠΊΡ‚ΠΎΡ€ это Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅ ΠΊΠ°ΠΊ битовая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ собой Π½Π°Π±ΠΎΡ€ инструкций».

5.2. ДСмистификация Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²

РазбСрёмся, Ρ‡Ρ‚ΠΎ здСсь происходит. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», Ρ‡Ρ‚ΠΎ эти самыС Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой raw-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ M8C-инструкций, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² эту Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΎΠΏΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

Π—Π°Ρ‚Π΅ΠΌ я Π·Π°Π³ΡƒΠ³Π»ΠΈΠ» Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€, ΠΈ наткнулся Π½Π° Π²ΠΎΡ‚ это исслСдованиС, Π³Π΄Π΅ Π°Π²Ρ‚ΠΎΡ€, хотя ΠΈ Π½Π΅ погруТаСтся Π² Π΄Π΅Ρ‚Π°Π»ΠΈ, Π΄Π°Ρ‘Ρ‚ нСсколько Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… подсказок: «КаТдая инструкция начинаСтся с Ρ‚Ρ€Ρ‘Ρ… Π±ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊ (ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· RAM, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² RAM, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ рСгистр, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ рСгистр). Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Ρ‘Ρ‚ 8-Π±ΠΈΡ‚ адрСса, послС Ρ‡Π΅Π³ΠΎ 8 Π±ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… (считанныС ΠΈΠ»ΠΈ для записи) ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ‚Ρ€ΠΈ стоп-Π±ΠΈΡ‚Π°Β».

Π—Π°Ρ‚Π΅ΠΌ ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½ΡƒΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° Β«Supervisory ROM (SROM)Β» тСхничСского руководства. SROM это Тёстко закодированная ROM, Π² PSoC, которая прСдоставляСт сСрвисныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΏΠΎ схоТСму ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Ρ‡Ρ‚ΠΎ ΠΈ Syscall), – для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ пространствС:

  • 00h: SWBootReset
  • 01h: ReadBlock
  • 02h: WriteBlock
  • 03h: EraseBlock
  • 06h: TableRead
  • 07h: CheckSum
  • 08h: Calibrate0
  • 09h: Calibrate1

Бравнивая ΠΈΠΌΠ΅Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² с функциями SROM, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ этим ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ, – с ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌΠΈ SROM-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Благодаря этому ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π±ΠΈΡ‚Π° ISSP-Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

  • 100 => β€œwrmem”
  • 101 => β€œrdmem”
  • 110 => β€œwrreg”
  • 111 => β€œrdreg”

Однако ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈΡ‡ΠΈΠΏΠΎΠ²Ρ‹Ρ… процСссов, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ нСпосрСдствСнном ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ с PSoC.

5.3. ΠžΠ±Ρ‰Π΅Π½ΠΈΠ΅ с PSoC

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π”ΠΈΡ€ΠΊ ΠŸΠ΅Ρ‚Ρ€Π°ΡƒΡ‚ΡΠΊΠΈΠΉ ΡƒΠΆΠ΅ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» Cypress’овский HSSP-ΠΊΠΎΠ΄ Π½Π° Arduino, я воспользовался Arduino Uno для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ISSP-Ρ€Π°Π·ΡŠΡ‘ΠΌΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‹.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Ρ…ΠΎΠ΄Π΅ своих исслСдования, я довольно сильно ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΠΊΠΎΠ΄ Π”ΠΈΡ€ΠΊΠ°. Мою ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π½Π° GitHub: здСсь ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Python-скрипт для общСния с Arduino, Π² ΠΌΠΎΡ‘ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ cypress_psoc_tools.

Π˜Ρ‚Π°ΠΊ, примСняя Arduino, я сначала использовал для «общСния» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅Β» Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹. Π― попытался ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ROM, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ VERIFY. Как ΠΈ оТидалось, этого ΠΌΠ½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ. ВСроятно ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π»Π΅ΡˆΠΊΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π±ΠΈΡ‚Ρ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ считывания.

Π—Π°Ρ‚Π΅ΠΌ я создал нСсколько своих ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², для записи ΠΈ чтСния памяти/рСгистров. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ всю SROM, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„Π»Π΅ΡˆΠΊΠ° Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π°!

5.4. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π²Π½ΡƒΡ‚Ρ€ΠΈΡ‡ΠΈΠΏΠΎΠ²Ρ‹Ρ… рСгистров

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π² Π½Π° «дизассСмблированныС» Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ дСвайс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ рСгистры (0xF8-0xFA), для указания M8C-ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π² ΠΎΠ±Ρ…ΠΎΠ΄ Π·Π°Ρ‰ΠΈΡ‚Ρ‹. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΌΠ½Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠΊΠΎΠ΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Β«ADDΒ», Β«MOV A, XΒ», Β«PUSHΒ» ΠΈΠ»ΠΈ Β«JMPΒ». Благодаря ΠΈΠΌ (глядя Π½Π° ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΈΠΌΠΈ Π½Π° рСгистры) я смог ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… рСгистров, фактичСски ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ рСгистрами (A, X, SP ΠΈ PC).

Π’ ΠΈΡ‚ΠΎΠ³Π΅, «дизассСмблированный» ΠΊΠΎΠ΄, сгСнСрированный инструмСнтом HSSP_disas.rb, – выглядит Ρ‚Π°ΠΊ (для ясности я Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ):

--== init2 ==--
[DE E0 1C] wrreg CPU_F (f7), 0x00   # сброс Ρ„Π»Π°Π³ΠΎΠ²
[DE C0 1C] wrreg SP (f6), 0x00      # сброс SP
[9F 07 5C] wrmem KEY1, 0x3A     # ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для SSC
[9F 20 7C] wrmem KEY2, 0x03     # Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ
[DE A0 1C] wrreg PCh (f5), 0x00     # сброс PC (MSB) ...
[DE 80 7C] wrreg PCl (f4), 0x03     # (LSB) ... Π΄ΠΎ 3 ??
[9F 70 1C] wrmem POINTER, 0x80      # RAM-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ для Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
[DF 26 1C] wrreg opc1 (f9), 0x30        # Опкод 1 => "HALT"
[DF 48 1C] wrreg opc2 (fa), 0x40        # Опкод 2 => "NOP"
[9F 40 3C] wrmem BLOCKID, 0x01  # BLOCK ID для Π²Ρ‹Π·ΠΎΠ²Π° SSC
[DE 00 DC] wrreg A (f0), 0x06       # Π½ΠΎΠΌΠ΅Ρ€ "Syscall" : TableRead
[DF 00 1C] wrreg opc0 (f8), 0x00        # Опкод для SSC, "Supervisory SROM Call"
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12    # НСдокуммСнтированная опСрация: Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ внСшний ΠΎΠΏΠΊΠΎΠ΄

5.5. Π—Π°Ρ‰ΠΈΡ‚Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹

На Π΄Π°Π½Π½ΠΎΠΌ этапС я ΡƒΠΆΠ΅ ΠΌΠΎΠ³Ρƒ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с PSoC, Π½ΠΎ Ρƒ мСня всё Π΅Ρ‰Ρ‘ Π½Π΅Ρ‚ достовСрной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Ρ… Π±ΠΈΡ‚Π°Ρ… Ρ„Π»Π΅ΡˆΠΊΠΈ. Π― Π±Ρ‹Π» ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΈΠ²Π»Ρ‘Π½ Ρ‚Π΅ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Cypress Π½Π΅ Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ дСвайса Π½ΠΈΠΊΠ°ΠΊΠΈΡ… срСдств для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π° Π»ΠΈ Π·Π°Ρ‰ΠΈΡ‚Π°. Π― углубился Π² Google, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ HSSP-ΠΊΠΎΠ΄, прСдоставлСнный Cypress’ом, Π±Ρ‹Π» ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½ ΡƒΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π”ΠΈΡ€ΠΊ выпустил свою ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. И Π²ΠΎΡ‚! Появился Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Π½ΠΎΠ²Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€:

[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A
[9F 20 7C] wrmem KEY2, 0x03
[9F A0 1C] wrmem 0xFD, 0x00 # нСизвСстныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
[9F E0 1C] wrmem 0xFF, 0x00 # Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[DE 02 1C] wrreg A (f0), 0x10   # Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ syscall !
[DF 00 1C] wrreg opc0 (f8), 0x00
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот Π²Π΅ΠΊΡ‚ΠΎΡ€ (см. read_security_data Π² psoc.py), ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всС Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ Π² SRAM Π² 0x80, Π³Π΄Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΡ‹ Π±Π»ΠΎΠΊ приходится ΠΏΠΎ Π΄Π²Π° Π±ΠΈΡ‚Π°.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΡƒΠ΄Ρ€ΡƒΡ‡Π°Π΅Ρ‚: всё Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Β«ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ внСшниС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ с Ρ„Π»Π΅ΡˆΠΊΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, Π½ΠΎ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΆΠ΅ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ROM-Π΄Π°ΠΌΠΏΠ΅Ρ€). А СдинствСнный способ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ – ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ вСсь Ρ‡ΠΈΠΏ. πŸ™

6. ΠŸΠ΅Ρ€Π²Π°Ρ (Π½Π΅ΡƒΠ΄Π°Π²ΡˆΠ°ΡΡΡ) Π°Ρ‚Π°ΠΊΠ°: ROMX

Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€ΡŽΠΊ: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠΊΠΎΠ΄Ρ‹, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ROMX, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСтся для чтСния Ρ„Π»Π΅Ρˆ-памяти? Π£ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠ΅ ΡˆΠ°Π½ΡΡ‹ Π½Π° успСх. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ функция ReadBlock, ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· SROM (которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ), провСряСт, вызываСтся Π»ΠΈ ΠΎΠ½Π° ΠΈΠ· ISSP. Однако ΠΎΠΏΠΊΠΎΠ΄ ROMX, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Π˜Ρ‚Π°ΠΊ, Π²ΠΎΡ‚ Python-ΠΊΠΎΠ΄ (послС добавлСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… классов Π² Π‘ΠΈΡˆΠ½Ρ‹ΠΉ Arduino-ΠΊΠΎΠ΄):

for i in range(0, 8192):
    write_reg(0xF0, i>>8)       # A = 0
    write_reg(0xF3, i&0xFF)     # X = 0
    exec_opcodes("x28x30x40")    # ROMX, HALT, NOP
    byte = read_reg(0xF0)       # ROMX reads ROM[A|X] into A
    print "%02x" % ord(byte[0]) # print ROM byte

К соТалСнию, этот ΠΊΠΎΠ΄ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. πŸ™ Π’Π΅Ρ€Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΌΡ‹ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ свои собствСнныС ΠΎΠΏΠΊΠΎΠ΄Ρ‹ (0x28 0x30 0x40)! НС Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСвайса являСтся элСмСнтом Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ чтСния. Π­Ρ‚ΠΎ большС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½Ρ‹ΠΉ Ρ‚Ρ€ΡŽΠΊ: ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ², ROM’овская шина пСрСнаправляСтся Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€.

7. Вторая Π°Ρ‚Π°ΠΊΠ°: трассировка с Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Ρ€ΡŽΠΊ с ROMX Π½Π΅ сработал, я стал ΠΎΠ±Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ этого Ρ‚Ρ€ΡŽΠΊΠ° – ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Β«Shedding too much Light on a Microcontroller’s Firmware ProtectionΒ».

7.1. РСализация

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° ISSP ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ для CHECKSUM-SETUP:

[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A
[9F 20 7C] wrmem KEY2, 0x03
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[9F 40 1C] wrmem BLOCKID, 0x00
[DE 00 FC] wrreg A (f0), 0x07
[DF 00 1C] wrreg opc0 (f8), 0x00
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Π—Π΄Π΅ΡΡŒ ΠΏΠΎ сути производится Π²Ρ‹Π·ΠΎΠ² SROM-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 0x07, ΠΊΠ°ΠΊ прСдставлСно Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (курсив ΠΌΠΎΠΉ):

Π­Ρ‚Π° функция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Она вычисляСт 16-Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму количСства Π±Π»ΠΎΠΊΠΎΠ², Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ – Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π»ΡΡˆ-Π±Π°Π½ΠΊΠ΅, отсчитывая с нуля. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ BLOCKID ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ количСства Π±Π»ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ расчётС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«1Β» Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°; Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Β«0Β» ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ вычислСна общая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма всСх 256 Π±Π»ΠΎΠΊΠΎΠ² Ρ„Π»Π΅Ρˆ-Π±Π°Π½ΠΊΠ°. 16-битовая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма возвращаСтся Ρ‡Π΅Ρ€Π΅Π· KEY1 ΠΈ KEY2. Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ KEY1 Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ младшиС 8 Π±ΠΈΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы, Π° Π² KEY2 – ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 8 Π±ΠΈΡ‚. Для дСвайсов с нСсколькими Ρ„Π»Π΅Ρˆ-Π±Π°Π½ΠΊΠ°ΠΌΠΈ, функция ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы вызываСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. НомСр Π±Π°Π½ΠΊΠ°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, задаётся рСгистром FLS_PR1 (ΠΏΡƒΡ‚Ρ‘ΠΌ установки Π² Π½Ρ‘ΠΌ Π±ΠΈΡ‚Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ†Π΅Π»Π΅Π²ΠΎΠΌΡƒ Ρ„Π»Π΅Ρˆ-Π±Π°Π½ΠΊΡƒ).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма: Π±Π°ΠΉΡ‚Ρ‹ просто ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ; Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΎΡ‰Ρ€Ρ‘Π½Π½Ρ‹Ρ… CRC-ΠΏΡ€ΠΈΡ‡ΡƒΠ΄. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, зная, Ρ‡Ρ‚ΠΎ Π² ядрС M8C Π½Π°Π±ΠΎΡ€ рСгистров ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅Π²Π΅Π»ΠΈΠΊ, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ вычислСнии ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ значСния Π±ΡƒΠ΄ΡƒΡ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Ρ… ΠΆΠ΅ самых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄ ΠΏΠΎΠΉΠ΄ΡƒΡ‚: KEY1 (0xF8) / KEY2 (0xF9).

Π˜Ρ‚Π°ΠΊ, Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ моя Π°Ρ‚Π°ΠΊΠ° выглядит Ρ‚Π°ΠΊ:

  1. БоСдиняСмся Ρ‡Π΅Ρ€Π΅Π· ISSP.
  2. ЗапускаСм вычислСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы, с использованиСм Π²Π΅ΠΊΡ‚ΠΎΡ€Π° CHECKSUM-SETUP.
  3. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ процСссор Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ врСмя T.
  4. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ RAM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму C.
  5. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ шаги 3 ΠΈ 4, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ увСличивая T.
  6. ВосстанавливаСм Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ„Π»Π΅ΡˆΠΊΠΈ, посрСдством вычитания ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы C ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ.

Однако Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π²Π΅ΠΊΡ‚ΠΎΡ€ Initialize-1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ послС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, пСрСзаписываСт KEY1 ΠΈ KEY2:

1100101000000000000000  # Магия, пСрСводящая PSoC Π² Ρ€Π΅ΠΆΠΈΠΌ программирования
nop
nop
nop
nop
nop
[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A # ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма пСрСзаписываСтся здСсь
[9F 20 7C] wrmem KEY2, 0x03 # и здСсь
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[DE 01 3C] wrreg A (f0), 0x09   # SROM-функция 9
[DF 00 1C] wrreg opc0 (f8), 0x00    # SSC
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π°Ρ‚ΠΈΡ€Π°Π΅Ρ‚ Π½Π°ΡˆΡƒ Π΄Ρ€Π°Π³ΠΎΡ†Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму, вызывая Calibrate1 (SROM-функция 9)… ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌ удастся, просто ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ² магичСскоС число (ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°), Π²ΠΎΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ программирования, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ SRAM? И Π΄Π°, это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚! Arduino-ΠΊΠΎΠ΄, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ эту Π°Ρ‚Π°ΠΊΡƒ, довольно прост:

case Cmnd_STK_START_CSUM:
    checksum_delay = ((uint32_t)getch())<<24;
    checksum_delay |= ((uint32_t)getch())<<16;
    checksum_delay |= ((uint32_t)getch())<<8;
    checksum_delay |= getch();
    if(checksum_delay > 10000) {
        ms_delay = checksum_delay/1000;
        checksum_delay = checksum_delay%1000;
    }
    else {
        ms_delay = 0;
    }
    send_checksum_v();
    if(checksum_delay)
        delayMicroseconds(checksum_delay);
    delay(ms_delay);
    start_pmode();

  1. Π‘Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ checkum_delay.
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ вычислСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы (send_checksum_v).
  3. ΠŸΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ; учитывая ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ:
    • я ΡƒΠ±ΠΈΠ» ΡƒΠΉΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΠ·Π½Π°Π», Ρ‡Ρ‚ΠΎ оказываСтся delayMicroseconds Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΌΠΈ 16383мкс;
    • ΠΈ Π·Π°Ρ‚Π΅ΠΌ снова ΡƒΠ±ΠΈΠ» ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ delayMicroseconds, Ссли Π΅ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ 0, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ!
  4. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ PSoC Π² Ρ€Π΅ΠΆΠΈΠΌ программирования (просто магичСскоС число отправляСм, Π±Π΅Π· ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²).

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Python:

for delay in range(0, 150000):  # Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π² микросСкундах
    for i in range(0, 10):      # количСство считывания для ΠΊΠ°ΠΆΠ΄ΠΎΠΉΠΈΠ· Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ
        try:
            reset_psoc(quiet=True)  # ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ Π²Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ программирования
            send_vectors()      # ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²
            ser.write("x85"+struct.pack(">I", delay)) # Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму + ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ послС Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
            res = ser.read(1)       # ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ arduino ACK
        except Exception as e:
            print e
            ser.close()
            os.system("timeout -s KILL 1s picocom -b 115200 /dev/ttyACM0 2>&1 > /dev/null")
            ser = serial.Serial('/dev/ttyACM0', 115200, timeout=0.5) # ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚
            continue
        print "%05d %02X %02X %02X" % (delay,      # ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ RAM-Π±Π°ΠΉΡ‚Ρ‹
                read_regb(0xf1),
                read_ramb(0xf8),
                read_ramb(0xf9))

Π’ Π΄Π²ΡƒΡ… словах, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄:

  1. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ PSoC (ΠΈ отправляСт Π΅ΠΌΡƒ магичСскоС число).
  2. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
  3. Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Arduino-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Cmnd_STK_START_CSUM (0x85), ΠΊΡƒΠ΄Π° Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° пСрСдаётся Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π² микросСкундах.
  4. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму (0xF8 ΠΈ 0xF9) ΠΈ Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ рСгистр 0xF1.

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ выполняСтся ΠΏΠΎ 10 Ρ€Π°Π· Π·Π° 1 микросСкунду. 0xF1 сюда Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±Ρ‹Π» СдинствСнным рСгистром, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСнялся ΠΏΡ€ΠΈ вычислСнии ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это какая-Ρ‚ΠΎ врСмСнная пСрСмСнная, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎ-логичСским устройством. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹ΠΉ Ρ…Π°ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ я ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽ Arduino, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ picocom, ΠΊΠΎΠ³Π΄Π° Arduino пСрСстаёт ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈΠΆΠΈΠ·Π½ΠΈ (понятия Π½Π΅ имСю, ΠΏΠΎΡ‡Π΅ΠΌΡƒ).

7.2. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Python-скрипта выглядит Ρ‚Π°ΠΊ (ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½ для удобочитаСмости):

DELAY F1 F8 F9  # F1 – Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹ΠΉ нСизвСстный рСгистр
                  # F8 младший Π±Π°ΠΉΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы
                  # F9 ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы

00000 03 E1 19
[...]
00016 F9 00 03
00016 F9 00 00
00016 F9 00 03
00016 F9 00 03
00016 F9 00 03
00016 F9 00 00  # ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма сбрасываСтся Π² 0
00017 FB 00 00
[...]
00023 F8 00 00
00024 80 80 00  # 1-ΠΉ Π±Π°ΠΉΡ‚: 0x0080-0x0000 = 0x80 
00024 80 80 00
00024 80 80 00
[...]
00057 CC E7 00   # 2-ΠΉ Π±Π°ΠΉΡ‚: 0xE7-0x80: 0x67
00057 CC E7 00
00057 01 17 01  # понятия Π½Π΅ имСю, Ρ‡Ρ‚ΠΎ здСсь происходит
00057 01 17 01
00057 01 17 01
00058 D0 17 01
00058 D0 17 01
00058 D0 17 01
00058 D0 17 01
00058 F8 E7 00  # Π‘Π½ΠΎΠ²Π° E7?
00058 D0 17 01
[...]
00059 E7 E7 00
00060 17 17 00  # Π₯ΠΌΠΌΠΌΠΌΠΌΠΌ
[...]
00062 00 17 00
00062 00 17 00
00063 01 17 01  # А, дошло! Π’ΠΎΡ‚ ΠΎΠ½ ΠΆΠ΅ пСрСнос Π² ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚
00063 01 17 01
[...]
00075 CC 17 01  # Π˜Ρ‚Π°ΠΊ, 0x117-0xE7: 0x30

ΠŸΡ€ΠΈ этом Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ фактичСской ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммой, Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ Π½Π΅ мСняСт считанноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° вычислСния (8192 Π±Π°ΠΉΡ‚Π°) Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 0,1478 сСкунд (с нСбольшими отклонСниями ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС), Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ соотвСтствуСт 18,04 мкс Π½Π° Π±Π°ΠΉΡ‚, – ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это врСмя для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ значСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы Π² подходящиС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Для ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² всё считываСтся довольно-Ρ‚Π°ΠΊΠΈ Π»Π΅Π³ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ выполнСния Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ всСгда практичСски одинаковая. Однако ΠΊΠΎΠ½Π΅Ρ† этого Π΄Π°ΠΌΠΏΠ° ΠΌΠ΅Π½Π΅Π΅ Ρ‚ΠΎΡ‡Π΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Β«Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ отклонСния ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ» ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ³ΠΎΠ½Π΅ – ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΈ становятся Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ:

134023 D0 02 DD
134023 CC D2 DC
134023 CC D2 DC
134023 CC D2 DC
134023 FB D2 DC
134023 3F D2 DC
134023 CC D2 DC
134024 02 02 DC
134024 CC D2 DC
134024 F9 02 DC
134024 03 02 DD
134024 21 02 DD
134024 02 D2 DC
134024 02 02 DC
134024 02 02 DC
134024 F8 D2 DC
134024 F8 D2 DC
134025 CC D2 DC
134025 EF D2 DC
134025 21 02 DD
134025 F8 D2 DC
134025 21 02 DD
134025 CC D2 DC
134025 04 D2 DC
134025 FB D2 DC
134025 CC D2 DC
134025 FB 02 DD
134026 03 02 DD
134026 21 02 DD

Π­Ρ‚ΠΎ 10 Π΄Π°ΠΌΠΏΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ микросСкундной Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. ΠžΠ±Ρ‰Π΅Π΅ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ для снятия Π΄Π°ΠΌΠΏΠ° всСх 8192 Π±Π°ΠΉΡ‚ Ρ„Π»Π΅ΡˆΠΊΠΈ, составляСт порядка 48 часов.

7.3. РСконструкция Ρ„Π»Π΅Ρˆ-Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ°

Π― ΠΏΠΎΠΊΠ° Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» написаниС ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ рСконструируСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„Π»Π΅ΡˆΠΊΠΈ, с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ всСх ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Однако Π½Π°Ρ‡Π°Π»ΠΎ этого ΠΊΠΎΠ΄Π° я ΡƒΠΆΠ΅ восстановил. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сдСлал это ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, я дизассСмблировал Π΅Π³ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ m8cdis:

0000: 80 67   jmp  0068h     ; Reset vector
[...]
0068: 71 10   or  F,010h
006a: 62 e3 87 mov  reg[VLT_CR],087h
006d: 70 ef   and  F,0efh
006f: 41 fe fb and  reg[CPU_SCR1],0fbh
0072: 50 80   mov  A,080h
0074: 4e    swap A,SP
0075: 55 fa 01 mov  [0fah],001h
0078: 4f    mov  X,SP
0079: 5b    mov  A,X
007a: 01 03   add  A,003h
007c: 53 f9   mov  [0f9h],A
007e: 55 f8 3a mov  [0f8h],03ah
0081: 50 06   mov  A,006h
0083: 00    ssc
[...]
0122: 18    pop  A
0123: 71 10   or  F,010h
0125: 43 e3 10 or  reg[VLT_CR],010h
0128: 70 00   and  F,000h ; Paging mode changed from 3 to 0
012a: ef 62   jacc 008dh
012c: e0 00   jacc 012dh
012e: 71 10   or  F,010h
0130: 62 e0 02 mov  reg[OSC_CR0],002h
0133: 70 ef   and  F,0efh
0135: 62 e2 00 mov  reg[INT_VC],000h
0138: 7c 19 30 lcall 1930h
013b: 8f ff   jmp  013bh
013d: 50 08   mov  A,008h
013f: 7f    ret

Выглядит Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡ€Π°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ!

7.4. Находим адрСс хранСния ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму Π² Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, – ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈ Π³Π΄Π΅ ΠΎΠ½Π° мСняСтся, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹:

  • Π²Π²ΠΎΠ΄ΠΈΠΌ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠΈΠ½ΠΊΠΎΠ΄;
  • измСнСняСм ΠΏΠΈΠ½ΠΊΠΎΠ΄.

Π’Π½Π°Ρ‡Π°Π»Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ адрСс хранСния, я снял Π΄Π°ΠΌΠΏ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы с шагом Π² 10 мс, послС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π—Π°Ρ‚Π΅ΠΌ я Π²Π²Ρ‘Π» Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠΈΠ½ΠΊΠΎΠ΄ ΠΈ сдСлал Ρ‚ΠΎ ΠΆΠ΅ самоС.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказался Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ приятным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π±Ρ‹Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ. Но Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма измСнилась Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 120000 мкс ΠΈ 140000 мкс Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. Но Β«ΠΏΠΈΠ½ΠΊΠΎΠ΄Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я Ρ‚Π°ΠΌ ΠΎΠ±Ρ€Π°Π½ΡƒΠΆΠΈΠ»ΠΈ, Π±Ρ‹Π» Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ – ΠΈΠ·-Π·Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ delayMicroseconds, которая Π΄Π΅Π»Π°Π΅Ρ‚ нСпонятныС Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΠ³Π΄Π° Π΅ΠΉ пСрСдаётся 0.

Π—Π°Ρ‚Π΅ΠΌ, ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ² ΠΏΠΎΡ‡Ρ‚ΠΈ 3 часа, я вспомнил, Ρ‡Ρ‚ΠΎ SROM’овский систСмный Π²Ρ‹Π·ΠΎΠ² CheckSum Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ количСство Π±Π»ΠΎΠΊΠΎΠ² для ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы! Π’.ΠΎ. ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±Π΅Π· Ρ‚Ρ€ΡƒΠ΄Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ адрСс хранСния ΠΏΠΈΠ½ΠΊΠΎΠ΄Π° ΠΈ счётчика Β«Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊΒ», – с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 64-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.

Мои ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³ΠΎΠ½Ρ‹ Π΄Π°Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСвСрсинг ΠΈ Π²Π·Π»ΠΎΠΌ ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ внСшнСго HDD-накопитСля Aigo. Π§Π°ΡΡ‚ΡŒ 2: Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ с Cypress PSoC

Π—Π°Ρ‚Π΅ΠΌ я помСнял ΠΏΠΈΠ½ΠΊΠΎΠ΄ с Β«123456Β» Π½Π° Β«1234567Β» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»:

РСвСрсинг ΠΈ Π²Π·Π»ΠΎΠΌ ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ внСшнСго HDD-накопитСля Aigo. Π§Π°ΡΡ‚ΡŒ 2: Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ с Cypress PSoC

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΈΠ½ΠΊΠΎΠ΄ ΠΈ счётчик Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ, ΠΏΠΎΡ…ΠΎΠΆΠ΅ хранятся Π² Π±Π»ΠΎΠΊΠ΅ β„–126.

7.5. Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ Π±Π»ΠΎΠΊΠ° β„–126

Π‘Π»ΠΎΠΊ β„–126 Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π³Π΄Π΅-Ρ‚ΠΎ Π² Ρ€Π°ΠΉΠΎΠ½Π΅ 125x64x18 = 144000мкс, ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° расчёта ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы, Π² ΠΌΠΎΡ‘ΠΌ ΠΏΠΎΠ»Π½ΠΎΠΌ Π΄Π°ΠΌΠΏΠ΅, ΠΈ ΠΎΠ½ выглядит Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡ€Π°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ. Π—Π°Ρ‚Π΅ΠΌ, послС Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ отсСивания многочислСнных Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… Π΄Π°ΠΌΠΏΠΎΠ² (ΠΈΠ·-Π·Π° накоплСния Β«Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ»), я Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ Π±Π°ΠΉΡ‚Ρ‹ (Π½Π° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ΅ 145527мкс):

РСвСрсинг ΠΈ Π²Π·Π»ΠΎΠΌ ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ внСшнСго HDD-накопитСля Aigo. Π§Π°ΡΡ‚ΡŒ 2: Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ с Cypress PSoC

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΈΠ½ΠΊΠΎΠ΄ хранится Π² Π½Π΅Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅! Π­Ρ‚ΠΈ значСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π΅ Π² ASCII-ΠΊΠΎΠ΄Π°Ρ… записаны, Π½ΠΎ ΠΊΠ°ΠΊ оказалось – ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ показания, снятыС с ёмкостной ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

НаконСц, я ΠΏΡ€ΠΎΠ²Ρ‘Π» Π΅Ρ‰Ρ‘ нСсколько тСстов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ, Π³Π΄Π΅ хранится счётчик Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ. Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

РСвСрсинг ΠΈ Π²Π·Π»ΠΎΠΌ ΡΠ°ΠΌΠΎΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ внСшнСго HDD-накопитСля Aigo. Π§Π°ΡΡ‚ΡŒ 2: Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ Π΄Π°ΠΌΠΏ с Cypress PSoC

0xFF – ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«15 ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊΒ», ΠΈ ΠΎΠ½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅.

7.6. ВосстановлСниС ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°

Π’ΠΎΡ‚ ΠΌΠΎΠΉ ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ собираСт вмСстС всё Π²Ρ‹ΡˆΠ΅ сказанноС:

def dump_pin():
  pin_map = {0x24: "0", 0x25: "1", 0x26: "2", 0x27:"3", 0x20: "4", 0x21: "5",
        0x22: "6", 0x23: "7", 0x2c: "8", 0x2d: "9"}
  last_csum = 0
  pin_bytes = []
  for delay in range(145495, 145719, 16):
    csum = csum_at(delay, 1)
    byte = (csum-last_csum)&0xFF
    print "%05d %04x (%04x) => %02x" % (delay, csum, last_csum, byte)
    pin_bytes.append(byte)
    last_csum = csum
  print "PIN: ",
  for i in range(0, len(pin_bytes)):
    if pin_bytes[i] in pin_map:
      print pin_map[pin_bytes[i]],
  print

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ выполнСния:

$ ./psoc.py 
syncing: KO OK
Resetting PSoC: KO Resetting PSoC: KO Resetting PSoC: OK
145495 53e2 (0000) => e2
145511 5407 (53e2) => 25
145527 542d (5407) => 26
145543 5454 (542d) => 27
145559 5474 (5454) => 20
145575 5495 (5474) => 21
145591 54b7 (5495) => 22
145607 54da (54b7) => 23
145623 5506 (54da) => 2c
145639 5506 (5506) => 00
145655 5533 (5506) => 2d
145671 554c (5533) => 19
145687 554e (554c) => 02
145703 554e (554e) => 00
PIN: 1 2 3 4 5 6 7 8 9

Π£Ρ€Π°! Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ значСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ½ΠΎΠΉ, скорСС всСго Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ PSoC – Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ пользовался я.

8. Π§Ρ‚ΠΎ дальшС?

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠ΄Π²Π΅Π΄Ρ‘ΠΌ ΠΈΡ‚ΠΎΠ³ΠΈ Π½Π° сторонС PSoC, Π² контСкстС нашСго накопитСля Aigo:

  • ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ SRAM, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½Π° Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π° ΠΎΡ‚ считывания;
  • ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ считывания, посрСдством Π°Ρ‚Π°ΠΊΠΈ «трассировка с Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉΒ», ΠΈ нСпосрСдствСнного считывания ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρƒ нашСй Π°Ρ‚Π°ΠΊΠΈ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ – ΠΈΠ·-Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с синхронизациСй. Π•Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ дСкодирования Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π°Ρ‚Π°ΠΊΠΈ «трассировка с Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉΒ»;
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ FPGA-ΠΏΡ€ΠΈΠΌΠΎΡ‡ΠΊΡƒ для создания Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ (ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ Arduino);
  • ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ Π°Ρ‚Π°ΠΊΡƒ: ввСсти Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠΈΠ½ΠΊΠΎΠ΄, ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈ с Π΄Π°ΠΌΠΏΠΈΡ‚ΡŒ RAM, надСясь Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΈΠ½ΠΊΠΎΠ΄ окаТСтся сохранённым Π² RAM, для сравнСния. Однако Π½Π° Arduino это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊ-Ρ‚ΠΎ просто, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сигнала Arduino составляСт 5 Π²ΠΎΠ»ΡŒΡ‚, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ исслСдуСмая Π½Π°ΠΌΠΈ ΠΏΠ»Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с сигналами Π² 3,3 Π²ΠΎΠ»ΡŒΡ‚.

Одна интСрСсная Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ – ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ напряТСния, для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ чтСния. Если Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ сработал, ΠΌΡ‹ Π±Ρ‹ смогли ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с Ρ„Π»Π΅ΡˆΠΊΠΈ, – вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы с Π½Π΅Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ SROM, вСроятно считываСт Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ посрСдством систСмного Π²Ρ‹Π·ΠΎΠ²Π° ReadBlock, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ описано Π² Π±Π»ΠΎΠ³Π΅ Дмитрия НСдоспасова – повторная рСализация Π°Ρ‚Π°ΠΊΠΈ ΠšΡ€ΠΈΡΠ° ГСрлински, анонсированной Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ Β«REcon Brussels 2017Β».

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° забавная Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ – ΡΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒ с микросхСмы корпус: для снятия Π΄Π°ΠΌΠΏΠ° SRAM, выявлСния Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ уязвимостСй.

9. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜Ρ‚Π°ΠΊ, Π·Π°Ρ‰ΠΈΡ‚Π° этого накопитСля оставляСт ΠΆΠ΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ для хранСния ΠΏΠΈΠ½ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ (Π½Π΅ Β«Π·Π°ΠΊΠ°Π»Ρ‘Π½Π½Ρ‹ΠΉΒ») микроконтроллСр… Плюс я Π΅Ρ‰Ρ‘ Π½Π΅ смотрСл (ΠΏΠΎΠΊΠ°), ΠΊΠ°ΠΊ Π½Π° этом дСвайсС Π΄Π΅Π»Π° обстоят с ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…!

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΎΠ²Π΅Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ для Aigo? ΠŸΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π² ΠΏΠ°Ρ€Ρƒ-Ρ‚Ρ€ΠΎΠΉΠΊΡƒ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… HDD-Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ΠΉ, я Π² 2015 Π³ΠΎΠ΄Ρƒ сдСлал ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π½Π° SyScan, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ рассмотрСл ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ бСзопасности Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… HDD-Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ΠΉ, ΠΈ Π΄Π°Π» Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π² Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ. πŸ™‚

На это исслСдованиС я ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» Π΄Π²Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ нСсколько Π²Π΅Ρ‡Π΅Ρ€ΠΎΠ². Π’ ΠΎΠ±Ρ‰Π΅ΠΉ слоТности порядка 40 часов. Бчитая с самого Π½Π°Ρ‡Π°Π»Π° (ΠΊΠΎΠ³Π΄Π° я вскрыл диск) ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° (Π΄Π°ΠΌΠΏ ΠΏΠΈΠ½ΠΊΠΎΠ΄Π°). Π’ эти ΠΆΠ΅ 40 часов Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» для написания этой ΡΡ‚Π°Ρ‚ΡŒΠΈ. ΠžΡ‡Π΅Π½ΡŒ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com