ዹ Aigo ራስን መመስጠር ውጫዊ HDD መቀልበስ እና መጥለፍ። ክፍል 2፡ ሳይፕሚስ ፒኀስኊሲ መጣል

ይህ ዚጜሁፉ ሁለተኛ እና ዚመጚሚሻ ክፍል ነው ዹውጭ ራስን ማመሳጠር ድራይቮቜ ስለጠለፋ። አንድ ዚሥራ ባልደሚባዬ በቅርቡ ፓትሪዮት (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. ማጠቃለያ

ዹ Aigo ራስን መመስጠር ውጫዊ HDD መቀልበስ እና መጥለፍ። ክፍል 2፡ ሳይፕሚስ ፒኀስኊሲ መጣል


4. ኚውስጣዊው ዹ PSoC ፍላሜ አንፃፊ ቆሻሻ መውሰድ እንጀምራለን

ስለዚህ ፣ ሁሉም ነገር ዚሚያመለክተው (በ [ዚመጀመሪያው ክፍል] () ውስጥ እንዳቋቋምነው ዹፒን ኮድ በ PSoC ብልጭታ ጥልቀት ውስጥ መቀመጡን ነው። ስለዚህ, እነዚህን ዚፍላሜ ጥልቀቶቜን ማንበብ አለብን. አስፈላጊ ሥራ ፊት;

  • ኚማይክሮ መቆጣጠሪያው ጋር "ግንኙነትን" ይቆጣጠሩ;
  • ይህ "ግንኙነት" ኹውጭ ኚማንበብ ዹተጠበቀ መሆኑን ለማሚጋገጥ መንገድ መፈለግ;
  • ጥበቃውን ለማለፍ መንገድ ይፈልጉ ።

ዚሚሰራ ዹፒን ኮድ መፈለግ ጠቃሚ ዚሚሆንባ቞ው ሁለት ቊታዎቜ አሉ።

  • ዚውስጥ ብልጭታ ማህደሹ ትውስታ;
  • SRAM፣ ፒን ኮድ በተጠቃሚው ኚገባው ፒን ​​ኮድ ጋር ለማነፃፀር ዚሚቀመጥበት።

ወደ ፊት ስመለኚት፣ አሁንም ዹ ISSP ፕሮቶኮሉን ሰነድ አልባ ቜሎታዎቜ ኚገለበጥኩ በኋላ ዚውስጣዊውን ዹPSoC ፍላሜ አንፃፊ - ዚደህንነት ስርዓቱን “ቀዝቃዛ ቡት መኚታተያ” በተባለ ዚሃርድዌር ጥቃት በመጠቀም መዝለል እንደቻልኩ አስተውያለሁ። ይህም ትክክለኛውን ፒን ኮድ በቀጥታ እንድጥል አስቜሎኛል።

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

ዚመጚሚሻ ፕሮግራም ኮድ:

5. ISSP ፕሮቶኮል

5.1. ISSP ምንድን ነው?

ኚማይክሮ መቆጣጠሪያ ጋር ያለው "ግንኙነት" ዚተለያዩ ነገሮቜን ሊያመለክት ይቜላል፡ ኹ"ሻጭ ወደ ሻጭ" ተኚታታይ ፕሮቶኮል በመጠቀም መስተጋብር (ለምሳሌ ICSP ለ Microchip's PIC)።

ሳይፕሚስ ለዚህ ዚራሱ ዹሆነ ዚባለቀትነት ፕሮቶኮል አለው፣ ISSP (in-system serial programming protocol) ተብሎ ዚሚጠራ ሲሆን እሱም በኹፊል በ ውስጥ ተገልጿል ቎ክኒካዊ ዝርዝር መግለጫ. ዚፈጠራ ባለቀትነት US7185162 እንዲሁም አንዳንድ መሚጃዎቜን ይሰጣል. እንዲሁም HSSP ዚሚባል ዹOpenSource አቻ አለ (ትንሜ ቆይተን እንጠቀማለን)። ISSP እንደሚኚተለው ይሰራል።

  • PSoC ዳግም አስነሳ;
  • ዚአስማት ቁጥሩን ወደ ዹዚህ PSoC ተኚታታይ ዳታ ፒን ማውጣት; ወደ ውጫዊ ዚፕሮግራም ሁነታ ለመግባት;
  • ትዕዛዞቜን ይላኩ ፣ እነሱም “vectors” ዚሚባሉ ሚዥም ቢት ሕብሚቁምፊዎቜ ና቞ው።

ዹISSP ሰነድ እነዚህን ቬክተሮቜ ዹሚገልፀው ለጥቂት እፍኝ ትዕዛዞቜ ብቻ ነው፡-

  • ማስጀመር-1
  • ማስጀመር-2
  • ማስጀመር-3 (3V እና 5V አማራጮቜ)
  • መታወቂያ-ማዋቀር
  • አንብብ-መታወቂያ-ቃል
  • አዘጋጅ-አግድ-ቁጥር፡ 10011111010dddddddd111፣ ዚት dddddddd=ማገድ #
  • በጅምላ መደምሰስ
  • ፕሮግራም-አግድ
  • አሚጋግጥ-ማዋቀር
  • አንብብ-ባይ቎፡ 10110aaaaaaZDDDDDDDDZ1፣ DDDDDDDD = ውሂብ ዚወጣበት፣ aaaaa = አድራሻ (6 ቢት)
  • WRITE-BYTE፡ 10010aaaaaaddddddd111፣ dddddddd = ውሂብ በገባበት፣ aaaaa = አድራሻ (6 ቢት)
  • አስተማማኝ
  • ቌክሰም-ማዋቀር
  • ንባብ-ቌክሰም፡ 10111111001ZDDDDDDDDZ110111111000ZDDDDDDDDZ1፣ ዚት DDDDDDDDDDDDDDDD = ውሂብ ዚወጣበት፡ ዚመሣሪያ ቌክሰም
  • አግድ አጥፋ

ለምሳሌ፣ ቬክተር ለ Initialize-2፡-

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

ሁሉም ቬክተሮቜ አንድ አይነት ርዝመት አላቾው: 22 ቢት. ዹHSSP ሰነድ በISSP ላይ አንዳንድ ተጚማሪ መሚጃዎቜ አሉት፡ "ዹISSP ቬክተር ዚመመሪያዎቜን ስብስብ ዹሚወክል ኚትንሜ ቅደም ተኹተል ዹዘለለ አይደለም።"

5.2. ቬክተሮቜን ማጥፋት

እዚህ ምን እዚተካሄደ እንዳለ እንወቅ። መጀመሪያ ላይ፣ እነዚሁ ቬክተሮቜ ዹM8C መመሪያዎቜ ጥሬ ስሪቶቜ ናቾው ብዬ አስቀ ነበር፣ ነገር ግን ይህን መላምት ካሚጋገጥኩ በኋላ፣ ዚኊፕሬሜኖቹ ኊፕኮድ እንደማይዛመድ ተሚዳሁ።

ኹዛ በላይ ያለውን ቬክተር ጎግል አድርጌ አገኘሁት ይህ ደራሲው ምንም እንኳን ወደ ዝርዝር ሁኔታ ባይገባም አንዳንድ ጠቃሚ ምክሮቜን ዚሰጠበት ጥናት፡ “እያንዳንዱ መመሪያ ዹሚጀምሹው ኚአራቱ ማኒሞኒኮቜ (ኹ RAM አንብብ፣ ወደ RAM ጻፍ፣ መመዝገቢያ አንብብ፣ መመዝገቢያ ጻፍ) ኹሚለው ጋር በሚዛመዱ ሶስት ቢትስ ነው። ኚዚያም 8 ዚአድራሻ ቢትስ፣ በመቀጠል 8 ዳታ ቢት (ማንበብ ወይም መጻፍ) እና በመጚሚሻም ሶስት ዚማቆሚያ ቢት አሉ።

ኹዛ ኚሱፐርቪዥን ROM (SROM) ክፍል አንዳንድ በጣም ጠቃሚ መሚጃዎቜን መሰብሰብ ቻልኩ። ዹቮክኒክ መመሪያ. SROM በPSoC ውስጥ ባለ ሃርድ ኮድ ዹተደሹገ ROM ሲሆን በተጠቃሚ ቊታ ላይ ለሚሰራ ዚፕሮግራም ኮድ ዚመገልገያ ተግባራትን (ኹ Syscall ጋር ተመሳሳይ በሆነ መልኩ) ያቀርባል፡

  • 00 ሰ: SWBoot ዳግም ማስጀመር
  • 01 ሰ: ReadBlock
  • 02 ሰ: ጻፍ ብሎክ
  • 03 ሰ፡ አግድ አጥፋ
  • 06 ሰዓት፡ ጠሹጮዛ አንብብ
  • 07 ሰ: CheckSum
  • 08 ሰ፡ ልኬት 0
  • 09 ሰ፡ ልኬት 1

ዚቬክተር ስሞቜን ኹSROM ተግባራት ጋር በማነፃፀር በዚህ ፕሮቶኮል ዚሚደገፉትን ዚተለያዩ ስራዎቜ ኹሚጠበቀው ዹSROM መለኪያዎቜ ጋር ማዛመድ እንቜላለን። ለዚህም ምስጋና ይግባውና ዚመጀመሪያዎቹን ሶስት ዹISSP ቬክተሮቜ መፍታት እንቜላለን፡-

  • 100 => "wrem"
  • 101 => "rdmem"
  • 110 => "ስህተት"
  • 111 => "ሕግ"

ነገር ግን፣ ስለ ቺፕ ሂደቶቜ ዹተሟላ ግንዛቀ ሊገኝ ዚሚቜለው ኹPSoC ጋር በቀጥታ በመገናኘት ብቻ ነው።

5.3. ኹPSoC ጋር ግንኙነት

Dirk Petrautsky አስቀድሞ አለው ጀምሮ ተላልፏል በአርዱዪኖ ላይ ዚሳይፕሚስ HSSP ኮድ፣ ኹቁልፍ ሰሌዳው ዹISSP አያያዥ ጋር ለመገናኘት Arduino Uno ተጠቀምኩ።

እባክዎን በጥና቎ ሂደት ዚዲርክን ኮድ በጥቂቱ ቀይሬያለሁ። ማሻሻያዬን በ GitHub ላይ ማግኘት ትቜላለህ፡- እዚህ እና ተዛማጅ ዹፓይዘን ስክሪፕት ኚአርዱዪኖ ጋር ለመግባባት፣ በእኔ ማኚማቻ ውስጥ ሳይፕሚስ_psoc_tools.

ስለዚህ፣ አርዱዪኖን በመጠቀም፣ መጀመሪያ ዚተጠቀምኩት “ኩፊሮላዊ” ቬክተሮቜን ለ “ግንኙነት” ብቻ ነው። ዹVERIFY ትዕዛዙን ተጠቅሜ ውስጣዊውን ROM ለማንበብ ሞኚርኩ. እንደተጠበቀው, ይህን ማድሚግ አልቻልኩም. ምናልባት በፍላሜ አንፃፊው ውስጥ ዚንባብ መኚላኚያ ቢት ስለሚነቃቁ ሊሆን ይቜላል።

ኚዚያም ጥቂት ዚራሎን ቀላል ቬክተሮቜ ለመጻፍ እና ለማንበብ ማህደሹ ትውስታ / መመዝገቢያዎቜን ፈጠርኩ. እባክዎን ፍላሜ አንፃፊው ዹተጠበቀ ቢሆንም ሙሉውን SROM ማንበብ እንደምንቜል አስተውል!

5.4. በቺፕ ላይ ያሉ መዝገቊቜን መለዚት

"ዚተበታተኑ" ቬክተሮቜን ኚተመለኚትኩ በኋላ መሳሪያው ጥበቃውን በማለፍ በቀጥታ ዹሚፈጾሙ ዹM0C ኊፕኮዶቜን ለመለዚት ሰነድ አልባ መዝገቊቜን (8xF0-8xFA) እንደሚጠቀም ተሚድቻለሁ። ይህ እንደ “ADD”፣ “MOV A፣ X”፣ “PUSH” ወይም “JMP” ያሉ ዚተለያዩ ኊፕኮዶቜን እንዳሄድ አስቜሎኛል። ለእነሱ ምስጋና ይግባው (በመዝገቊቜ ላይ ዚሚያስኚትሉትን ዚጎንዮሜ ጉዳቶቜ በመመልኚት) ኚሰነድ አልባ መዝገቊቜ ውስጥ ዚትኞቹ መደበኛ ምዝገባዎቜ (ኀ ፣ ኀክስ ፣ SP እና ፒሲ) እንደሆኑ ለማወቅ ቜያለሁ።

በውጀቱም፣ በ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 ጋር መገናኘት እቜላለሁ ፣ ግን አሁንም ስለ ፍላሜ አንፃፊው ዚደህንነት ቢት አስተማማኝ መሹጃ ዚለኝም። ሳይፕሚስ ለመሣሪያው ተጠቃሚ ምንም አይነት መኚላኚያ አለመኖሩን ለማሚጋገጥ ባለመቻሉ በጣም አስገርሞኛል። Dirk ማሻሻያውን ኹለቀቀ በኋላ በሳይፕሚስ ዹቀሹበው HSSP ኮድ እንደተሻሻለ ለመሚዳት ጎግልን በጥልቀት ቆፍሬያለሁ። እናም! ይህ አዲስ ቬክተር ታይቷል፡-

[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

ይህንን ቬክተር በመጠቀም (ንባብ_ደህንነት_ዳታ በpsoc.py ይመልኚቱ) ሁሉንም ዚደህንነት ቢት በSRAM 0x80 ላይ እናገኛለን፣በተኚለኚለ ብሎክ ሁለት ቢት ሲኖር።

ውጀቱ ተስፋ አስቆራጭ ነው: ሁሉም ነገር በ "ውጫዊ ንባብ እና መጻፍ አሰናክል" ሁነታ ውስጥ ዹተጠበቀ ነው. ስለዚህ, ኚፍላሜ አንፃፊ ምንም ነገር ማንበብ አለመቻል ብቻ ሳይሆን ምንም ነገር መጻፍ አንቜልም (ለምሳሌ, እዚያ ዹ ROM dumper ለመጫን). እና መኚላኚያውን ለማሰናኹል ብ቞ኛው መንገድ ሙሉውን ቺፕ ሙሉ በሙሉ ማጥፋት ነው. 🙁

6. መጀመሪያ (ያልተሳካ) ጥቃት: ROMX

ሆኖም፣ ዹሚኹተለውን ብልሃት መሞኹር እንቜላለን፡ ዹዘፈቀደ ኊፕኮዶቜን ዚማስፈፀም አቅም ስላለን ፍላሜ ማህደሹ ትውስታን ለማንበብ ዚሚያገለግል ROMX ለምን አንሰራም? ይህ አካሄድ ጥሩ ዚስኬት እድል አለው። ምክንያቱም ኹSROM ዹተገኘ መሹጃን ዚሚያነብ ዹReadBlock ተግባር (በቬክተሮቜ ጥቅም ላይ ዹሚውለው) ኹISSP መጥራቱን ያሚጋግጣል። ነገር ግን፣ ዹ ROMX ኊፕኮድ በአስተሳሰብ ሁኔታ እንደዚህ አይነት ቌክ ላይኖሹው ይቜላል። ስለዚህ ዹፓይዘን ኮድ ይኾውና (ጥቂት አጋዥ ክፍሎቜን ወደ 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 ብልሃት ስላልሰራ ፣ ስለ ሌላ ዹዚህ ብልሃት ልዩነት ማሰብ ጀመርኩ - በህትመቱ ውስጥ ተገልጿል "በማይክሮ መቆጣጠሪያ ፈርምዌር ጥበቃ ላይ በጣም ብዙ ብርሃን ማፍሰስ".

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 quirks. በተጚማሪም ፣ M8C ኮር በጣም ትንሜ ዚመመዝገቢያ ስብስብ እንዳለው በማወቅ ፣ ቌኩን ሲያሰሉ መካኚለኛ ዋጋዎቜ በተመሳሳይ ተለዋዋጮቜ ይመዘገባሉ ፣ በመጚሚሻም ወደ ውጀቱ ይሄዳሉ-KEY1 (0xF8) / KEY2 ( 0xF9)

ስለዚህ በንድፈ ሀሳብ ዚእኔ ጥቃት ይህን ይመስላል።

  1. በISSP በኩል እንገናኛለን።
  2. ዚቌክ ስሌቱን በ CHECKSUM-SETUP ቬክተር በመጠቀም እንጀምራለን.
  3. ፕሮሰሰሩን ኹተወሰነ ጊዜ በኋላ እንደገና እናስነሳዋለን።
  4. ዹአሁኑን ቌክሰም ሲ ለማግኘት ራም እናነባለን።
  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. ለተወሰነ ጊዜ ይጠብቁ; ዚሚኚተሉትን ጉዳቶቜ ግምት ውስጥ በማስገባት:
    • ዹሚሆነውን እስካውቅ ድሚስ ብዙ ጊዜ አጠፋሁ ዚማይክሮ ሰኚንድ መዘግዚት ኹ 16383 ÎŒs ያልበለጠ መዘግዚቶቜ ብቻ በትክክል ይሰራል;
    • እና ዘግይቶ ማይክሮ ሰኚንድ፣ 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 እዚህ ተካቷል ምክንያቱም ቌክ ሲሰላ ዹተለወጠው ብ቞ኛው መዝገብ ነው። ምናልባት በአሪቲሜቲክ አመክንዮ ክፍል ጥቅም ላይ ዹሚውል ጊዜያዊ ተለዋዋጭ ዓይነት ሊሆን ይቜላል። አርዱዪኖ ዚህይወት ምልክቶቜን ማሳዚቱን ሲያቆም ፒኮኮምን ተጠቅሜ አርዱኢኖን እንደገና ለማስጀመር ዚምጠቀምበትን አስቀያሚ ጠለፋ አስተውል (ለምን እንደሆነ አይታወቅም)።

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

ይህ በተባለው ጊዜ፣ ቜግር አለብን፡ ዚምንሠራው በትክክለኛ ቌክተም ስለሆነ፣ null byte ዹተነበበውን ዋጋ አይለውጠውም። ነገር ግን አጠቃላይ ዚሒሳብ አሠራሩ (8192 ባይት) 0,1478 ሰኚንድ ዹሚፈጅ በመሆኑ (በእያንዳንዱ ጊዜ በትንሜ ልዩነቶቜ) ዹሚፈጀው በአንድ ባይት በግምት 18,04 ÎŒs ነው፣ በዚህ ጊዜ ዚቌክሰም ዋጋን በተገቢው ጊዜ ማሚጋገጥ እንቜላለን። ለመጀመሪያዎቹ ሩጫዎቜ ፣ ዚሂሳብ አሠራሩ ዚሚቆይበት ጊዜ ሁል ጊዜ ተመሳሳይ ስለሆነ ሁሉም ነገር በቀላሉ ይነበባል። ነገር ግን፣ በእያንዳንዱ ሩጫ ላይ ያሉት “ጥቃቅን ዹጊዜ ልዩነቶቜ” ተደምሹው ጉልህ ስለሚሆኑ ዹዚህ መጣያ መጚሚሻ ትክክል አይደለም።

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 ÎŒs እና 140000 µs መዘግዚት መካኚል በሆነ ቊታ መቀዚሩን ለማወቅ ቜያለሁ። ነገር ግን እዚያ ያሳዚሁት "ፒንኮድ" ሙሉ በሙሉ ትክክል አይደለም - በመዘግዚቱ ዚማይክሮ ሰኚንድ አሰራር ምክንያት 0 ሲተላለፍ እንግዳ ነገሮቜን ያደርጋል።

ኚዚያም ወደ 3 ሰአታት ያህል ካሳለፍኩ በኋላ፣ ዹSROM ሲስተም ጥሪ CheckSum ለቌክሱም ዚብሎኮቜ ብዛት ዚሚገልጜ ክርክር እንደ ግብአት መቀበሉን አስታውሳለሁ! ያ። እስኚ 64-ባይት ብሎክ ባለው ትክክለኛነት ዹፒን ኮድ ማኚማቻ አድራሻን እና "ዚተሳሳቱ ሙኚራዎቜ" ቆጣሪን በቀላሉ መተርጎም እንቜላለን።

ዚእኔ ዚመጀመሪያ ሩጫዎቜ ዹሚኹተለውን ውጀት አስገኝተዋል፡-

ዹ Aigo ራስን መመስጠር ውጫዊ HDD መቀልበስ እና መጥለፍ። ክፍል 2፡ ሳይፕሚስ ፒኀስኊሲ መጣል

ኚዚያ ፒን ኮዱን ኹ"123456" ወደ "1234567" ቀይሬ አገኘሁት፡-

ዹ Aigo ራስን መመስጠር ውጫዊ HDD መቀልበስ እና መጥለፍ። ክፍል 2፡ ሳይፕሚስ ፒኀስኊሲ መጣል

ስለዚህ ፒን ኮድ እና ዚተሳሳቱ ሙኚራዎቜ ቆጣሪ በብሎክ ቁጥር 126 ውስጥ ዚተኚማቹ ይመስላሉ።

7.5. ቁጥር 126 ዚቆሻሻ መጣያ መውሰድ

አግድ #126 በ125x64x18 = 144000ÎŒs አካባቢ መቀመጥ ያለበት ኚቌክሰም ስሌት መጀመሪያ ጀምሮ ሙሉ ቆሻሻዬ ውስጥ ነው እና በጣም አሳማኝ ይመስላል። ኚዚያም፣ ብዙ ልክ ያልሆኑ ዚቆሻሻ መጣያ ቊታዎቜን በእጅ ካጣራሁ በኋላ (በ“ጥቃቅን ዹጊዜ ልዩነት” ክምቜት ምክንያት) እነዚህን ባይት አገኘሁ (በ145527 ÎŒs መዘግዚት)።

ዹ Aigo ራስን መመስጠር ውጫዊ HDD መቀልበስ እና መጥለፍ። ክፍል 2፡ ሳይፕሚስ ፒኀስኊሲ መጣል

ዹፒን ኮድ ባልተመሰጠሚ መልኩ መቀመጡ በጣም ግልፅ ነው! እነዚህ እሎቶቜ, በእርግጥ, በ ASCII ኮዶቜ ውስጥ አልተጻፉም, ነገር ግን እንደ ተለወጠ, ኹ capacitive ዹቁልፍ ሰሌዳ ዚተወሰዱትን ንባቊቜ ያንፀባርቃሉ.

በመጚሚሻ፣ ዚመጥፎ ሙኚራ ቆጣሪው ዚት እንደተቀመጠ ለማወቅ አንዳንድ ተጚማሪ ሙኚራዎቜን ሞኚርኩ። ውጀቱ እነሆ፡-

ዹ Aigo ራስን መመስጠር ውጫዊ HDD መቀልበስ እና መጥለፍ። ክፍል 2፡ ሳይፕሚስ ፒኀስኊሲ መጣል

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 መግብርን ይጠቀሙ (ወይም አርዱዪኖ ሃርድዌር ቆጣሪዎቜን ይጠቀሙ)።
  • ሌላ ጥቃት ይሞክሩ፡ ሆን ተብሎ ዚተሳሳተ ፒን ኮድ አስገባ፣ ዳግም አስነሳ እና RAM ጣል፣ ለማነፃፀር ትክክለኛው ፒን ኮድ በ RAM ውስጥ እንደሚቀመጥ ተስፋ በማድሚግ። ነገር ግን፣ ዚአርዱዪኖ ሲግናል ደሹጃ 5 ቮልት ስለሆነ በአርዱዪኖ ላይ ይህን ማድሚግ ቀላል አይደለም፣ ዹምንመሹምሹው ቊርድ ግን በ3,3 ቮልት ሲግናሎቜ ይሰራል።

ሊሞኹር ዚሚቜል አንድ አስደሳቜ ነገር ዚንባብ ጥበቃን ለማለፍ በቮል቎ጅ ደሹጃ መጫወት ነው. ይህ አካሄድ ውጀታማ ኚሆነ፣ ኚፍላሜ አንፃፊው ላይ ፍጹም ትክክለኛ መሹጃ ማግኘት እንቜል ነበር - ትክክለኛ ያልሆነ ዹጊዜ መዘግዚት ያለው ቌክ በማንበብ ኚመታመን።

SROM ምናልባት በReadBlock ስርዓት ጥሪ በኩል ዚጥበቃ ቢትስን ስለሚያነብ፣ እኛ እንደዚያው ማድሚግ እንቜላለን ተገል describedል በዲሚትሪ ኔዶስፓሶቭ ብሎግ ላይ - በኮንፈሚንሱ ላይ ዹተገለጾው ዚክሪስ ጌርሊንስኪ ጥቃት እንደገና መተግበር "REcon ብራሰልስ 2017".

ሊደሹግ ዚሚቜል ሌላ አስደሳቜ ነገር ጉዳዩን ኚቺፑ ላይ ማስወጣት ነው: SRAM ን ለመውሰድ, ሰነድ ዹሌላቾውን ዚስርዓት ጥሪዎቜ እና ድክመቶቜን መለዚት.

9. ማጠቃለያ

ስለዚህ ዹዚህ አንፃፊ ጥበቃ ብዙ ዹሚፈለገውን ይተዋል ፣ ምክንያቱም ፒን ኮድን ለማኚማ቞ት መደበኛ ("ጠንካራ" ያልሆነ) ማይክሮ መቆጣጠሪያ ይጠቀማል ... በተጚማሪም ፣ ነገሮቜ ኹመሹጃ ጋር እንዎት እንደሚሄዱ (እስካሁን) አላዹሁም (እስካሁን) በዚህ መሳሪያ ላይ ምስጠራ!

ለ Aigo ምን ሊመክሩት ይቜላሉ? ሁለት ዚተመሰጠሩ ዚኀቜዲዲ ድራይቭ ሞዎሎቜን ኚመሚመርኩ በኋላ በ2015 ሠራሁ አቀራሚብ በ SyScan ላይ, እሱ ዚበርካታ ውጫዊ HDD ድራይቮቜ ዚደህንነት ቜግሮቜን መርምሯል, እና በእነሱ ውስጥ ምን ሊሻሻል እንደሚቜል ምክሮቜን ሰጥቷል. 🙂

ሁለት ቅዳሜና እሁዶቜን እና ብዙ ምሜቶቜን አሳልፌያለሁ ይህንን ጥናት። በአጠቃላይ ወደ 40 ሰአታት. ኚመጀመሪያው (ዲስክን ስኚፍት) እስኚ መጚሚሻው (ዹፒን ኮድ መጣል) መቁጠር. ያው 40 ሰአታት ይህን ጜሁፍ በመጻፍ ያሳለፍኩትን ጊዜ ይጚምራል። በጣም አስደሳቜ ጉዞ ነበር።

ምንጭ: hab.com

አስተያዚት ያክሉ