ืื™ืŸ ื“ื™ ืคื•ืกืกื˜ืขืคึผืก ืคื•ืŸ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท: ื•ื•ื™ ืึท ืคึผืœืง ืื™ื– ื’ืขื•ื•ืขืŸ ื›ืึทืงื˜ ื‘ื™ื™ ื“ื™ positive ื›ืึทืง ื˜ืขื’ 9

ืื™ืŸ ื“ื™ ืคื•ืกืกื˜ืขืคึผืก ืคื•ืŸ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท: ื•ื•ื™ ืึท ืคึผืœืง ืื™ื– ื’ืขื•ื•ืขืŸ ื›ืึทืงื˜ ื‘ื™ื™ ื“ื™ positive ื›ืึทืง ื˜ืขื’ 9

ืื™ืŸ ื“ื™ ืœืขืฆื˜ืข ืคื“ื™ื™ึทืก 9 ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื”ืืœื˜ืŸ ืึท ืคืึทืจืžืขืกื˜ ืฆื• ื›ืึทืง ืึท ื’ืึทื– ืคึผืึทืžืคึผื™ื ื’ ืคืึทื‘ืจื™ืง - ืคืึทืจืžืขืกื˜ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท. ืขืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ื“ืจื™ื™ ืกื˜ืึทื ื“ื– ืื•ื™ืฃ ื“ืขื ืคึผืœืึทืฅ ืžื™ื˜ ืคืึทืจืฉื™ื“ืขื ืข ื–ื™ื›ืขืจื”ื™ื™ื˜ ืคึผืึทืจืึทืžืขื˜ืขืจืก (ืงื™ื™ืŸ ืกืขืงื•ืจื™ื˜ื™, ื ื™ื“ืขืจื™ืง ื–ื™ื›ืขืจื”ื™ื™ื˜, ื”ื•ื™ืš ื–ื™ื›ืขืจื”ื™ื™ื˜), ืขืžื™ืึทืœื™ื™ื˜ื™ื ื’ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื™ื ื“ืึทืกื˜ืจื™ืึทืœ ืคึผืจืึธืฆืขืก: ืœื•ืคื˜ ืื•ื ื˜ืขืจ ื“ืจื•ืง ืื™ื– ืคึผืึทืžืคึผื˜ ืื™ืŸ ืึท ื‘ืึทืœืึธืŸ (ืื•ืŸ ื“ืขืžืึธืœื˜ ื‘ืืคืจื™ื™ื˜).

ื˜ืจืึธืฅ ื“ื™ ืคืึทืจืฉื™ื“ืขื ืข ื–ื™ื›ืขืจืงื™ื™ึทื˜ ืคึผืึทืจืึทืžืขื˜ืขืจืก, ื“ื™ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ื–ืึทืฅ ืคื•ืŸ ื“ื™ ืกื˜ืึทื ื“ื– ืื™ื– ื’ืขื•ื•ืขืŸ ื“ื™ ื–ืขืœื‘ืข: Siemens Simatic PLC S7-300 ืกืขืจื™ืข; ื ื•ื™ื˜ืคืึทืœ ื“ืขืคืœืึทืฆื™ืข ืงื ืขืคึผืœ ืื•ืŸ ื“ืจื•ืง ืžืขืกื˜ืŸ ืžื™ื˜ืœ (ืคืืจื‘ื•ื ื“ืŸ ืฆื• ืคึผืœืง ื“ื™ื’ื™ื˜ืึทืœ ื™ื ืคึผื•ืฅ (ื“ื™)); ื•ื•ืึทืœื•ื•ื– ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืคึฟืึทืจ ื™ื ืคืœืึทืฆื™ืข ืื•ืŸ ื“ืขืคืœืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืœื•ืคื˜ (ืคืืจื‘ื•ื ื“ืŸ ืฆื• ื“ื™ ื“ื™ื’ื™ื˜ืึทืœ ืึทื•ื˜ืคึผื•ืฅ ืคื•ืŸ ื“ื™ ืคึผืœืง (DO)) - ื–ืขืŸ ื“ื™ ืคื™ื’ื•ืจ ืื•ื ื˜ืŸ.

ืื™ืŸ ื“ื™ ืคื•ืกืกื˜ืขืคึผืก ืคื•ืŸ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท: ื•ื•ื™ ืึท ืคึผืœืง ืื™ื– ื’ืขื•ื•ืขืŸ ื›ืึทืงื˜ ื‘ื™ื™ ื“ื™ positive ื›ืึทืง ื˜ืขื’ 9

ื“ื™ ืคึผืœืง, ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ ื“ืจื•ืง ืจื™ื“ื™ื ื’ื– ืื•ืŸ ืื™ืŸ ืœื•ื™ื˜ ืžื™ื˜ ื–ื™ื™ึทืŸ ืคึผืจืึธื’ืจืึทื, ื’ืขืžืื›ื˜ ืึท ื‘ืึทืฉืœื•ืก ืฆื• ื“ืขืคืœื™ื™ื˜ ืึธื“ืขืจ ื™ื ืคืœื™ื™ื˜ ื“ื™ ืคึผื™ืœืงืข (ื’ืขืขืคึฟื ื˜ ืื•ืŸ ืคึฟืึทืจืžืึทื›ื˜ ื“ื™ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ื•ื•ืึทืœื•ื•ื–). ืึธื‘ืขืจ, ืึทืœืข ืกื˜ืึทื ื“ื– ื”ืึธื‘ืŸ ืึท ืžืึทื ื•ืึทืœ ืงืึธื ื˜ืจืึธืœ ืžืึธื“ืข, ื•ื•ืึธืก ื’ืขืžืื›ื˜ ืขืก ืžืขื’ืœืขืš ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ื•ื•ืึทืœื•ื•ื– ืฉื˜ืึทื˜ ืึธืŸ ืงื™ื™ืŸ ืจื™ืกื˜ืจื™ืงืฉืึทื ื–.

ื“ื™ ืกื˜ืึทื ื“ื– ื”ืึธื‘ืŸ ื“ื™ืคืขืจื“ ืื™ืŸ ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ื’ืขื‘ืŸ ื“ืขื ืžืึธื“ืข: ืื™ืŸ ื“ื™ ืึทื ืคึผืจืึทื˜ืขืงื˜ื™ื“ ืฉื˜ื™ื™ืŸ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื™ื–ื™ืึทืกื˜ ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื•ืŸ ืื™ืŸ ื“ื™ ื”ื•ื™ืš ืกืขืงื•ืจื™ื˜ื™ ืฉื˜ื™ื™ืŸ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืฉื•ื•ืขืจ.

ืคื™ื ืฃ ืคื•ืŸ ื“ื™ ื–ืขืงืก ืคึผืจืึธื‘ืœืขืžืก ื–ืขื ืขืŸ ืกืึทืœื•ื•ื“ ืื™ืŸ ืฆื•ื•ื™ื™ ื˜ืขื’; ื“ืขืจ ืขืจืฉื˜ืขืจ ืึธืจื˜ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ืขืจื ื“ 233 ืคื•ื ืงื˜ืŸ (ืขืจ ืคืืจื‘ืจืื›ื˜ ืึท ื•ื•ืึธืš ืคึผืจื™ืคึผืขืจื™ื ื’ ืคึฟืึทืจ ื“ื™ ืคืึทืจืžืขืกื˜). ื“ืจื™ื™ ื•ื•ื™ื ืขืจื–: ืื™ืš ืฉื˜ืขืœืŸ - ืึท1ืขืงืกืึทื ื“ื™, ื•ื• - ืจื•ื‘ื™ืงืึธื™ื“, ื•ื•ื• - ื–ืข.

ืึธื‘ืขืจ, ื‘ืขืฉืึทืก PHDays, ืงื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ ืื™ื– ื’ืขื•ื•ืขืŸ ื‘ื™ื›ื•ืœืช ืฆื• ื‘ืึทืงื•ืžืขืŸ ืึทืœืข ื“ืจื™ื™ ืกื˜ืึทื ื“ื–, ืึทื–ื•ื™ ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืžืึทื›ืŸ ืึทืŸ ืึธื ืœื™ื™ืŸ ืคืึทืจืžืขืกื˜ ืื•ืŸ ืืจื•ื™ืก ื“ื™ ืžืขืจืกื˜ ืฉื•ื•ืขืจ ืึทืจื‘ืขื˜ ืื™ืŸ ืคืจื™ ื™ื•ื ื™. ืคึผืึทืจื˜ื™ืกื™ืคึผืึทื ืฅ ื”ืึธื‘ืŸ ืฆื• ืคืึทืจืขื ื“ื™ืงืŸ ื“ื™ ืึทืจื‘ืขื˜ ืื™ืŸ ืึท ื—ื•ื“ืฉ, ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ืคืึธืŸ, ืื•ืŸ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืœื™ื™ื–ื•ื ื’ ืื™ืŸ ื“ืขื˜ืึทืœ ืื•ืŸ ืื™ืŸ ืึท ื˜ืฉื™ืงืึทื•ื•ืข ื•ื•ืขื’.

ื•ื ื˜ืขืจ ื“ืขืจ ื“ื•ืจื›ืฉื ื™ื˜ ืžื™ืจ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืึทืŸ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ื“ืขืจ ื‘ืขืกื˜ืขืจ ืœื™ื™ื–ื•ื ื’ ืฆื• ื“ืขืจ ืึทืจื‘ืขื˜ ืคื•ืŸ ื“ื™ ื’ืขืฉื™ืงื˜ ืื™ื‘ืขืจ ื“ื™ ื—ื•ื“ืฉ, ืขืก ืื™ื– ื’ืขืคื•ื ืขืŸ ื“ื•ืจืš ืึทืœืขืงืกื™ื™ ืงืึธื•ื•ืจื™ื–ืฉื ื™ืš (a1exdandy) ืคื•ืŸ ื“ื™ ื“ื™ื’ื™ื˜ืึทืœ ืกืขืงื•ืจื™ื˜ื™ ืคื™ืจืžืข, ื•ื•ืึธืก ื”ืึธื˜ ื’ืขื ื•ืžืขืŸ XNUMX ืึธืจื˜ ืื™ืŸ ื“ื™ ืคืึทืจืžืขืกื˜ ื‘ืขืฉืึทืก ื“ื™ PHDays. ื•ื ื˜ืขืจ ืžื™ืจ ืคืึธืจืฉื˜ืขืœืŸ ื–ื™ื™ึทืŸ ื˜ืขืงืกื˜ ืžื™ื˜ ืื•ื ื“ื–ืขืจ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ.

ืขืจืฉื˜ ืึทื ืึทืœื™ืกื™ืก

ืึทื–ื•ื™, ื“ื™ ืึทืจื‘ืขื˜ ืงืึทื ื˜ื™ื™ื ื“ ืึทืŸ ืึทืจืงื™ื™ื•ื• ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ื˜ืขืงืขืก:

  • block_upload_traffic.pcapng
  • DB100.bin
  • ื”ื™ื ืฅ.ื˜ืงืกื˜

ื“ื™ ื”ื™ื ื˜ืก.ื˜ืงืกื˜ ื˜ืขืงืข ื›ึผื•ืœืœ ื“ื™ ื ื™ื™ื˜ื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ื”ื™ื ืฅ ืฆื• ืกืึธืœื•ื•ืข ื“ื™ ืึทืจื‘ืขื˜. ื“ืึธ ื–ืขื ืขืŸ ื–ื™ื™ึทืŸ ืื™ื ื”ืึทืœื˜:

  1. ืคึผืขื˜ืจืึธื•ื•ื™ื˜ืฉ ื”ืึธื˜ ืžื™ืจ ื ืขื›ื˜ืŸ ื’ืขื–ืึธื’ื˜ ืึทื– ืื™ืจ ืงืขื ืขืŸ ืœืึธื“ืŸ ื‘ืœืึทืงืก ืคื•ืŸ PlcSim ืื™ืŸ ืกื˜ืขืคึผ 7.
  2. ื“ื™ Siemens Simatic S7-300 ืกืขืจื™ืข PLC ืื™ื– ื’ืขื ื™ืฆื˜ ืื™ืŸ ื“ืขื ืฉื˜ื™ื™ืŸ.
  3. PlcSim ืื™ื– ืึท PLC ืขืžื•ืœืึทื˜ืึธืจ ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืœื•ื™ืคืŸ ืื•ืŸ ื“ื™ื‘ืึทื’ ืžื’ื™ืœื” ืคึฟืึทืจ Siemens S7 PLCs.

ื“ื™ DB100.bin ื˜ืขืงืข ืื™ื– ืฆื• ืึทื ื˜ื”ืึทืœื˜ืŸ ื“ื™ DB100 PLC ื“ืึทื˜ืŸ ื‘ืœืึธืง: 00000000: 0100 0102 6e02 0401 0206 0100 0101 0102 ....n......... 00000010: 1002 0501 0202 2002 0501 . ..... ......... 0206: 0100 0102 00000020 0102 7702 0401 0206 0100ืึท0103 ..ื•ื•............ 0102: 0 02 00000030 0501 0202 1602 ................... 0501: 0206 0100 0104 0102 00000040 7502 0401ืึท0206 0100 ื•............. 0105 0102............0. 02: 0501 00000050 0202 1602 0501 0206 0100 0106 0102 3402 4 00000060 0401 0206 ......... & ......... & ......... & ......... & ......... & ....... & ....... & ....... & ........ : 0100 0107 0102 2602 0501ืึท0202 00000070 4 02 ................ 0501: 0206 0100 0108 0102ืึท 3302 0401 3 00000080 ... 0206ืึท0100: 0109 0102ื‘ 0 02 0501 0202 1602 00000090 ......".....ืค... 0501ื‘0206: 0100 010 0102ืง 3702 0401 0206 ... 7........ 000000 0. .. 0100ืง010: 0102ื“ 2202 0501ืึท0202 4602 0501 000000 0 0206 ................ 0100ื“010: 0102 3302ืข 0401 0206ื“0100 3 000000 ...... โ€ฆ. ..... 0: 010 0102 0 02 0501 0202 1602 0501 ......%......... 0206: 000000 0 0100 010 0102 6 ..02 . ....& 0401: 0206 0100 010ืง000000 0 0102 1102 ....ืœ......

ื•ื•ื™ ื“ืขืจ ื ืึธืžืขืŸ ืกืึทื’ื“ื–ืฉืขืก, ื“ื™ block_upload_traffic.pcapng ื˜ืขืงืข ื›ึผื•ืœืœ ืึท ื“ืึทืžืคึผ ืคื•ืŸ ื‘ืœืึธืง ื•ืคึผืœืึธืึทื“ ืคืึทืจืงืขืจ ืฆื• ื“ื™ ืคึผืœืง.

ืขืก ืื™ื– ื›ื“ืื™ ืฆื• ื‘ืืžืขืจืงืŸ ืึทื– ื“ืขื ืคืึทืจืงืขืจ ื“ืึทืžืคึผ ืื•ื™ืฃ ื“ื™ ืคืึทืจืžืขืกื˜ ืคึผืœืึทืฅ ื‘ืขืฉืึทืก ื“ื™ ื–ื™ืฆื•ื ื’ ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ื‘ื™ืกืœ ืžืขืจ ืฉื•ื•ืขืจ ืฆื• ื‘ืึทืงื•ืžืขืŸ. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ืฉืจื™ืคื˜ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื˜ืขืงืข ืคึฟืึทืจ TeslaSCADA2. ืคึฟื•ืŸ ืขืก, ืขืก ืื™ื– ืžืขื’ืœืขืš ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ื• ื“ื™ ื“ืึทืžืคึผ ื™ื ืงืจื™ืคึผื˜ื™ื“ ืžื™ื˜ RC4 ืื™ื– ืœื™ื’ืŸ ืื•ืŸ ื•ื•ืึธืก ืฉืœื™ืกืœ ื“ืืจืฃ ืฆื• ื–ื™ื™ืŸ ื’ืขื ื™ืฆื˜ ืฆื• ื“ืขืงืจื™ืคึผื˜ ืขืก. ื“ืึทืžืคึผืก ืคื•ืŸ ื“ืึทื˜ืŸ ื‘ืœืึทืงืก ืื•ื™ืฃ ืคึผืœืึทืฅ ืงืขืŸ ื–ื™ื™ืŸ ื‘ืืงื•ืžืขืŸ ืžื™ื˜ ื“ื™ S7 ืคึผืจืึธื˜ืึธืงืึธืœ ืงืœื™ืขื ื˜. ืคึฟืึทืจ ื“ืขื ืื™ืš ื’ืขื•ื•ื™ื™ื ื˜ ื“ื™ ื“ืขืžืึธ ืงืœื™ืขื ื˜ ืคื•ืŸ ื“ื™ Snap7 ืคึผืขืงืœ.

ืขืงืกื˜ืจืึทืงื˜ื™ื ื’ ืกื™ื’ื ืึทืœ ืคึผืจืึทืกืขืกื™ื ื’ ื‘ืœืึทืงืก ืคื•ืŸ ืึท ืคืึทืจืงืขืจ ื“ืึทืžืคึผ

ืื•ื™ื‘ ืื™ืจ ืงื•ืง ืื™ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื“ืึทืžืคึผ, ืื™ืจ ืงืขื ืขืŸ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ืึทื– ืขืก ื›ึผื•ืœืœ ืกื™ื’ื ืึทืœ ืคึผืจืึทืกืขืกื™ื ื’ ื‘ืœืึทืงืก OB1, FC1, FC2 ืื•ืŸ FC3:

ืื™ืŸ ื“ื™ ืคื•ืกืกื˜ืขืคึผืก ืคื•ืŸ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท: ื•ื•ื™ ืึท ืคึผืœืง ืื™ื– ื’ืขื•ื•ืขืŸ ื›ืึทืงื˜ ื‘ื™ื™ ื“ื™ positive ื›ืึทืง ื˜ืขื’ 9

ื“ื™ ื‘ืœืึทืงืก ืžื•ื–ืŸ ื•ื•ืขืจืŸ ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ. ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ, ืœืžืฉืœ, ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืฉืจื™ืคื˜, ืžื™ื˜ ืคืจื™ืขืจ ืงืึธื ื•ื•ืขืจื˜ืขื“ ื“ื™ ืคืึทืจืงืขืจ ืคื•ืŸ ื“ื™ ืคึผืงืคึผื ื’ ืคึฟืึธืจืžืึทื˜ ืฆื• ืคึผืงืึทืคึผ:

#!/usr/bin/env python2

import struct
from scapy.all import *

packets = rdpcap('block_upload_traffic.pcap')
s7_hdr_struct = '>BBHHHHBB'
s7_hdr_sz = struct.calcsize(s7_hdr_struct)
tpkt_cotp_sz = 7
names = iter(['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin'])
buf = ''

for packet in packets:
    if packet.getlayer(IP).src == '10.0.102.11':
        tpkt_cotp_s7 = str(packet.getlayer(TCP).payload)
        if len(tpkt_cotp_s7) < tpkt_cotp_sz + s7_hdr_sz:
            continue
        s7 = tpkt_cotp_s7[tpkt_cotp_sz:]
        s7_hdr = s7[:s7_hdr_sz]
        param_sz = struct.unpack(s7_hdr_struct, s7_hdr)[4]
        s7_param = s7[12:12+param_sz]
        s7_data = s7[12+param_sz:]
        if s7_param in ('x1ex00', 'x1ex01'):  # upload
            buf += s7_data[4:]
        elif s7_param == 'x1f':
            with open(next(names), 'wb') as f:
                f.write(buf)
            buf = ''

ื•ื•ืขืŸ ืื™ืจ ื”ืึธื˜ ื˜ืขืกื˜ืขื“ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ื‘ืœืึทืงืก, ืื™ืจ ื•ื•ืขื˜ ื‘ืึทืžืขืจืงืŸ ืึทื– ื–ื™ื™ ืฉื˜ืขื ื“ื™ืง ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ื‘ื™ื˜ืขืก 70 70 (ืคึผืคึผ). ืื™ืฆื˜ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœืขืจื ืขืŸ ื•ื•ื™ ืฆื• ืคื•ื ืึทื ื“ืขืจืงืœื™ื™ึทื‘ืŸ ื–ื™ื™. ื“ื™ ืึทืกื™ื™ื ืžืึทื ื˜ ืึธื ืฆื•ื”ืขืจืขื ื™ืฉ ืกืึทื’ื“ื–ืฉืขืกืฅ ืึทื– ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื ื•ืฆืŸ PlcSim ืคึฟืึทืจ ื“ืขื.

ื‘ืึทืงื•ืžืขืŸ ืœื™ื™ื ืขื•ื•ื“ื™ืง ืื™ื ืกื˜ืจื•ืงืฆื™ืขืก ืคื•ืŸ ื‘ืœืึทืงืก

ืขืจืฉื˜ืขืจ, ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคึผืจืึธื’ืจืึทื S7-PlcSim ื“ื•ืจืš ืœืึธื•ื“ื™ื ื’ ืขื˜ืœืขื›ืข ื‘ืœืึทืงืก ืžื™ื˜ ืจื™ืคึผื™ื˜ื™ื ื’ ืื™ื ืกื˜ืจื•ืงืฆื™ืขืก (= Q 0.0) ืื™ืŸ ืขืก ื ื™ืฆืŸ Simatic Manager ื•ื•ื™ื™ื›ื•ื•ืืจื’, ืื•ืŸ ืฉืคึผืึธืจืŸ ื“ื™ PLC ื‘ืืงื•ืžืขืŸ ืื™ืŸ ื“ื™ ืขืžื•ืœืึทื˜ืึธืจ ืฆื• ื“ื™ example.plc ื˜ืขืงืข. ื“ื•ืจืš ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ืขืจ ื˜ืขืงืข, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ื‘ืึทืฉืœื™ืกืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ื™ ื“ืึทื•ื ืœืึธื•ื“ื™ื“ ื‘ืœืึทืงืก ืžื™ื˜ ื“ื™ ื›ืกื™ืžืข 70 70, ื•ื•ืึธืก ืžื™ืจ ื“ื™ืกืงืึทื•ื•ืขืจื“ ืคืจื™ืขืจ. ืื™ื™ื“ืขืจ ื“ื™ ื‘ืœืึทืงืก, ืžืฉืžืขื•ืช, ื“ื™ ื‘ืœืึธืง ื’ืจื™ื™ืก ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ื•ื•ื™ ืึท 4-ื‘ื™ื˜ืข ืงืœื™ื™ืŸ-ืขื ื“ื™ืึทืŸ ื•ื•ืขืจื˜.

ืื™ืŸ ื“ื™ ืคื•ืกืกื˜ืขืคึผืก ืคื•ืŸ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท: ื•ื•ื™ ืึท ืคึผืœืง ืื™ื– ื’ืขื•ื•ืขืŸ ื›ืึทืงื˜ ื‘ื™ื™ ื“ื™ positive ื›ืึทืง ื˜ืขื’ 9

ื ืึธืš ืžื™ืจ ื‘ืืงื•ืžืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ืคึผืœืง ื˜ืขืงืขืก, ื“ื™ ืคืืœื’ืขื ื“ืข ืงืึทืžืฃ ืคึผืœืึทืŸ ืื™ื– ืืจื•ื™ืก ืคึฟืึทืจ ืœื™ื™ืขื ืขืŸ PLC S7 ืžื’ื™ืœื”:

  1. ื ื™ืฆืŸ Simatic Manager, ืžื™ืจ ืžืึทื›ืŸ ืึท ื‘ืœืึธืง ืกื˜ืจื•ืงื˜ื•ืจ ืื™ืŸ S7-PlcSim ืขื ืœืขืš ืฆื• ื“ืขืจ ื•ื•ืึธืก ืžื™ืจ ื‘ืืงื•ืžืขืŸ ืคื•ืŸ ื“ื™ ื“ืึทืžืคึผ. ื“ื™ ื‘ืœืึธืง ืกื™ื–ืขืก ืžื•ื–ืŸ ื’ืœื™ื™ึทื›ืŸ (ื“ืึธืก ืื™ื– ืึทื˜ืฉื™ื•ื•ื“ ื“ื•ืจืš ืคื™ืœื•ื ื’ ื“ื™ ื‘ืœืึทืงืก ืžื™ื˜ ื“ื™ ืคืืจืœืื ื’ื˜ ื ื•ืžืขืจ ืคื•ืŸ ื™ื ืกื˜ืจืึทืงืฉืึทื ื–) ืื•ืŸ ื–ื™ื™ืขืจ ื™ื“ืขื ื˜ื™ืคื™ืขืจืก (OB1, FC1, FC2, FC3).
  2. ื”ื™ื˜ ื“ื™ ืคึผืœืง ืฆื• ืึท ื˜ืขืงืข.
  3. ืžื™ืจ ืคืึทืจื‘ื™ื™ึทื˜ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื‘ืœืึทืงืก ืื™ืŸ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ื˜ืขืงืข ืžื™ื˜ ื“ื™ ื‘ืœืึทืงืก ืคื•ืŸ ื“ื™ ืคืึทืจืงืขืจ ื“ืึทืžืคึผ. ื“ืขืจ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ื™ ื‘ืœืึทืงืก ืื™ื– ื‘ืืฉืœืืกืŸ ื“ื•ืจืš ื“ื™ ื›ืกื™ืžืข.
  4. ืžื™ืจ ืœืึธื“ืŸ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ื˜ืขืงืข ืื™ืŸ S7-PlcSim ืื•ืŸ ืงื•ืง ืื™ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื‘ืœืึทืงืก ืื™ืŸ Simatic Manager.

ื‘ืœืึทืงืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืจื™ืคึผืœื™ื™ืกื˜, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืงืึธื“:

with open('original.plc', 'rb') as f:
    plc = f.read()
blocks = []
for fname in ['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin']:
    with open(fname, 'rb') as f:
        blocks.append(f.read())

i = plc.find(b'pp')
for block in blocks:
    plc = plc[:i] + block + plc[i+len(block):]
    i = plc.find(b'pp', i + 1)

with open('target.plc', 'wb') as f:
    f.write(plc)

ืึทืœืขืงืกื™ื™ ื”ืึธื˜ ื’ืขื ื•ืžืขืŸ ืึท ื˜ืึธืžืขืจ ืฉื•ื•ืขืจืขืจ, โ€‹โ€‹ืึธื‘ืขืจ ื ืึธืš ืจื™ื›ื˜ื™ืงืŸ ื•ื•ืขื’. ืžื™ืจ ื”ืึธื‘ืŸ ืื ื’ืขื ื•ืžืขืŸ ืึทื– ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื“ื™ NetToPlcSim ืคึผืจืึธื’ืจืึทื ืึทื–ื•ื™ ืึทื– PlcSim ืงืขืŸ ื™ื‘ืขืจื’ืขื‘ืŸ ืื™ื‘ืขืจ ื“ื™ ื ืขืฅ, ืฆื•ืคึฟืขืœื™ืงืขืจ ื‘ืœืึทืงืก ืฆื• PlcSim ื“ื•ืจืš Snap7, ืื•ืŸ ื“ืึทืŸ ืืจืืคืงืืคื™ืข ื“ื™ ื‘ืœืึทืงืก ื•ื•ื™ ืึท ืคึผืจื•ื™ืขืงื˜ ืคึฟื•ืŸ PlcSim ื ื™ืฆืŸ ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืกื•ื•ื™ื•ื•ืข.

ื“ื•ืจืš ืขืคืŸ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ื˜ืขืงืข ืื™ืŸ S7-PlcSim, ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ืขื ืขืŸ ื“ื™ ืึธื•ื•ื•ืขืจืจื™ื˜ืึทืŸ ื‘ืœืึทืงืก ืžื™ื˜ ื“ื™ ืกื™ืžืึทื˜ื™ืง ืžืึทื ืึทื’ืขืจ. ื“ื™ ื”ื•ื™ืคึผื˜ ืžื™ื˜ืœ ืงืึธื ื˜ืจืึธืœ ืคืึทื ื’ืงืฉืึทื ื– ื–ืขื ืขืŸ ืจืขืงืึธืจื“ืขื“ ืื™ืŸ ื‘ืœืึธืง FC1. ืคื•ืŸ ื‘ืึทื–ื•ื ื“ืขืจ ื˜ืึธืŸ ืื™ื– ื“ื™ # TEMP0 ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง, ื•ื•ืึธืก ื•ื•ืขืŸ ืขืก ืื™ื– ืื•ื™ืกื’ืขื“ืจื™ื™ื˜ ืื•ื™ืฃ ื“ื™ ืคึผืœืง ืงืึธื ื˜ืจืึธืœ ืฆื• ืžืึทื ื•ืึทืœ ืžืึธื“ืข ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ M2.2 ืื•ืŸ M2.3 ื‘ื™ืกืœ ื–ื›ึผืจื•ืŸ ื•ื•ืึทืœื•ืขืก. ื“ื™ #TEMP0 ื•ื•ืขืจื˜ ืื™ื– ื‘ืึทืฉื˜ื™ืžื˜ ื“ื•ืจืš ืคื•ื ืงืฆื™ืข FC3.

ืื™ืŸ ื“ื™ ืคื•ืกืกื˜ืขืคึผืก ืคื•ืŸ ื™ื ื“ื•ืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท: ื•ื•ื™ ืึท ืคึผืœืง ืื™ื– ื’ืขื•ื•ืขืŸ ื›ืึทืงื˜ ื‘ื™ื™ ื“ื™ positive ื›ืึทืง ื˜ืขื’ 9

ืฆื• ืกืึธืœื•ื•ืข ื“ื™ ืคึผืจืึธื‘ืœืขื, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคื•ื ืึทื ื“ืขืจืงืœื™ื™ึทื‘ืŸ ื“ื™ FC3 ืคื•ื ืงืฆื™ืข ืื•ืŸ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืึธืก ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ืึธืŸ ืึทื–ื•ื™ ืึทื– ืขืก ืงืขืจื˜ ืึท ืœืึทื“ื–ืฉื™ืงืึทืœ.

ื“ื™ PLC ืกื™ื’ื ืึทืœ ืคึผืจืึทืกืขืกื™ื ื’ ื‘ืœืึทืงืก ื‘ื™ื™ ื“ื™ ื ื™ื“ืขืจื™ืง ืกืขืงื•ืจื™ื˜ื™ ืฉื˜ื™ื™ืŸ ืื•ื™ืฃ ื“ื™ ืคืึทืจืžืขืกื˜ ืคึผืœืึทืฅ ื–ืขื ืขืŸ ืขืจื™ื™ื ื“ื–ืฉื“ ืื™ืŸ ืึท ืขื ืœืขืš ื•ื•ืขื’, ืึธื‘ืขืจ ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ # TEMP0 ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง, ืขืก ืื™ื– ื’ืขื ื•ื’ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืฉื•ืจื” ืžื™ื™ืŸ ื ื™ื ื“ื–ืฉืึท ื•ื•ืขื’ ืื™ืŸ ื“ื™ DB1 ื‘ืœืึธืง. ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื“ื™ ื•ื•ืขืจื˜ ืื™ืŸ ืึท ื‘ืœืึธืง ืื™ื– ืคึผืฉื•ื˜ ืื•ืŸ ื”ืื˜ ื ื™ืฉื˜ ื“ืึทืจืคืŸ ื˜ื™ืฃ ื•ื•ื™ืกืŸ ืคื•ืŸ ื“ื™ ื‘ืœืึธืง ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทืš. ื“ืึธืš, ืื•ื™ืฃ ื“ื™ ื”ื•ื™ืš ื–ื™ื›ืขืจื”ื™ื™ื˜ ืžื“ืจื’ื”, ื“ืขืจื’ืจื™ื™ื›ืŸ ืžืึทื ื•ืึทืœ ืงืึธื ื˜ืจืึธืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคื™ืœ ืžืขืจ ืฉื•ื•ืขืจ ืื•ืŸ ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ื™ื ื˜ืจืึทืงืึทืกื™ื– ืคื•ืŸ ื“ื™ STL ืฉืคึผืจืึทืš (ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื•ื•ืขื’ืŸ ืฆื• ืคึผืจืึธื’ืจืึทื ื“ื™ S7 PLC).

ืคืึทืจืงืขืจื˜ ื‘ืœืึธืง FC3

ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ FC3 ื‘ืœืึธืง ืื™ืŸ STL ืคืึทืจื˜ืจืขื˜ื•ื ื’:

      L     B#16#0
      T     #TEMP13
      T     #TEMP15
      L     P#DBX 0.0
      T     #TEMP4
      CLR   
      =     #TEMP14
M015: L     #TEMP4
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D   
      JC    M016
      L     DW#16#0
      T     #TEMP0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  
M00d: L     B [AR1,P#0.0]
      T     #TEMP5
      L     W#16#1
      ==I   
      JC    M007
      L     #TEMP5
      L     W#16#2
      ==I   
      JC    M008
      L     #TEMP5
      L     W#16#3
      ==I   
      JC    M00f
      L     #TEMP5
      L     W#16#4
      ==I   
      JC    M00e
      L     #TEMP5
      L     W#16#5
      ==I   
      JC    M011
      L     #TEMP5
      L     W#16#6
      ==I   
      JC    M012
      JU    M010
M007: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M003
      JU    M001
      JU    M002
      JU    M004
M003: JU    M005
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP0
      JU    M006
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP1
      JU    M006
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP2
      JU    M006
M00f: +AR1  P#1.0
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      T     #TEMP11
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      TAR1  #TEMP4
      OPN   DB   101
      L     P#DBX 0.0
      LAR1  
      L     #TEMP11
      +AR1  
      LAR2  #TEMP9
      L     B [AR2,P#0.0]
      T     B [AR1,P#0.0]
      L     #TEMP4
      LAR1  
      JU    M006
M008: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    M005
M00b: L     #TEMP3
      T     #TEMP0
      JU    M006
M00a: L     #TEMP3
      T     #TEMP1
      JU    M006
M00c: L     #TEMP3
      T     #TEMP2
      JU    M006
M00e: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M011: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M012: L     #TEMP15
      INC   1
      T     #TEMP15
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #TEMP4
      L     B#16#0
      T     #TEMP6
      JU    M006
M014: L     #TEMP4
      LAR1  
      L     #TEMP13
      L     L#1
      +I    
      T     #TEMP13
      JU    M006
M006: L     #TEMP0
      T     MB   100
      L     #TEMP1
      T     MB   101
      L     #TEMP2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    M005
M010: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #TEMP4
M005: TAR1  #TEMP4
      CLR   
      =     #TEMP16
      L     #TEMP13
      L     L#20
      ==I   
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M017
      L     #TEMP13
      L     L#20
      <I    
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M018
      JU    M019
M017: SET   
      =     #TEMP14
      JU    M016
M018: CLR   
      =     #TEMP14
      JU    M016
M019: CLR   
      O     #TEMP14
      =     #RET_VAL
      JU    M015
M016: CLR   
      O     #TEMP14
      =     #RET_VAL

ื“ืขืจ ืงืึธื“ ืื™ื– ื’ืึทื ืฅ ืœืึทื ื’ ืื•ืŸ ืงืขืŸ ื•ื™ืกืงื•ืžืขืŸ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืคึฟืึทืจ ืขืžืขืฆืขืจ ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ STL. ืขืก ืื™ื– ืงื™ื™ืŸ ืคื•ื ื˜ ืื™ืŸ ืึทื ืึทืœื™ื™ื–ื™ื ื’ ื™ืขื“ืขืจ ืœื™ืžืขื“ ืื™ืŸ ื“ื™ ืคืจื™ื™ืžื•ื•ืขืจืง ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ื“ื™ื˜ื™ื™ืœื“ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืื•ืŸ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื“ื™ STL ืฉืคึผืจืึทืš ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ื™ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืžืึทื ื•ืึทืœ: ืกื˜ืึทื˜ืขืžืขื ื˜ ืจืฉื™ืžื” (STL) ืคึฟืึทืจ S7-300 ืื•ืŸ S7-400 ืคึผืจืึธื’ืจืึทืžืžื™ื ื’. ื“ืึธ ืื™ืš ื•ื•ืขื˜ ืคืึธืจืฉื˜ืขืœืŸ ื“ื™ ื–ืขืœื‘ืข ืงืึธื“ ื ืึธืš ืคึผืจืึทืกืขืกื™ื ื’ - ืจื™ื ื™ื™ืžื™ื ื’ ื“ื™ ืœืึทื‘ืขืœืก ืื•ืŸ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื•ืŸ ืึทื“ื™ื ื’ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ื“ื™ืกืงืจื™ื™ื‘ื™ื ื’ ื“ื™ ืึธืคึผืขืจืึทืฆื™ืข ืึทืœื’ืขืจื™ื“ืึทื ืื•ืŸ ืขื˜ืœืขื›ืข STL ืฉืคึผืจืึทืš ืงืึทื ืกื˜ืจืึทืงืฉืึทื ื–. ืœืึธื–ืŸ ืžื™ืจ ืžื™ื“ ื˜ืึธืŸ ืึทื– ื“ืขืจ ื‘ืœืึธืง ืื™ืŸ ืงืฉื™ื ื›ึผื•ืœืœ ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ื•ื•ืึธืก ืขืงืกืึทืงื™ื•ืฅ ืขื˜ืœืขื›ืข ื‘ื™ื™ื˜ืขืงืึธื•ื“ ืื™ืŸ ื“ื™ DB100 ื‘ืœืึธืง, ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื•ื•ืึธืก ืžื™ืจ ื•ื•ื™ืกืŸ. ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืื™ื ืกื˜ืจื•ืงืฆื™ืขืก ืฆื•ื ื•ื™ืคืฉื˜ืขืœื  ื–ื™ืš ืคื•ืŸ 1 ื‘ื™ื™ื˜ ืคื•ืŸ ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืงืึธื“ ืื•ืŸ ื‘ื™ื˜ืขืก ืคื•ืŸ ืึทืจื’ื•ืžืขื ื˜ืŸ, ืื™ื™ืŸ ื‘ื™ื™ื˜ ืคึฟืึทืจ ื™ืขื“ืขืจ ืึทืจื’ื•ืžืขื ื˜. ืึทืœืข ื‘ืึทื˜ืจืึทื›ื˜ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ื”ืึธื‘ืŸ ืฆื•ื•ื™ื™ ืึทืจื’ื•ืžืขื ื˜ืŸ ืื™ืš ื“ืขื–ื™ื’ื ื™ื™ื˜ื™ื“ ื–ื™ื™ืขืจ ื•ื•ืึทืœื•ืขืก ืื™ืŸ ื“ื™ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ื•ื•ื™ X ืื•ืŸ Y.

ืงืึธื“ ื ืึธืš ืคึผืจืึทืกืขืกื™ื ื’]

# ะ˜ะฝะธั†ะธะฐะปะธะทะฐั†ะธั ั€ะฐะทะปะธั‡ะฝั‹ั… ะฟะตั€ะตะผะตะฝะฝั‹ั…
      L     B#16#0
      T     #CHECK_N        # ะกั‡ะตั‚ั‡ะธะบ ัƒัะฟะตัˆะฝะพ ะฟั€ะพะนะดะตะฝะฝั‹ั… ะฟั€ะพะฒะตั€ะพะบ
      T     #COUNTER_N      # ะกั‡ะตั‚ั‡ะธะบ ะพะฑั‰ะตะณะพ ะบะพะปะธั‡ะตัั‚ะฒะฐ ะฟั€ะพะฒะตั€ะพะบ
      L     P#DBX 0.0
      T     #POINTER        # ะฃะบะฐะทะฐั‚ะตะปัŒ ะฝะฐ ั‚ะตะบัƒั‰ัƒัŽ ะธะฝัั‚ั€ัƒะบั†ะธัŽ
      CLR   
      =     #PRE_RET_VAL

# ะžัะฝะพะฒะฝะพะน ั†ะธะบะป ั€ะฐะฑะพั‚ั‹ ะธะฝั‚ะตั€ะฟั€ะตั‚ะฐั‚ะพั€ะฐ ะฑะฐะนั‚-ะบะพะดะฐ
LOOP: L     #POINTER
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D                   # ะŸั€ะพะฒะตั€ะบะฐ ะฒั‹ั…ะพะดะฐ ัƒะบะฐะทะฐั‚ะตะปั ะทะฐ ะฟั€ะตะดะตะปั‹ ะฟั€ะพะณั€ะฐะผะผั‹
      JC    FINISH
      L     DW#16#0
      T     #REG0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  

# ะšะพะฝัั‚ั€ัƒะบั†ะธั switch - case ะดะปั ะพะฑั€ะฐะฑะพั‚ะบะธ ั€ะฐะทะปะธั‡ะฝั‹ั… ะพะฟะบะพะดะพะฒ
M00d: L     B [AR1,P#0.0]
      T     #OPCODE
      L     W#16#1
      ==I   
      JC    OPCODE_1
      L     #OPCODE
      L     W#16#2
      ==I   
      JC    OPCODE_2
      L     #OPCODE
      L     W#16#3
      ==I   
      JC    OPCODE_3
      L     #OPCODE
      L     W#16#4
      ==I   
      JC    OPCODE_4
      L     #OPCODE
      L     W#16#5
      ==I   
      JC    OPCODE_5
      L     #OPCODE
      L     W#16#6
      ==I   
      JC    OPCODE_6
      JU    OPCODE_OTHER

# ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ะพะฟะบะพะดะฐ 01: ะทะฐะณั€ัƒะทะบะฐ ะทะฝะฐั‡ะตะฝะธั ะธะท DB101[X] ะฒ ั€ะตะณะธัั‚ั€ Y
# OP01(X, Y): REG[Y] = DB101[X]
OPCODE_1: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]   # ะ—ะฐะณั€ัƒะทะบะฐ ะฐั€ะณัƒะผะตะฝั‚ะฐ X (ะธะฝะดะตะบั ะฒ DB101)
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]   # ะ—ะฐะณั€ัƒะทะบะฐ ะฐั€ะณัƒะผะตะฝั‚ะฐ Y (ะธะฝะดะตะบั ั€ะตะณะธัั‚ั€ะฐ)
      JL    M003            # ะะฝะฐะปะพะณ switch - case ะฝะฐ ะพัะฝะพะฒะต ะทะฝะฐั‡ะตะฝะธั Y
      JU    M001            # ะดะปั ะฒั‹ะฑะพั€ะฐ ะฝะตะพะฑั…ะพะดะธะผะพะณะพ ั€ะตะณะธัั‚ั€ะฐ ะดะปั ะทะฐะฟะธัะธ.
      JU    M002            # ะŸะพะดะพะฑะฝั‹ะต ะบะพะฝัั‚ั€ัƒะบั†ะธะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั ะธ ะฒ ะดั€ัƒะณะธั…
      JU    M004            # ะพะฟะตั€ะฐั†ะธัั… ะฝะธะถะต ะดะปั ะฐะฝะฐะปะพะณะธั‡ะฝั‹ั… ั†ะตะปะตะน
M003: JU    LOOPEND
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG0           # ะ—ะฐะฟะธััŒ ะทะฝะฐั‡ะตะฝะธั DB101[X] ะฒ REG[0]
      JU    PRE_LOOPEND
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG1           # ะ—ะฐะฟะธััŒ ะทะฝะฐั‡ะตะฝะธั DB101[X] ะฒ REG[1]
      JU    PRE_LOOPEND
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG2           # ะ—ะฐะฟะธััŒ ะทะฝะฐั‡ะตะฝะธั DB101[X] ะฒ REG[2]
      JU    PRE_LOOPEND

# ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ะพะฟะบะพะดะฐ 02: ะทะฐะณั€ัƒะทะบะฐ ะทะฝะฐั‡ะตะฝะธั X ะฒ ั€ะตะณะธัั‚ั€ Y
# OP02(X, Y): REG[Y] = X
OPCODE_2: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    LOOPEND
M00b: L     #TEMP3
      T     #REG0
      JU    PRE_LOOPEND
M00a: L     #TEMP3
      T     #REG1
      JU    PRE_LOOPEND
M00c: L     #TEMP3
      T     #REG2
      JU    PRE_LOOPEND

# ะžะฟะบะพะด 03 ะฝะต ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒ ะฟั€ะพะณั€ะฐะผะผะต, ะฟะพัั‚ะพะผัƒ ะฟั€ะพะฟัƒัั‚ะธะผ ะตะณะพ
...

# ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ะพะฟะบะพะดะฐ 04: ัั€ะฐะฒะฝะตะฝะธะต ั€ะตะณะธัั‚ั€ะพะฒ X ะธ Y
# OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
OPCODE_4: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          # ะฟะตั€ะฒั‹ะน ะฐั€ะณัƒะผะตะฝั‚ - X
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[X]
      LAR2  #TEMP10         # REG[Y]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12         # ~(REG[Y] & REG[X])
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW                    # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - ะฐะฝะฐะปะพะณ ะฟั€ะพะฒะตั€ะบะธ ะฝะฐ ั€ะฐะฒะตะฝัั‚ะฒะพ
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ะพะฟะบะพะดะฐ 05: ะฒั‹ั‡ะธั‚ะฐะฝะธะต ั€ะตะณะธัั‚ั€ะฐ Y ะธะท X
# OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
OPCODE_5: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I                    # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ะพะฟะบะพะดะฐ 06: ะธะฝะบั€ะตะผะตะฝั‚ #CHECK_N ะฟั€ะธ ั€ะฐะฒะตะฝัั‚ะฒะต ั€ะตะณะธัั‚ั€ะพะฒ X ะธ Y
# OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
OPCODE_6: L     #COUNTER_N
      INC   1
      T     #COUNTER_N
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          #  REG[X]     
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          #  REG[X]  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[Y]
      LAR2  #TEMP10         # REG[X]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #POINTER
      L     B#16#0
      T     #TEMP6
      JU    PRE_LOOPEND
M014: L     #POINTER
      LAR1  
# ะ˜ะฝะบั€ะตะผะตะฝั‚ ะทะฝะฐั‡ะตะฝะธั #CHECK_N
      L     #CHECK_N
      L     L#1
      +I    
      T     #CHECK_N
      JU    PRE_LOOPEND

PRE_LOOPEND: L     #REG0
      T     MB   100
      L     #REG1
      T     MB   101
      L     #REG2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    LOOPEND

OPCODE_OTHER: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #POINTER

LOOPEND: TAR1  #POINTER
      CLR   
      =     #TEMP16
      L     #CHECK_N
      L     L#20
      ==I   
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
# ะ’ัะต ะฟั€ะพะฒะตั€ะบะธ ะฟั€ะพะนะดะตะฝั‹, ะตัะปะธ #CHECK_N == #COUNTER_N == 20
      JC    GOOD
      L     #CHECK_N
      L     L#20
      <I    
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
      JC    FAIL
      JU    M019
GOOD: SET   
      =     #PRE_RET_VAL
      JU    FINISH
FAIL: CLR   
      =     #PRE_RET_VAL
      JU    FINISH
M019: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL
      JU    LOOP
FINISH: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL

ื•ื•ืขืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืึท ื’ืขื“ืึทื ืง ืคื•ืŸ ื“ื™ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ื™ื ืกื˜ืจืึทืงืฉืึทื ื–, ืœืึธื–ืŸ ืื•ื ื“ื– ืฉืจื™ื™ึทื‘ืŸ ืึท ืงืœื™ื™ืŸ ื“ื™ืกืึทืกืขืžื‘ืœืขืจ ืฆื• ืคึผืึทืจืก ื“ื™ ื‘ื™ื˜ืขืงืึธื“ืข ืื™ืŸ ื“ื™ DB100 ื‘ืœืึธืง:

import string
alph = string.ascii_letters + string.digits

with open('DB100.bin', 'rb') as f:
    m = f.read()

pc = 0

while pc < len(m):
    op = m[pc]
    if op == 1:
        print('R{} = DB101[{}]'.format(m[pc + 2], m[pc + 1]))
        pc += 3
    elif op == 2:
        c = chr(m[pc + 1])
        c = c if c in alph else '?'
        print('R{} = {:02x} ({})'.format(m[pc + 2], m[pc + 1], c))
        pc += 3
    elif op == 4:
        print('R0 = 0; R{} = (R{} == R{})'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 5:
        print('R0 = 0; R{} = R{} - R{}'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 6:
        print('CHECK (R{} == R{})n'.format(
            m[pc + 1], m[pc + 2]))
        pc += 3
    else:
        print('unk opcode {}'.format(op))
        break

ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืงืึธื“:

ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืงืึธื“

R1 = DB101[0]
R2 = 6e (n)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[1]
R2 = 10 (?)
R0 = 0; R1 = R1 - R2
R2 = 20 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[2]
R2 = 77 (w)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[3]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[4]
R2 = 75 (u)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[5]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[6]
R2 = 34 (4)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[7]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[8]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[9]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[10]
R2 = 37 (7)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[11]
R2 = 22 (?)
R0 = 0; R1 = R1 - R2
R2 = 46 (F)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[12]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[13]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[14]
R2 = 6d (m)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[15]
R2 = 11 (?)
R0 = 0; R1 = R1 - R2
R2 = 23 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[16]
R2 = 35 (5)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[17]
R2 = 12 (?)
R0 = 0; R1 = R1 - R2
R2 = 25 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[18]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[19]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ื“ืขื ืคึผืจืึธื’ืจืึทื ืคืฉื•ื˜ ื˜ืฉืขืง ื™ืขื“ืขืจ ื›ืึทืจืึทืงื˜ืขืจ ืคึฟื•ืŸ DB101 ืคึฟืึทืจ ื™ืงื•ื•ืึทืœืึทื˜ื™ ืฆื• ืึท ื–ื™ื›ืขืจ ื•ื•ืขืจื˜. ื“ื™ ืœืขืฆื˜ ืฉื•ืจื” ืคึฟืึทืจ ื“ื•ืจื›ื’ื™ื™ืŸ ืึทืœืข ื˜ืฉืขืงืก ืื™ื–: n0w u 4r3 7h3 m4573r. ืื•ื™ื‘ ื“ื™ ืฉื•ืจื” ืื™ื– ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื‘ืœืึธืง DB101, ืžืึทื ื•ืึทืœ ืคึผืœืง ืงืึธื ื˜ืจืึธืœ ืื™ื– ืึทืงื˜ื™ื•ื•ื™ื™ื˜ื™ื“ ืื•ืŸ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืžืขื’ืœืขืš ืฆื• ื•ืคืจื™ื™ึทืกืŸ ืึธื“ืขืจ ื“ืขืคืœื™ื™ื˜ ื“ื™ ื‘ืึทืœืึธืŸ.โ€จ

ืึทื– ืก ืึทืœืข! ืึทืœืขืงืกื™ื™ ื“ืขืžืึทื ืกื˜ืจื™ื™ื˜ื™ื“ ืึท ื”ื•ื™ืš ืžื“ืจื’ื” ืคื•ืŸ ื•ื•ื™ืกืŸ ื•ื•ืขืจื˜ ืคื•ืŸ ืึทืŸ ื™ื ื“ืึทืกื˜ืจื™ืึทืœ ื ื™ื ื“ื–ืฉืึท :) ืžื™ืจ ื’ืขืฉื™ืงื˜ ืžืขืžืขืจืึทื‘ืึทืœ ืคึผืจื™ื™ื–ืึทื– ืฆื• ื“ื™ ื’ืขื•ื•ื™ื ืขืจ. ืคื™ืœืข ื“ืึทื ืง ืฆื• ืึทืœืข ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ!

ืžืงื•ืจ: www.habr.com

ืงื•ื™ืคืŸ ืคืึทืจืœืึธื–ืœืขืš ื”ืึธืกื˜ื™ื ื’ ืคึฟืึทืจ ื–ื™ื™ื˜ืœืขืš ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก ๐Ÿ”ฅ ืงื•ื™ืคื˜ ืคืึทืจืœืขืกืœืขื›ืข ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ื”ืึธืกื˜ื™ื ื’ ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก | ProHoster